Don't run managed code until the runtime has started.

Previously we ended up running managed code because JNI was
triggering class initializers to run. This was triggered by
both Thread::CreatePeer() and InitBoxingMethods().

When these initializers were prevented from running, other
code broke:
 - Creating the peer for the main thread was relying on
   ThreadGroup.<clinit> to assign the built-in thread groups.
 - Creating the boxed methods caused class initialization of
   the primitive wrapper classes; these need to be initialized
   before Thread.<clinit> is run to avoid a crash in its own
   initializer.

This change works around those breaks by splitting thread peer
creation into two parts (allocation and running <init>) and
by calling InitBoxingMethods() during runtime start.

Change-Id: I44be7170ce08451adf876ee73cba0f1f66d5a59e
diff --git a/src/object.cc b/src/object.cc
index 50a2117..27cbb41 100644
--- a/src/object.cc
+++ b/src/object.cc
@@ -736,7 +736,7 @@
   have_executable_code = IsNative();
 #endif
 
-  if (have_executable_code && stub != NULL) {
+  if (Runtime::Current()->IsStarted() && have_executable_code && stub != NULL) {
     bool log = false;
     if (log) {
       LOG(INFO) << "invoking " << PrettyMethod(this) << " code=" << (void*) GetCode() << " stub=" << (void*) stub;
@@ -746,9 +746,8 @@
       LOG(INFO) << "returned " << PrettyMethod(this) << " code=" << (void*) GetCode() << " stub=" << (void*) stub;
     }
   } else {
-    if (Runtime::Current()->IsStarted()) {
-      LOG(WARNING) << "Not invoking method with no associated code: " << PrettyMethod(this);
-    }
+    LOG(INFO) << "not invoking " << PrettyMethod(this) << " code=" << (void*) GetCode() << " stub=" << (void*) stub
+        << " started=" << Runtime::Current()->IsStarted();
     if (result != NULL) {
       result->j = 0;
     }
@@ -795,7 +794,8 @@
 Object* Class::AllocObject() {
   DCHECK(!IsArrayClass()) << PrettyClass(this);
   DCHECK(IsInstantiable()) << PrettyClass(this);
-  DCHECK(!Runtime::Current()->IsStarted() || IsInitializing()) << PrettyClass(this);
+  // TODO: decide whether we want this check. It currently fails during bootstrap.
+  // DCHECK(!Runtime::Current()->IsStarted() || IsInitializing()) << PrettyClass(this);
   DCHECK_GE(this->object_size_, sizeof(Object));
   return Heap::AllocObject(this, this->object_size_);
 }