Looks good with a few comments<br><br><div class="gmail_quote">On Thu, Oct 27, 2011 at 3:37 AM, Will Dietz <span dir="ltr"><<a href="mailto:wdietz2@illinois.edu">wdietz2@illinois.edu</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
Inlined below.<br>
<br>
Apologies for the long patch, didn't see a particularly useful way to<br>
break it up (without breaking the build terribly).  If this is just<br>
too much, I can revisit that of course.<br>
<br>
In short, drops the classpath-specific fields/etc, replacing them with<br>
OpenJDK ones as was useful.  Also updated the various signatures,<br>
since they're often different in the OpenJDK versions.<br>
<br>
I stash the JavaThread in the 'eetop' field (since no vmdata), idea<br>
for this was taken from how jamvm does it, for what it's worth.<br>
<br>
The TODO about how to map ClassLoaders will be resolved in a future<br>
patch (and after some discussion :)).<br>
<br>
Thanks!<br>
<br>
~Will<br>
<br>
>From 5d7b01ef5347928b619498007c6b677fd8ca9a8b Mon Sep 17 00:00:00 2001<br>
From: Will Dietz <<a href="mailto:w@wdtz.org">w@wdtz.org</a>><br>
Date: Wed, 26 Oct 2011 20:21:37 -0500<br>
Subject: [PATCH] OpenJDK JavaUpcalls revamp<br>
<br>
---<br>
 lib/J3/ClassLib/OpenJDK/JavaUpcalls.cpp |  372 +++++++++----------------------<br>
 lib/J3/ClassLib/OpenJDK/JavaUpcalls.h   |   29 +--<br>
 2 files changed, 122 insertions(+), 279 deletions(-)<br>
<br>
diff --git a/lib/J3/ClassLib/OpenJDK/JavaUpcalls.cpp<br>
b/lib/J3/ClassLib/OpenJDK/JavaUpcalls.cpp<br>
index 6b68703..fe3ba01 100644<br>
--- a/lib/J3/ClassLib/OpenJDK/JavaUpcalls.cpp<br>
+++ b/lib/J3/ClassLib/OpenJDK/JavaUpcalls.cpp<br>
@@ -33,33 +33,30 @@<br>
 using namespace j3;<br>
<br>
 Class*      Classpath::newThread;<br>
-Class*      Classpath::newVMThread;<br>
-JavaField*  Classpath::assocThread;<br>
-JavaField*  Classpath::vmdataVMThread;<br>
-JavaMethod* Classpath::finaliseCreateInitialThread;<br>
-JavaMethod* Classpath::initVMThread;<br>
 JavaMethod* Classpath::initThread;<br>
+JavaMethod* Classpath::runThread;<br>
+JavaMethod* Classpath::finaliseCreateInitialThread;<br>
 JavaMethod* Classpath::groupAddThread;<br>
-JavaField*  Classpath::threadName;<br>
 JavaField*  Classpath::groupName;<br>
 JavaMethod* Classpath::initGroup;<br>
+JavaMethod* Classpath::initNamedGroup;<br>
 JavaField*  Classpath::priority;<br>
 JavaField*  Classpath::daemon;<br>
+JavaField*  Classpath::eetop;<br></blockquote><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
+JavaField*  Classpath::threadStatus;<br>
 JavaField*  Classpath::group;<br>
-JavaField*  Classpath::running;<br>
 Class*      Classpath::threadGroup;<br>
-JavaField*  Classpath::rootGroup;<br>
-JavaField*  Classpath::vmThread;<br>
 JavaMethod* Classpath::getUncaughtExceptionHandler;<br>
 JavaMethod* Classpath::uncaughtException;<br>
 Class*      Classpath::inheritableThreadLocal;<br>
<br>
-JavaMethod* Classpath::runVMThread;<br>
 JavaMethod* Classpath::setContextClassLoader;<br>
 JavaMethod* Classpath::getSystemClassLoader;<br>
 Class*      Classpath::newString;<br>
 Class*      Classpath::newClass;<br>
 Class*      Classpath::newThrowable;<br>
+JavaField*  Classpath::backtrace;<br>
+JavaField*  Classpath::detailMessage;<br>
 Class*      Classpath::newException;<br>
 JavaMethod* Classpath::initClass;<br>
 JavaMethod* Classpath::initClassWithProtectionDomain;<br>
@@ -82,18 +79,12 @@ JavaField*  Classpath::methodSlot;<br>
 JavaField*  Classpath::fieldSlot;<br>
 ClassArray* Classpath::classArrayClass;<br>
 JavaMethod* Classpath::loadInClassLoader;<br>
-JavaMethod* Classpath::initVMThrowable;<br>
-JavaField*  Classpath::vmDataVMThrowable;<br>
-Class*      Classpath::newVMThrowable;<br>
 JavaField*  Classpath::bufferAddress;<br>
-JavaField*  Classpath::dataPointer32;<br>
-JavaField*  Classpath::dataPointer64;<br>
-Class*      Classpath::newPointer32;<br>
-Class*      Classpath::newPointer64;<br>
 Class*      Classpath::newDirectByteBuffer;<br>
 JavaField*  Classpath::vmdataClassLoader;<br>
 JavaMethod* Classpath::InitDirectByteBuffer;<br>
 Class*      Classpath::newClassLoader;<br>
+Class*      Classpath::cloneableClass;<br>
<br>
<br>
 JavaField*  Classpath::boolValue;<br>
