Add support for oat_process for use as a wrap.* launcher

Add test support for running Calculator

Change-Id: I7ec0681febe6f6c836452e8afb4c12a2ebfa0ea8
diff --git a/src/java_lang_Class.cc b/src/java_lang_Class.cc
index ec0b0ed..c334f04 100644
--- a/src/java_lang_Class.cc
+++ b/src/java_lang_Class.cc
@@ -227,13 +227,6 @@
   return c->IsPrimitive();
 }
 
-bool CheckClassAccess(const Class* access_from, const Class* klass) {
-  if (klass->IsPublic()) {
-    return true;
-  }
-  return access_from->IsInSamePackage(klass);
-}
-
 // Validate method/field access.
 bool CheckMemberAccess(const Class* access_from, const Class* access_to, uint32_t member_flags) {
   // quick accept for public access */
@@ -293,7 +286,7 @@
   Method* caller_caller = frame.GetMethod();
   Class* caller_class = caller_caller->GetDeclaringClass();
 
-  if (!CheckClassAccess(c, caller_class)) {
+  if (!caller_class->CanAccess(c)) {
     Thread::Current()->ThrowNewException("Ljava/lang/IllegalAccessException;",
                                          "Class %s is not accessible from class %s",
                                          PrettyDescriptor(c->GetDescriptor()).c_str(),
diff --git a/src/thread.cc b/src/thread.cc
index 22495be..8005072 100644
--- a/src/thread.cc
+++ b/src/thread.cc
@@ -301,7 +301,7 @@
   obj->MonitorEnter(thread);
   DCHECK(thread->HoldsLock(obj));
   // Only possible exception is NPE and is handled before entry
-  DCHECK(thread->GetException() == NULL);
+  DCHECK(!thread->IsExceptionPending());
 }
 
 extern "C" void artCheckSuspendFromCode(Thread* thread) {
@@ -358,10 +358,14 @@
   Method* interface_method = class_linker->ResolveMethod(method_idx, caller_method, false);
   if (interface_method == NULL) {
     // Could not resolve interface method. Throw error and unwind
-    CHECK(thread->GetException() != NULL);
+    CHECK(thread->IsExceptionPending());
     return 0;
   }
   Method* method = this_object->GetClass()->FindVirtualMethodForInterface(interface_method);
+  if (method == NULL) {
+    CHECK(thread->IsExceptionPending());
+    return 0;
+  }
   const void* code = method->GetCode();
 
   uint32_t method_uint = reinterpret_cast<uint32_t>(method);
@@ -1372,6 +1376,7 @@
   CHECK(exception_class != NULL) << "descriptor=\"" << descriptor << "\"";
   int rc = env->ThrowNew(exception_class, msg.c_str());
   CHECK_EQ(rc, JNI_OK);
+  env->DeleteLocalRef(exception_class);
 }
 
 void Thread::ThrowOutOfMemoryError() {