Move finalizer registration into managed code

Also move Object.getClass into managed code.

Change-Id: If32674ac496116aaa82c461d8e6196e27fa7b591
diff --git a/src/compiler/codegen/arm/MethodCodegenDriver.cc b/src/compiler/codegen/arm/MethodCodegenDriver.cc
index eb2c06b..cbf5867 100644
--- a/src/compiler/codegen/arm/MethodCodegenDriver.cc
+++ b/src/compiler/codegen/arm/MethodCodegenDriver.cc
@@ -780,22 +780,6 @@
     oatLockCallTemps(cUnit);
 
     uint32_t dexMethodIdx = mir->dalvikInsn.vB;
-    // Is this the special "Ljava/lang/Object;.<init>:()V" case?
-    if (direct && !range) {
-        Method* target = cUnit->dex_cache->GetResolvedMethods()->Get(dexMethodIdx);
-        if (target) {
-            if (PrettyMethod(target) == "java.lang.Object.<init>()V") {
-                RegLocation rlArg = oatGetSrc(cUnit, mir, 0);
-                loadValueDirectFixed(cUnit, rlArg, r0);
-                loadWordDisp(cUnit, rSELF,
-                         OFFSETOF_MEMBER(Thread, pObjectInit), rLR);
-                genNullCheck(cUnit, oatSSASrc(mir,0), r0, mir);
-                opReg(cUnit, kOpBlx, rLR);
-                oatClobberCalleeSave(cUnit);
-                return;
-            }
-        }
-    }
 
     if (range) {
         callState = genDalvikArgsRange(cUnit, mir, dInsn, callState, pNullCk,
diff --git a/src/java_lang_Object.cc b/src/java_lang_Object.cc
index 30d8223..7c72604 100644
--- a/src/java_lang_Object.cc
+++ b/src/java_lang_Object.cc
@@ -23,12 +23,6 @@
 
 namespace {
 
-jclass Object_getClass(JNIEnv* env, jobject javaThis) {
-  // TODO: we can just share the Object::class_ field with Java and use field access instead.
-  Object* o = Decode<Object*>(env, javaThis);
-  return AddLocalReference<jclass>(env, o->GetClass());
-}
-
 jobject Object_internalClone(JNIEnv* env, jobject javaThis) {
   ScopedThreadStateChange tsc(Thread::Current(), Thread::kRunnable);
   Object* o = Decode<Object*>(env, javaThis);
@@ -51,7 +45,6 @@
 }
 
 JNINativeMethod gMethods[] = {
-  NATIVE_METHOD(Object, getClass, "()Ljava/lang/Class;"),
   NATIVE_METHOD(Object, internalClone, "(Ljava/lang/Cloneable;)Ljava/lang/Object;"),
   NATIVE_METHOD(Object, notify, "()V"),
   NATIVE_METHOD(Object, notifyAll, "()V"),
diff --git a/src/jni_internal_test.cc b/src/jni_internal_test.cc
index d492deb..ee801be 100644
--- a/src/jni_internal_test.cc
+++ b/src/jni_internal_test.cc
@@ -313,7 +313,7 @@
 
   // Check that registering native methods is successful
   {
-    JNINativeMethod methods[] = {{"getClass", "()Ljava/lang/Class;", reinterpret_cast<void*>(BogusMethod)}};
+    JNINativeMethod methods[] = {{"notify", "()V", reinterpret_cast<void*>(BogusMethod)}};
     env_->RegisterNatives(jlobject, methods, 1);
   }
   EXPECT_FALSE(env_->ExceptionCheck());
diff --git a/src/runtime_support.cc b/src/runtime_support.cc
index 1ac92fd..14b14e0 100644
--- a/src/runtime_support.cc
+++ b/src/runtime_support.cc
@@ -119,20 +119,6 @@
   LOG(INFO) << "Info: " << info;
 }
 
-extern "C" uint32_t artObjectInitFromCode(Object* o, Thread* self, Method** sp) {
-  FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
-  Class* c = o->GetClass();
-  if (UNLIKELY(c->IsFinalizable())) {
-    Heap::AddFinalizerReference(self, o);
-  }
-  /*
-   * NOTE: once debugger/profiler support is added, we'll need to check
-   * here and branch to actual compiled object.<init> to handle any
-   * breakpoint/logging activities if either is active.
-   */
-  return self->IsExceptionPending() ? -1 : 0;
-}
-
 // Return value helper for jobject return types
 extern Object* DecodeJObjectInThread(Thread* thread, jobject obj) {
   if (thread->IsExceptionPending()) {
diff --git a/src/runtime_support.h b/src/runtime_support.h
index c8db48c..954c362 100644
--- a/src/runtime_support.h
+++ b/src/runtime_support.h
@@ -74,7 +74,6 @@
   extern "C" void art_invoke_super_trampoline_with_access_check(uint32_t, void*);
   extern "C" void art_invoke_virtual_trampoline_with_access_check(uint32_t, void*);
   extern "C" void art_lock_object_from_code(void*);
-  extern "C" void art_object_init_from_code(void*);
   extern "C" void art_test_suspend();
   extern "C" void art_throw_array_bounds_from_code(int32_t index, int32_t limit);
   extern "C" void art_throw_div_zero_from_code();
diff --git a/src/runtime_support_arm.S b/src/runtime_support_arm.S
index 8113b5b..7456853 100644
--- a/src/runtime_support_arm.S
+++ b/src/runtime_support_arm.S
@@ -609,23 +609,6 @@
     bxne   lr                         @ return on success
     DELIVER_PENDING_EXCEPTION
 
-    .global art_object_init_from_code
-    .extern artObjectInitFromCode
-    /*
-     * Entry from managed code to perform Object.<init> string. R0 holds the object to initialize.
-     * On success, 0 is returned. Otherwise there is a pending exception to deliver.
-     */
-art_object_init_from_code:
-    SETUP_REF_ONLY_CALLEE_SAVE_FRAME  @ save callee saves in case of GC
-    mov    r1, r9                     @ pass Thread::Current
-    mov    r2, sp                     @ pass SP
-    @ artObjectInitFromCode(Object* o, Thread*, SP)
-    bl     artObjectInitFromCode
-    RESTORE_REF_ONLY_CALLEE_SAVE_FRAME
-    cmp    r0, #0                     @ success if result is zero
-    bxeq   lr                         @ return on success
-    DELIVER_PENDING_EXCEPTION
-
     .global art_alloc_object_from_code
     .extern artAllocObjectFromCode
     /*
diff --git a/src/thread.cc b/src/thread.cc
index 8592bd3..67702cd 100644
--- a/src/thread.cc
+++ b/src/thread.cc
@@ -120,7 +120,6 @@
   pInvokeSuperTrampolineWithAccessCheck = art_invoke_super_trampoline_with_access_check;
   pInvokeVirtualTrampolineWithAccessCheck = art_invoke_virtual_trampoline_with_access_check;
   pLockObjectFromCode = art_lock_object_from_code;
-  pObjectInit = art_object_init_from_code;
   pResolveStringFromCode = art_resolve_string_from_code;
   pSet32Instance = art_set32_instance_from_code;
   pSet64Instance = art_set64_instance_from_code;
diff --git a/src/thread.h b/src/thread.h
index b21af96..4bfc5cf 100644
--- a/src/thread.h
+++ b/src/thread.h
@@ -624,7 +624,6 @@
   void* (*pInitializeTypeFromCode)(uint32_t, void*);
   void* (*pInitializeTypeAndVerifyAccessFromCode)(uint32_t, void*);
   void (*pLockObjectFromCode)(void*);
-  void (*pObjectInit)(void*);
   void* (*pResolveMethodFromCode)(void*, uint32_t, bool);
   void* (*pResolveStringFromCode)(void*, uint32_t);
   int (*pSet32Instance)(uint32_t, void*, int32_t);  // field_idx, obj, src