@@ -153,6 +144,7 @@ Class* Classpath::StackOverflowError;<br>
 Class* Classpath::UnknownError;<br>
 Class* Classpath::ClassNotFoundException;<br>
 Class* Classpath::ArithmeticException;<br>
+Class* Classpath::CloneNotSupportedException;<br>
<br>
 JavaMethod* Classpath::InitInvocationTargetException;<br>
 JavaMethod* Classpath::InitArrayStoreException;<br>
@@ -186,13 +178,14 @@ JavaMethod* Classpath::InitStackOverflowError;<br>
 JavaMethod* Classpath::InitUnknownError;<br>
 JavaMethod* Classpath::InitClassNotFoundException;<br>
 JavaMethod* Classpath::InitArithmeticException;<br>
+JavaMethod* Classpath::InitCloneNotSupportedException;<br>
 JavaMethod* Classpath::InitObject;<br>
 JavaMethod* Classpath::FinalizeObject;<br>
 JavaMethod* Classpath::IntToString;<br>
<br>
 JavaMethod* Classpath::SystemArraycopy;<br>
-JavaMethod* Classpath::VMSystemArraycopy;<br>
 Class*      Classpath::SystemClass;<br>
+JavaMethod* Classpath::initSystem;<br>
 Class*      Classpath::EnumClass;<br>
<br>
 JavaMethod* Classpath::ErrorWithExcpNoClassDefFoundError;<br>
@@ -231,29 +224,27 @@ Class*      Classpath::newReference;<br>
<br>
 void Classpath::CreateJavaThread(Jnjvm* vm, JavaThread* myth,<br>
                                  const char* thName, JavaObject* Group) {<br>
-  JavaObjectVMThread* vmth = NULL;<br>
   JavaObject* th = NULL;<br>
   JavaObject* name = NULL;<br>
   llvm_gcroot(Group, 0);<br>
-  llvm_gcroot(vmth, 0);<br>
   llvm_gcroot(th, 0);<br>
   llvm_gcroot(name, 0);<br>
<br>
+  assert(thName && thName[0] && "Invalid thread name!");<br>
+<br>
   th = newThread->doNew(vm);<br>
   myth->javaThread = th;<br>
-  vmth = (JavaObjectVMThread*)newVMThread->doNew(vm);<br>
+<br>
   name = vm->asciizToStr(thName);<br>
<br>
-  initThread->invokeIntSpecial(vm, newThread, th, &vmth, &name, 1, 0);<br>
-  vmThread->setInstanceObjectField(th, vmth);<br>
-  assocThread->setInstanceObjectField(vmth, th);<br>
-  running->setInstanceInt8Field(vmth, (uint32)1);<br>
-  JavaObjectVMThread::setVmdata(vmth, myth);<br>
+  // call Thread(ThreadGroup,String) constructor<br>
+  initThread->invokeIntSpecial(vm, newThread, th, &Group, &name);<br>
<br>
-  group->setInstanceObjectField(th, Group);<br>
-  groupAddThread->invokeIntSpecial(vm, threadGroup, Group, &th);<br>
+  // Store reference to the JavaThread for this thread in the 'eetop' field<br>
+  eetop->setInstanceLongField(th, (long)myth);<br>
<br>
-  finaliseCreateInitialThread->invokeIntStatic(vm,<br>
inheritableThreadLocal, &th);<br>
+  // TODO: I don't know what this is for, leaving out for now.<br>
+  //finaliseCreateInitialThread->invokeIntStatic(vm,<br>
inheritableThreadLocal, &th);<br></blockquote><div><br></div><div>That's GNU Classpath specific. Maybe you can remove it for OpenJDK?</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">

 }<br>
