OSDN Git Service

Change IllegalAccess/IncompatibleClassChange order.
authorNicolas Geoffray <ngeoffray@google.com>
Fri, 2 Oct 2015 16:14:53 +0000 (17:14 +0100)
committerNicolas Geoffray <ngeoffray@google.com>
Fri, 2 Oct 2015 16:14:53 +0000 (17:14 +0100)
This is to have the same order as ClassLinker::ResolveMethod. In
a JIT environment, hitting the dex cache would not make it to the
expected IllegalAccessError and we would throw the wrong exception.

Change-Id: Ifc70f1a93260a24e952fa7a659be1be5bdc666de

runtime/entrypoints/entrypoint_utils-inl.h

index 8ae0b07..f66628d 100644 (file)
@@ -411,12 +411,6 @@ inline ArtMethod* FindMethodFromCode(uint32_t method_idx, mirror::Object** this_
     ThrowNullPointerExceptionForMethodAccess(method_idx, type);
     return nullptr;  // Failure.
   } else if (access_check) {
-    // Incompatible class change should have been handled in resolve method.
-    if (UNLIKELY(resolved_method->CheckIncompatibleClassChange(type))) {
-      ThrowIncompatibleClassChangeError(type, resolved_method->GetInvokeType(), resolved_method,
-                                        referrer);
-      return nullptr;  // Failure.
-    }
     mirror::Class* methods_class = resolved_method->GetDeclaringClass();
     mirror::Class* referring_class = referrer->GetDeclaringClass();
     bool can_access_resolved_method =
@@ -426,6 +420,12 @@ inline ArtMethod* FindMethodFromCode(uint32_t method_idx, mirror::Object** this_
       DCHECK(self->IsExceptionPending());  // Throw exception and unwind.
       return nullptr;  // Failure.
     }
+    // Incompatible class change should have been handled in resolve method.
+    if (UNLIKELY(resolved_method->CheckIncompatibleClassChange(type))) {
+      ThrowIncompatibleClassChangeError(type, resolved_method->GetInvokeType(), resolved_method,
+                                        referrer);
+      return nullptr;  // Failure.
+    }
   }
   switch (type) {
     case kStatic: