Revert "Revert "Fix issue with proxy invocation on default methods""

This reverts commit daf58c80d42f024aae0cb94ebd2c0bd61ebbf240.

Bug: 27621360
Change-Id: I56fccf19ae80451be4c316ba14911c667cbe9e47
diff --git a/runtime/class_linker.cc b/runtime/class_linker.cc
index 3c69323..d0a784d 100644
--- a/runtime/class_linker.cc
+++ b/runtime/class_linker.cc
@@ -4265,10 +4265,18 @@
   DCHECK(out != nullptr);
   out->CopyFrom(prototype, image_pointer_size_);
 
-  // Set class to be the concrete proxy class and clear the abstract flag, modify exceptions to
-  // the intersection of throw exceptions as defined in Proxy
+  // Set class to be the concrete proxy class.
   out->SetDeclaringClass(klass.Get());
-  out->SetAccessFlags((out->GetAccessFlags() & ~kAccAbstract) | kAccFinal);
+  // Clear the abstract, default and conflict flags to ensure that defaults aren't picked in
+  // preference to the invocation handler.
+  const uint32_t kRemoveFlags = kAccAbstract | kAccDefault | kAccDefaultConflict;
+  // Make the method final.
+  const uint32_t kAddFlags = kAccFinal;
+  out->SetAccessFlags((out->GetAccessFlags() & ~kRemoveFlags) | kAddFlags);
+
+  // Clear the dex_code_item_offset_. It needs to be 0 since proxy methods have no CodeItems but the
+  // method they copy might (if it's a default method).
+  out->SetCodeItemOffset(0);
 
   // At runtime the method looks like a reference and argument saving method, clone the code
   // related parameters from this method.
diff --git a/runtime/entrypoints/quick/quick_trampoline_entrypoints.cc b/runtime/entrypoints/quick/quick_trampoline_entrypoints.cc
index 24986253..7005aa5 100644
--- a/runtime/entrypoints/quick/quick_trampoline_entrypoints.cc
+++ b/runtime/entrypoints/quick/quick_trampoline_entrypoints.cc
@@ -653,13 +653,13 @@
   JValue tmp_value;
   ShadowFrame* deopt_frame = self->PopStackedShadowFrame(
       StackedShadowFrameType::kSingleFrameDeoptimizationShadowFrame, false);
-  const DexFile::CodeItem* code_item = method->GetCodeItem();
-  DCHECK(code_item != nullptr) << PrettyMethod(method);
   ManagedStack fragment;
 
   DCHECK(!method->IsNative()) << PrettyMethod(method);
   uint32_t shorty_len = 0;
-  auto* non_proxy_method = method->GetInterfaceMethodIfProxy(sizeof(void*));
+  ArtMethod* non_proxy_method = method->GetInterfaceMethodIfProxy(sizeof(void*));
+  const DexFile::CodeItem* code_item = non_proxy_method->GetCodeItem();
+  DCHECK(code_item != nullptr) << PrettyMethod(method);
   const char* shorty = non_proxy_method->GetShorty(&shorty_len);
 
   JValue result;