<br>
 void Classpath::InitializeThreading(Jnjvm* vm) {<br>
@@ -261,31 +252,33 @@ void Classpath::InitializeThreading(Jnjvm* vm) {<br>
   JavaObject* RG = 0;<br>
   JavaObject* SystemGroup = 0;<br>
   JavaObject* systemName = 0;<br>
+  JavaObject* MainGroup = 0;<br>
+  JavaObject* mainName = 0;<br>
   llvm_gcroot(RG, 0);<br>
   llvm_gcroot(SystemGroup, 0);<br>
   llvm_gcroot(systemName, 0);<br>
+  llvm_gcroot(MainGroup, 0);<br>
+  llvm_gcroot(mainName, 0);<br>
<br>
   // Resolve and initialize classes first.<br>
   newThread->resolveClass();<br>
   newThread->initialiseClass(vm);<br>
<br>
-  newVMThread->resolveClass();<br>
-  newVMThread->initialiseClass(vm);<br>
-<br>
   threadGroup->resolveClass();<br>
   threadGroup->initialiseClass(vm);<br>
<br>
-  // Create the main thread<br>
-  RG = rootGroup->getStaticObjectField();<br>
-  assert(RG && "No root group");<br>
-  assert(vm->getMainThread() && "VM did not set its main thread");<br>
-  CreateJavaThread(vm, (JavaThread*)vm->getMainThread(), "main", RG);<br>
-<br>
   // Create the "system" group.<br>
   SystemGroup = threadGroup->doNew(vm);<br>
   initGroup->invokeIntSpecial(vm, threadGroup, SystemGroup);<br>
-  systemName = vm->asciizToStr("system");<br>
-  groupName->setInstanceObjectField(SystemGroup, systemName);<br>
+<br>
+  // Create the "main" group, child of the "system" group.<br>
+  MainGroup = threadGroup->doNew(vm);<br>
+  mainName = vm->asciizToStr("main");<br>
+  initNamedGroup->invokeIntSpecial(vm, threadGroup, MainGroup,<br>
&SystemGroup, &mainName);<br>
+<br>
+  // Create the main thread<br>
+  assert(vm->getMainThread() && "VM did not set its main thread");<br>
+  CreateJavaThread(vm, (JavaThread*)vm->getMainThread(), "main", MainGroup);<br>
<br>
   // Create the finalizer thread.<br>
   assert(vm->getFinalizerThread() && "VM did not set its finalizer thread");<br>
@@ -395,65 +388,6 @@ extern "C" JavaString*<br>
Java_java_lang_VMString_intern__Ljava_lang_String_2(<br>
   return res;<br>
 }<br>
<br>
-extern "C" uint8 Java_java_lang_Class_isArray__(JavaObjectClass* klass) {<br>
-  llvm_gcroot(klass, 0);<br>
-  UserCommonClass* cl = 0;<br>
-<br>
-  BEGIN_NATIVE_EXCEPTION(0)<br>
-<br>
-  cl = JavaObjectClass::getClass(klass);<br>
-<br>
-  END_NATIVE_EXCEPTION<br>
-<br>
-  return (uint8)cl->isArray();<br>
-}<br>
-<br>
-extern "C" JavaObject* Java_gnu_classpath_VMStackWalker_getCallingClass__() {<br>
-<br>
-  JavaObject* res = 0;<br>
-  llvm_gcroot(res, 0);<br>
-<br>
-  BEGIN_NATIVE_EXCEPTION(0)<br>
-<br>
-  JavaThread* th = JavaThread::get();<br>
-  UserClass* cl = th->getCallingClassLevel(2);<br>
-  if (cl != NULL) res = cl->getClassDelegatee(th->getJVM());<br>
-<br>
-  END_NATIVE_EXCEPTION<br>
-<br>
-  return res;<br>
-}<br>
-<br>
-extern "C" JavaObject*<br>
Java_gnu_classpath_VMStackWalker_getCallingClassLoader__() {<br>
-<br>
-  JavaObject* res = 0;<br>
-  llvm_gcroot(res, 0);<br>
-<br>
-  BEGIN_NATIVE_EXCEPTION(0)<br>
-<br>
-  JavaThread* th = JavaThread::get();<br>
-  UserClass* cl = th->getCallingClassLevel(2);<br>
-  res = cl->classLoader->getJavaClassLoader();<br>
-<br>
-  END_NATIVE_EXCEPTION<br>
-<br>
-  return res;<br>
-}<br>
-<br>
-extern "C" JavaObject*<br>
Java_gnu_classpath_VMStackWalker_firstNonNullClassLoader__() {<br>
-  JavaObject* res = 0;<br>
-  llvm_gcroot(res, 0);<br>
-<br>
-  BEGIN_NATIVE_EXCEPTION(0)<br>
-<br>
-  JavaThread* th = JavaThread::get();<br>
-  res = th->getNonNullClassLoader();<br>
-<br>
-  END_NATIVE_EXCEPTION<br>
-<br>
-  return res;<br>
-}<br>
-<br>
 extern "C" JavaObject*<br>
Java_sun_reflect_Reflection_getCallerClass__I(uint32 index) {<br>
<br>
   JavaObject* res = 0;<br>
@@ -512,30 +446,6 @@ extern "C" void nativeJavaObjectConstructorTracer(<br>
   JavaObjectConstructor::staticTracer(obj, closure);<br>
 }<br>
<br>
-extern "C" void nativeJavaObjectVMThreadTracer(<br>
-    JavaObjectVMThread* obj, word_t closure) {<br>
-  JavaObjectVMThread::staticTracer(obj, closure);<br>
-}<br>
-<br>
-extern "C" JavaString*<br>
Java_java_lang_VMSystem_getenv__Ljava_lang_String_2(JavaString* str) {<br>
-  JavaString* ret = 0;<br>
-  llvm_gcroot(str, 0);<br>
-  llvm_gcroot(ret, 0);<br>
-<br>
-  BEGIN_NATIVE_EXCEPTION(0)<br>
-<br>
-  mvm::ThreadAllocator allocator;<br>
-  char* buf = JavaString::strToAsciiz(str, &allocator);<br>
-  char* res = getenv(buf);<br>
-  if (res) {<br>
-    Jnjvm* vm = JavaThread::get()->getJVM();<br>
-    ret = vm->asciizToStr(res);<br>
-  }<br>
-<br>
-  END_NATIVE_EXCEPTION<br>
-<br>
-  return ret;<br>
-}<br>
<br>
 void Classpath::initialiseClasspath(JnjvmClassLoader* loader) {<br>
<br>
@@ -566,21 +476,23 @@ void<br>
Classpath::initialiseClasspath(JnjvmClassLoader* loader) {<br>
   newThrowable =<br>
     UPCALL_CLASS(loader, "java/lang/Throwable");<br>
<br>
-  newException =<br>
-    UPCALL_CLASS(loader, "java/lang/Exception");<br>
+  backtrace =<br>
+    UPCALL_FIELD(loader, "java/lang/Throwable",<br>
+        "backtrace", "Ljava/lang/Object;", ACC_VIRTUAL);<br>
<br>
-  newPointer32 =<br>
-    UPCALL_CLASS(loader, "gnu/classpath/Pointer32");<br>
+  detailMessage =<br>
+    UPCALL_FIELD(loader, "java/lang/Throwable",<br>
+        "detailMessage", "Ljava/lang/String;", ACC_VIRTUAL);<br>
<br>
-  newPointer64 =<br>
-    UPCALL_CLASS(loader, "gnu/classpath/Pointer64");<br>
+  newException =<br>
+    UPCALL_CLASS(loader, "java/lang/Exception");<br>
<br>
   newDirectByteBuffer =<br>
-    UPCALL_CLASS(loader, "java/nio/DirectByteBufferImpl$ReadWrite");<br>
+    UPCALL_CLASS(loader, "java/nio/DirectByteBuffer");<br>
<br>
+  //TODO: Revisit this one, verify signature.<br>
   InitDirectByteBuffer =<br>
-    UPCALL_METHOD(loader, "java/nio/DirectByteBufferImpl$ReadWrite", "<init>",<br>
-                  "(Ljava/lang/Object;Lgnu/classpath/Pointer;III)V",<br>
+    UPCALL_METHOD(loader, "java/nio/DirectByteBuffer", "<init>", "(JI)V",<br>
                   ACC_VIRTUAL);<br>
<br>
   initClass =<br>
@@ -606,7 +518,9 @@ void<br>
Classpath::initialiseClasspath(JnjvmClassLoader* loader) {<br>
<br>
   initConstructor =<br>
     UPCALL_METHOD(loader, "java/lang/reflect/Constructor", "<init>",<br>
-                  "(Ljava/lang/Class;I)V", ACC_VIRTUAL);<br>
+    "(Ljava/lang/Class;[Ljava/lang/Class;[Ljava/lang/Class;"<br>
+    "IILjava/lang/String;[B[B)V",<br>
+      ACC_VIRTUAL);<br>
<br>
   newConstructor =<br>
     UPCALL_CLASS(loader, "java/lang/reflect/Constructor");<br>
@@ -622,7 +536,9 @@ void<br>
Classpath::initialiseClasspath(JnjvmClassLoader* loader) {<br>
<br>
   initMethod =<br>
     UPCALL_METHOD(loader, "java/lang/reflect/Method", "<init>",<br>
-                  "(Ljava/lang/Class;Ljava/lang/String;I)V", ACC_VIRTUAL);<br>
+                  "(Ljava/lang/Class;Ljava/lang/String;[Ljava/lang/Class;"<br>
+                  "Ljava/lang/Class;[Ljava/lang/Class;IILjava/lang/String;"<br>
+                  "[B[B[B)V", ACC_VIRTUAL);<br>
<br>
   newMethod =<br>
     UPCALL_CLASS(loader, "java/lang/reflect/Method");<br>
@@ -635,7 +551,8 @@ void<br>
Classpath::initialiseClasspath(JnjvmClassLoader* loader) {<br>
<br>
   initField =<br>
     UPCALL_METHOD(loader, "java/lang/reflect/Field", "<init>",<br>
-                  "(Ljava/lang/Class;Ljava/lang/String;I)V", ACC_VIRTUAL);<br>
+<br>
"(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/Class;IILjava/lang/String;[B)V",<br>
+                  ACC_VIRTUAL);<br>
<br>
   newField =<br>
     UPCALL_CLASS(loader, "java/lang/reflect/Field");<br>
@@ -650,29 +567,14 @@ void<br>
Classpath::initialiseClasspath(JnjvmClassLoader* loader) {<br>
   classArrayClass =<br>
     UPCALL_ARRAY_CLASS(loader, "java/lang/Class", 1);<br>
<br>
-  newVMThrowable =<br>
-    UPCALL_CLASS(loader, "java/lang/VMThrowable");<br>
-<br>
-  initVMThrowable =<br>
-    UPCALL_METHOD(loader, "java/lang/VMThrowable", "<init>", "()V",<br>
ACC_VIRTUAL);<br>
-<br>
-  vmDataVMThrowable =<br>
-    UPCALL_FIELD(loader, "java/lang/VMThrowable", "vmdata",<br>
"Ljava/lang/Object;",<br>
-                 ACC_VIRTUAL);<br>
-<br>
   bufferAddress =<br>
     UPCALL_FIELD(loader, "java/nio/Buffer", "address",<br>
"Lgnu/classpath/Pointer;",<br>
                  ACC_VIRTUAL);<br>
<br>
-  dataPointer32 =<br>
-    UPCALL_FIELD(loader, "gnu/classpath/Pointer32", "data", "I", ACC_VIRTUAL);<br>
-<br>
-  dataPointer64 =<br>
-    UPCALL_FIELD(loader, "gnu/classpath/Pointer64", "data", "J", ACC_VIRTUAL);<br>
-<br>
-  vmdataClassLoader =<br>
-    UPCALL_FIELD(loader, "java/lang/ClassLoader", "vmdata",<br>
"Ljava/lang/Object;",<br>
-                 ACC_VIRTUAL);<br>
+  // TODO: Resolve how to tie a ClassLoader to its internal representation<br>
+  //vmdataClassLoader =<br>
+  //  UPCALL_FIELD(loader, "java/lang/ClassLoader", "vmdata",<br>
"Ljava/lang/Object;",<br>
+  //               ACC_VIRTUAL);<br>
<br>
   newStackTraceElement =<br>
     UPCALL_CLASS(loader, "java/lang/StackTraceElement");<br>
@@ -682,7 +584,7 @@ void<br>
Classpath::initialiseClasspath(JnjvmClassLoader* loader) {<br>
<br>
   initStackTraceElement =<br>
     UPCALL_METHOD(loader,  "java/lang/StackTraceElement", "<init>",<br>
-<br>
"(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Z)V",<br>
+                  "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)V",<br>
                   ACC_VIRTUAL);<br>
<br>
   boolValue =<br>
@@ -739,25 +641,14 @@ void<br>
Classpath::initialiseClasspath(JnjvmClassLoader* loader) {<br>
   Classpath::OfObject =<br>
     UPCALL_CLASS(loader, "java/lang/Object");<br>
<br>
-  vmStackWalker =<br>
-    UPCALL_CLASS(loader, "gnu/classpath/VMStackWalker");<br>
-<br>
   loadInClassLoader =<br>
     UPCALL_METHOD(loader, "java/lang/ClassLoader", "loadClass",<br>
                   "(Ljava/lang/String;)Ljava/lang/Class;", ACC_VIRTUAL);<br>
<br>
-  JavaMethod* internString =<br>
-    UPCALL_METHOD(loader, "java/lang/VMString", "intern",<br>
-                  "(Ljava/lang/String;)Ljava/lang/String;", ACC_STATIC);<br>
-  internString->setNative();<br>
-<br>
-  JavaMethod* isArray =<br>
-    UPCALL_METHOD(loader, "java/lang/Class", "isArray", "()Z", ACC_VIRTUAL);<br>
-  isArray->setNative();<br>
-<br>
   // Make sure classes the JIT optimizes on are loaded.<br>
-  UPCALL_CLASS(loader, "java/lang/VMFloat");<br>
-  UPCALL_CLASS(loader, "java/lang/VMDouble");<br>
+  // TODO: What to do with these? I think we can just remove them...<br>
+  //UPCALL_CLASS(loader, "java/lang/VMFloat");<br>
+  //UPCALL_CLASS(loader, "java/lang/VMDouble");<br>
<br>
   UPCALL_REFLECT_CLASS_EXCEPTION(loader, InvocationTargetException);<br>
   UPCALL_CLASS_EXCEPTION(loader, ArrayStoreException);<br>
@@ -791,6 +682,7 @@ void<br>
Classpath::initialiseClasspath(JnjvmClassLoader* loader) {<br>
   UPCALL_CLASS_EXCEPTION(loader, UnknownError);<br>
   UPCALL_CLASS_EXCEPTION(loader, ClassNotFoundException);<br>
   UPCALL_CLASS_EXCEPTION(loader, ArithmeticException);<br>
+  UPCALL_CLASS_EXCEPTION(loader, CloneNotSupportedException);<br>
<br>
   UPCALL_METHOD_EXCEPTION(loader, InvocationTargetException);<br>
   UPCALL_METHOD_EXCEPTION(loader, ArrayStoreException);<br>
@@ -824,6 +716,7 @@ void<br>
Classpath::initialiseClasspath(JnjvmClassLoader* loader) {<br>
   UPCALL_METHOD_EXCEPTION(loader, UnknownError);<br>
   UPCALL_METHOD_EXCEPTION(loader, ClassNotFoundException);<br>
   UPCALL_METHOD_EXCEPTION(loader, ArithmeticException);<br>
+  UPCALL_METHOD_EXCEPTION(loader, CloneNotSupportedException);<br>
<br>
   UPCALL_METHOD_WITH_EXCEPTION(loader, NoClassDefFoundError);<br>
   UPCALL_METHOD_WITH_EXCEPTION(loader, ExceptionInInitializerError);<br>
@@ -842,44 +735,34 @@ void<br>
Classpath::initialiseClasspath(JnjvmClassLoader* loader) {<br>
                                   "(Ljava/lang/Object;ILjava/lang/Object;II)V",<br>
                                   ACC_STATIC);<br>
<br>
-  VMSystemArraycopy = UPCALL_METHOD(loader, "java/lang/VMSystem", "arraycopy",<br>
-                                  "(Ljava/lang/Object;ILjava/lang/Object;II)V",<br>
-                                  ACC_STATIC);<br>
+  SystemClass = UPCALL_CLASS(loader, "java/lang/System");<br>
+<br>
+  initSystem =<br>
+    UPCALL_METHOD(loader, "java/lang/System", "initializeSystemClass", "()V",<br>
+        ACC_STATIC);<br>
<br>
   SystemClass = UPCALL_CLASS(loader, "java/lang/System");<br>
   EnumClass = UPCALL_CLASS(loader, "java/lang/Enum");<br>
<br>
+  cloneableClass = UPCALL_CLASS(loader, "java/lang/Cloneable");<br>
+<br>
   newThread =<br>
     UPCALL_CLASS(loader, "java/lang/Thread");<br>
<br>
-  newVMThread =<br>
-    UPCALL_CLASS(loader, "java/lang/VMThread");<br>
-<br>
-  assocThread =<br>
-    UPCALL_FIELD(loader, "java/lang/VMThread", "thread", "Ljava/lang/Thread;",<br>
-                 ACC_VIRTUAL);<br>
-<br>
-  vmdataVMThread =<br>
-    UPCALL_FIELD(loader, "java/lang/VMThread", "vmdata", "Ljava/lang/Object;",<br>
-                 ACC_VIRTUAL);<br>
-<br>
-  inheritableThreadLocal =<br>
-    UPCALL_CLASS(loader, "java/lang/InheritableThreadLocal");<br>
-<br>
-  finaliseCreateInitialThread =<br>
-    UPCALL_METHOD(loader, "java/lang/InheritableThreadLocal", "newChildThread",<br>
-                  "(Ljava/lang/Thread;)V", ACC_STATIC);<br>
-<br>
   initThread =<br>
     UPCALL_METHOD(loader, "java/lang/Thread", "<init>",<br>
-                  "(Ljava/lang/VMThread;Ljava/lang/String;IZ)V", ACC_VIRTUAL);<br>
+        "(Ljava/lang/ThreadGroup;Ljava/lang/String;)V", ACC_VIRTUAL);<br>
<br>
-  initVMThread =<br>
-    UPCALL_METHOD(loader, "java/lang/VMThread", "<init>",<br>
-                  "(Ljava/lang/Thread;)V", ACC_VIRTUAL);<br>
+  runThread =<br>
+    UPCALL_METHOD(loader, "java/lang/Thread", "run", "()V", ACC_VIRTUAL);<br>
<br>
-  runVMThread =<br>
-    UPCALL_METHOD(loader, "java/lang/VMThread", "run", "()V", ACC_VIRTUAL);<br>
+  // TODO: ...And what to do with this?<br>
+  //inheritableThreadLocal =<br>
+  //  UPCALL_CLASS(loader, "java/lang/InheritableThreadLocal");<br>
+  //<br>
+  //finaliseCreateInitialThread =<br>
+  //  UPCALL_METHOD(loader, "java/lang/InheritableThreadLocal",<br>
"newChildThread",<br>
+  //                "(Ljava/lang/Thread;)V", ACC_STATIC);<br>
<br>
<br>
   groupAddThread =<br>
@@ -890,39 +773,32 @@ void<br>
Classpath::initialiseClasspath(JnjvmClassLoader* loader) {<br>
     UPCALL_METHOD(loader, "java/lang/ThreadGroup", "<init>",<br>
                   "()V", ACC_VIRTUAL);<br>
<br>
+  initNamedGroup =<br>
+    UPCALL_METHOD(loader, "java/lang/ThreadGroup", "<init>",<br>
+                  "(Ljava/lang/ThreadGroup;Ljava/lang/String;)V", ACC_VIRTUAL);<br>
+<br>
   groupName =<br>
     UPCALL_FIELD(loader, "java/lang/ThreadGroup", "name", "Ljava/lang/String;",<br>
                  ACC_VIRTUAL);<br>
-<br>
-  threadName =<br>
-     UPCALL_FIELD(loader, "java/lang/Thread", "name", "Ljava/lang/String;",<br>
-                  ACC_VIRTUAL);<br>
-<br>
-<br>
   priority =<br>
     UPCALL_FIELD(loader,  "java/lang/Thread", "priority", "I", ACC_VIRTUAL);<br>
<br>
   daemon =<br>
     UPCALL_FIELD(loader, "java/lang/Thread", "daemon", "Z", ACC_VIRTUAL);<br>
<br>
+  eetop =<br>
+    UPCALL_FIELD(loader, "java/lang/Thread", "eetop", "J", ACC_VIRTUAL);<br>
+<br>
+  threadStatus =<br>
+    UPCALL_FIELD(loader, "java/lang/Thread", "threadStatus", "I", ACC_VIRTUAL);<br>
   group =<br>
     UPCALL_FIELD(loader, "java/lang/Thread", "group",<br>
                  "Ljava/lang/ThreadGroup;", ACC_VIRTUAL);<br>
<br>
-  running =<br>
-    UPCALL_FIELD(loader, "java/lang/VMThread", "running", "Z", ACC_VIRTUAL);<br>
-<br>
   threadGroup =<br>
     UPCALL_CLASS(loader, "java/lang/ThreadGroup");<br>
<br>
-  rootGroup =<br>
-    UPCALL_FIELD(loader, "java/lang/ThreadGroup", "root",<br>
-                 "Ljava/lang/ThreadGroup;", ACC_STATIC);<br>
-<br>
-  vmThread =<br>
-    UPCALL_FIELD(loader, "java/lang/Thread", "vmThread",<br>
-                 "Ljava/lang/VMThread;", ACC_VIRTUAL);<br>
-<br>
+  // TODO: Verify this works in OpenJDK, merged from upstream<br>
   getUncaughtExceptionHandler =<br>
     UPCALL_METHOD(loader, "java/lang/Thread", "getUncaughtExceptionHandler",<br>
                   "()Ljava/lang/Thread$UncaughtExceptionHandler;",<br>
ACC_VIRTUAL);<br>
@@ -954,55 +830,11 @@ void<br>
Classpath::initialiseClasspath(JnjvmClassLoader* loader) {<br>
   // Don't compile methods here, we still don't know where to allocate Java<br>
   // strings.<br>
<br>
-  JavaMethod* getEnv =<br>
-    UPCALL_METHOD(loader, "java/lang/VMSystem", "getenv",<br>
-                  "(Ljava/lang/String;)Ljava/lang/String;", ACC_STATIC);<br>
-  getEnv->setNative();<br>
-<br>
-  JavaMethod* getCallingClass =<br>
-    UPCALL_METHOD(loader, "gnu/classpath/VMStackWalker", "getCallingClass",<br>
-                  "()Ljava/lang/Class;", ACC_STATIC);<br>
-  getCallingClass->setNative();<br>
-<br>
-  JavaMethod* getCallingClassLoader =<br>
-    UPCALL_METHOD(loader, "gnu/classpath/VMStackWalker",<br>
"getCallingClassLoader",<br>
-                  "()Ljava/lang/ClassLoader;", ACC_STATIC);<br>
-  getCallingClassLoader->setNative();<br>
-<br>
-  JavaMethod* firstNonNullClassLoader =<br>
-    UPCALL_METHOD(loader, "gnu/classpath/VMStackWalker",<br>
"firstNonNullClassLoader",<br>
-                  "()Ljava/lang/ClassLoader;", ACC_STATIC);<br>
-  firstNonNullClassLoader->setNative();<br>
-<br>
   JavaMethod* getCallerClass =<br>
     UPCALL_METHOD(loader, "sun/reflect/Reflection", "getCallerClass",<br>
                   "(I)Ljava/lang/Class;", ACC_STATIC);<br>
   getCallerClass->setNative();<br>
<br>
-  JavaMethod* postProperties =<br>
-    UPCALL_METHOD(loader, "gnu/classpath/VMSystemProperties", "postInit",<br>
-                  "(Ljava/util/Properties;)V", ACC_STATIC);<br>
-  postProperties->setNative();<br>
-<br>
-  // Also implement these twos, implementation in GNU Classpath<br>
0.97.2 is buggy.<br>
-  JavaMethod* getAnnotation =<br>
-    UPCALL_METHOD(loader, "java/lang/reflect/AccessibleObject",<br>
"getAnnotation",<br>
-                  "(Ljava/lang/Class;)Ljava/lang/annotation/Annotation;",<br>
-                  ACC_VIRTUAL);<br>
-  getAnnotation->setNative();<br>
-<br>
-  JavaMethod* getAnnotations =<br>
-    UPCALL_METHOD(loader, "java/lang/reflect/AccessibleObject",<br>
-                  "getDeclaredAnnotations",<br>
-                  "()[Ljava/lang/annotation/Annotation;",<br>
-                  ACC_VIRTUAL);<br>
-  getAnnotations->setNative();<br>
-<br>
-  JavaMethod* getBootPackages =<br>
-    UPCALL_METHOD(loader, "java/lang/VMClassLoader", "getBootPackages",<br>
-                  "()[Ljava/lang/String;", ACC_STATIC);<br>
-  getBootPackages->setNative();<br>
-<br>
   //===----------------------------------------------------------------------===//<br>
   //<br>
   // To make classes non GC-allocated, we have to bypass the tracer<br>
functions of<br>
@@ -1028,9 +860,10 @@ void<br>
Classpath::initialiseClasspath(JnjvmClassLoader* loader) {<br>
       (word_t)nativeJavaObjectFieldTracer,<br>
       "nativeJavaObjectFieldTracer");<br>
<br>
-   newVMThread->getVirtualVT()->setNativeTracer(<br>
-      (word_t)nativeJavaObjectVMThreadTracer,<br>
-      "nativeJavaObjectVMThreadTracer");<br>
+   //TODO: What to do here? Remove?<br></blockquote><div><br></div><div>The reason why I'm writing over the Java tracer is because I need to do something  special on a VMThread object when being scanned by the GC. Look at ClasspathReflect.h. In this particular case, I don;t want to scan the reference to the JavaThread.</div>
<div><br></div><div>You should be careful about this, because it may break the GC if you do something wrong. </div><div><br></div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">

+   //newVMThread->getVirtualVT()->setNativeTracer(<br>
+   //   (word_t)nativeJavaObjectVMThreadTracer,<br>
+   //   "nativeJavaObjectVMThreadTracer");<br>
<br>
   newReference = UPCALL_CLASS(loader, "java/lang/ref/Reference");<br>
<br>
@@ -1070,7 +903,24 @@ void<br>
Classpath::initialiseClasspath(JnjvmClassLoader* loader) {<br>
 }<br>
<br>
 void Classpath::InitializeSystem(Jnjvm * jvm) {<br>
-  // TODO: Implement me!<br>
+  JavaObject * exc = NULL;<br>
+  llvm_gcroot(exc, 0);<br>
+  TRY {<br>
+    initSystem->invokeIntStatic(jvm, SystemClass);<br>
+  } CATCH {<br>
+    exc = JavaThread::get()->pendingException;<br>
+  } END_CATCH;<br>
+<br>
+  if (exc) {<br>
+    fprintf(stderr, "Exception %s while initializing system.\n",<br>
+        UTF8Buffer(JavaObject::getClass(exc)->name).cString());<br>
+    JavaString * s = (JavaString*)detailMessage->getInstanceObjectField(exc);<br>
+    if (s) {<br>
+      fprintf(stderr, "Exception Message: \"%s\"\n",<br>
+          JavaString::strToAsciiz(s));<br>
+    }<br>
+    abort();<br>
+  }<br>
 }<br>
<br>
<br>
diff --git a/lib/J3/ClassLib/OpenJDK/JavaUpcalls.h<br>
b/lib/J3/ClassLib/OpenJDK/JavaUpcalls.h<br>
index 7bb5c8e..e554dc8 100644<br>
--- a/lib/J3/ClassLib/OpenJDK/JavaUpcalls.h<br>
+++ b/lib/J3/ClassLib/OpenJDK/JavaUpcalls.h<br>
@@ -70,6 +70,8 @@ public:<br>
   ISOLATE_STATIC UserClass* newString;<br>
   ISOLATE_STATIC UserClass* newClass;<br>
   ISOLATE_STATIC UserClass* newThrowable;<br>
+  ISOLATE_STATIC JavaField* backtrace;<br>
+  ISOLATE_STATIC JavaField* detailMessage;<br>
   ISOLATE_STATIC UserClass* newException;<br>
   ISOLATE_STATIC JavaMethod* initClass;<br>
   ISOLATE_STATIC JavaMethod* initClassWithProtectionDomain;<br>
@@ -92,17 +94,11 @@ public:<br>
   ISOLATE_STATIC JavaField*  fieldSlot;<br>
   ISOLATE_STATIC UserClassArray* classArrayClass;<br>
   ISOLATE_STATIC JavaMethod* loadInClassLoader;<br>
-  ISOLATE_STATIC JavaMethod* initVMThrowable;<br>
-  ISOLATE_STATIC JavaField*  vmDataVMThrowable;<br>
-  ISOLATE_STATIC UserClass*  newVMThrowable;<br>
   ISOLATE_STATIC JavaField*  bufferAddress;<br>
-  ISOLATE_STATIC JavaField*  dataPointer32;<br>
-  ISOLATE_STATIC JavaField*  dataPointer64;<br>
-  ISOLATE_STATIC UserClass*  newPointer32;<br>
-  ISOLATE_STATIC UserClass*  newPointer64;<br>
   ISOLATE_STATIC UserClass*  newDirectByteBuffer;<br>
   ISOLATE_STATIC JavaMethod* InitDirectByteBuffer;<br>
   ISOLATE_STATIC JavaField*  vmdataClassLoader;<br>
+  ISOLATE_STATIC UserClass* cloneableClass;<br>
   ISOLATE_STATIC UserClass*  enumClass;<br>
<br>
   ISOLATE_STATIC JavaField* boolValue;<br>
@@ -133,24 +129,19 @@ public:<br>
   ISOLATE_STATIC UserClass* vmStackWalker;<br>
<br>
   ISOLATE_STATIC UserClass* newThread;<br>
-  ISOLATE_STATIC UserClass* newVMThread;<br>
-  ISOLATE_STATIC JavaField* assocThread;<br>
-  ISOLATE_STATIC JavaField* vmdataVMThread;<br>
-  ISOLATE_STATIC JavaMethod* finaliseCreateInitialThread;<br>
   ISOLATE_STATIC JavaMethod* initThread;<br>
-  ISOLATE_STATIC JavaMethod* initVMThread;<br>
-  ISOLATE_STATIC JavaMethod* runVMThread;<br>
+  ISOLATE_STATIC JavaMethod* runThread;<br>
+  ISOLATE_STATIC JavaMethod* finaliseCreateInitialThread;<br>
   ISOLATE_STATIC JavaMethod* groupAddThread;<br>
-  ISOLATE_STATIC JavaField* threadName;<br>
   ISOLATE_STATIC JavaField* groupName;<br>
   ISOLATE_STATIC JavaMethod* initGroup;<br>
+  ISOLATE_STATIC JavaMethod* initNamedGroup;<br>
   ISOLATE_STATIC JavaField* priority;<br>
   ISOLATE_STATIC JavaField* daemon;<br>
+  ISOLATE_STATIC JavaField* eetop;<br>
   ISOLATE_STATIC JavaField* group;<br>
-  ISOLATE_STATIC JavaField* running;<br>
+  ISOLATE_STATIC JavaField* threadStatus;<br>
   ISOLATE_STATIC UserClass* threadGroup;<br>
-  ISOLATE_STATIC JavaField* rootGroup;<br>
-  ISOLATE_STATIC JavaField* vmThread;<br>
   ISOLATE_STATIC JavaMethod* getUncaughtExceptionHandler;<br>
   ISOLATE_STATIC JavaMethod* uncaughtException;<br>
   ISOLATE_STATIC UserClass*  inheritableThreadLocal;<br>
@@ -188,6 +179,7 @@ public:<br>
   ISOLATE_STATIC UserClass* UnknownError;<br>
   ISOLATE_STATIC UserClass* ClassNotFoundException;<br>
   ISOLATE_STATIC UserClass* ArithmeticException;<br>
+  ISOLATE_STATIC UserClass* CloneNotSupportedException;<br>
<br>
   ISOLATE_STATIC JavaMethod* InitInvocationTargetException;<br>
   ISOLATE_STATIC JavaMethod* InitArrayStoreException;<br>
@@ -221,10 +213,11 @@ public:<br>
   ISOLATE_STATIC JavaMethod* InitUnknownError;<br>
   ISOLATE_STATIC JavaMethod* InitClassNotFoundException;<br>
   ISOLATE_STATIC JavaMethod* InitArithmeticException;<br>
+  ISOLATE_STATIC JavaMethod* InitCloneNotSupportedException;<br>
<br>
   ISOLATE_STATIC JavaMethod* SystemArraycopy;<br>
-  ISOLATE_STATIC JavaMethod* VMSystemArraycopy;<br>
   ISOLATE_STATIC Class*      SystemClass;<br>
+  ISOLATE_STATIC JavaMethod* initSystem;<br>
<br>
   ISOLATE_STATIC JavaMethod* IntToString;<br>
<font color="#888888"><br>
--<br>
1.7.5.1<br>
_______________________________________________<br>
vmkit-commits mailing list<br>
<a href="mailto:vmkit-commits@cs.uiuc.edu">vmkit-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/vmkit-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/vmkit-commits</a><br>
</font></blockquote></div><br>