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>