[vmkit-commits] [PATCH] OpenJDK JavaUpcalls revamp
Nicolas Geoffray
nicolas.geoffray at gmail.com
Thu Oct 27 09:52:10 PDT 2011
Looks good with a few comments
On Thu, Oct 27, 2011 at 3:37 AM, Will Dietz <wdietz2 at illinois.edu> wrote:
> Inlined below.
>
> Apologies for the long patch, didn't see a particularly useful way to
> break it up (without breaking the build terribly). If this is just
> too much, I can revisit that of course.
>
> In short, drops the classpath-specific fields/etc, replacing them with
> OpenJDK ones as was useful. Also updated the various signatures,
> since they're often different in the OpenJDK versions.
>
> I stash the JavaThread in the 'eetop' field (since no vmdata), idea
> for this was taken from how jamvm does it, for what it's worth.
>
> The TODO about how to map ClassLoaders will be resolved in a future
> patch (and after some discussion :)).
>
> Thanks!
>
> ~Will
>
> >From 5d7b01ef5347928b619498007c6b677fd8ca9a8b Mon Sep 17 00:00:00 2001
> From: Will Dietz <w at wdtz.org>
> Date: Wed, 26 Oct 2011 20:21:37 -0500
> Subject: [PATCH] OpenJDK JavaUpcalls revamp
>
> ---
> lib/J3/ClassLib/OpenJDK/JavaUpcalls.cpp | 372
> +++++++++----------------------
> lib/J3/ClassLib/OpenJDK/JavaUpcalls.h | 29 +--
> 2 files changed, 122 insertions(+), 279 deletions(-)
>
> diff --git a/lib/J3/ClassLib/OpenJDK/JavaUpcalls.cpp
> b/lib/J3/ClassLib/OpenJDK/JavaUpcalls.cpp
> index 6b68703..fe3ba01 100644
> --- a/lib/J3/ClassLib/OpenJDK/JavaUpcalls.cpp
> +++ b/lib/J3/ClassLib/OpenJDK/JavaUpcalls.cpp
> @@ -33,33 +33,30 @@
> using namespace j3;
>
> Class* Classpath::newThread;
> -Class* Classpath::newVMThread;
> -JavaField* Classpath::assocThread;
> -JavaField* Classpath::vmdataVMThread;
> -JavaMethod* Classpath::finaliseCreateInitialThread;
> -JavaMethod* Classpath::initVMThread;
> JavaMethod* Classpath::initThread;
> +JavaMethod* Classpath::runThread;
> +JavaMethod* Classpath::finaliseCreateInitialThread;
> JavaMethod* Classpath::groupAddThread;
> -JavaField* Classpath::threadName;
> JavaField* Classpath::groupName;
> JavaMethod* Classpath::initGroup;
> +JavaMethod* Classpath::initNamedGroup;
> JavaField* Classpath::priority;
> JavaField* Classpath::daemon;
> +JavaField* Classpath::eetop;
>
> +JavaField* Classpath::threadStatus;
> JavaField* Classpath::group;
> -JavaField* Classpath::running;
> Class* Classpath::threadGroup;
> -JavaField* Classpath::rootGroup;
> -JavaField* Classpath::vmThread;
> JavaMethod* Classpath::getUncaughtExceptionHandler;
> JavaMethod* Classpath::uncaughtException;
> Class* Classpath::inheritableThreadLocal;
>
> -JavaMethod* Classpath::runVMThread;
> JavaMethod* Classpath::setContextClassLoader;
> JavaMethod* Classpath::getSystemClassLoader;
> Class* Classpath::newString;
> Class* Classpath::newClass;
> Class* Classpath::newThrowable;
> +JavaField* Classpath::backtrace;
> +JavaField* Classpath::detailMessage;
> Class* Classpath::newException;
> JavaMethod* Classpath::initClass;
> JavaMethod* Classpath::initClassWithProtectionDomain;
> @@ -82,18 +79,12 @@ JavaField* Classpath::methodSlot;
> JavaField* Classpath::fieldSlot;
> ClassArray* Classpath::classArrayClass;
> JavaMethod* Classpath::loadInClassLoader;
> -JavaMethod* Classpath::initVMThrowable;
> -JavaField* Classpath::vmDataVMThrowable;
> -Class* Classpath::newVMThrowable;
> JavaField* Classpath::bufferAddress;
> -JavaField* Classpath::dataPointer32;
> -JavaField* Classpath::dataPointer64;
> -Class* Classpath::newPointer32;
> -Class* Classpath::newPointer64;
> Class* Classpath::newDirectByteBuffer;
> JavaField* Classpath::vmdataClassLoader;
> JavaMethod* Classpath::InitDirectByteBuffer;
> Class* Classpath::newClassLoader;
> +Class* Classpath::cloneableClass;
>
>
> JavaField* Classpath::boolValue;
> @@ -153,6 +144,7 @@ Class* Classpath::StackOverflowError;
> Class* Classpath::UnknownError;
> Class* Classpath::ClassNotFoundException;
> Class* Classpath::ArithmeticException;
> +Class* Classpath::CloneNotSupportedException;
>
> JavaMethod* Classpath::InitInvocationTargetException;
> JavaMethod* Classpath::InitArrayStoreException;
> @@ -186,13 +178,14 @@ JavaMethod* Classpath::InitStackOverflowError;
> JavaMethod* Classpath::InitUnknownError;
> JavaMethod* Classpath::InitClassNotFoundException;
> JavaMethod* Classpath::InitArithmeticException;
> +JavaMethod* Classpath::InitCloneNotSupportedException;
> JavaMethod* Classpath::InitObject;
> JavaMethod* Classpath::FinalizeObject;
> JavaMethod* Classpath::IntToString;
>
> JavaMethod* Classpath::SystemArraycopy;
> -JavaMethod* Classpath::VMSystemArraycopy;
> Class* Classpath::SystemClass;
> +JavaMethod* Classpath::initSystem;
> Class* Classpath::EnumClass;
>
> JavaMethod* Classpath::ErrorWithExcpNoClassDefFoundError;
> @@ -231,29 +224,27 @@ Class* Classpath::newReference;
>
> void Classpath::CreateJavaThread(Jnjvm* vm, JavaThread* myth,
> const char* thName, JavaObject* Group) {
> - JavaObjectVMThread* vmth = NULL;
> JavaObject* th = NULL;
> JavaObject* name = NULL;
> llvm_gcroot(Group, 0);
> - llvm_gcroot(vmth, 0);
> llvm_gcroot(th, 0);
> llvm_gcroot(name, 0);
>
> + assert(thName && thName[0] && "Invalid thread name!");
> +
> th = newThread->doNew(vm);
> myth->javaThread = th;
> - vmth = (JavaObjectVMThread*)newVMThread->doNew(vm);
> +
> name = vm->asciizToStr(thName);
>
> - initThread->invokeIntSpecial(vm, newThread, th, &vmth, &name, 1, 0);
> - vmThread->setInstanceObjectField(th, vmth);
> - assocThread->setInstanceObjectField(vmth, th);
> - running->setInstanceInt8Field(vmth, (uint32)1);
> - JavaObjectVMThread::setVmdata(vmth, myth);
> + // call Thread(ThreadGroup,String) constructor
> + initThread->invokeIntSpecial(vm, newThread, th, &Group, &name);
>
> - group->setInstanceObjectField(th, Group);
> - groupAddThread->invokeIntSpecial(vm, threadGroup, Group, &th);
> + // Store reference to the JavaThread for this thread in the 'eetop'
> field
> + eetop->setInstanceLongField(th, (long)myth);
>
> - finaliseCreateInitialThread->invokeIntStatic(vm,
> inheritableThreadLocal, &th);
> + // TODO: I don't know what this is for, leaving out for now.
> + //finaliseCreateInitialThread->invokeIntStatic(vm,
> inheritableThreadLocal, &th);
>
That's GNU Classpath specific. Maybe you can remove it for OpenJDK?
> }
>
> void Classpath::InitializeThreading(Jnjvm* vm) {
> @@ -261,31 +252,33 @@ void Classpath::InitializeThreading(Jnjvm* vm) {
> JavaObject* RG = 0;
> JavaObject* SystemGroup = 0;
> JavaObject* systemName = 0;
> + JavaObject* MainGroup = 0;
> + JavaObject* mainName = 0;
> llvm_gcroot(RG, 0);
> llvm_gcroot(SystemGroup, 0);
> llvm_gcroot(systemName, 0);
> + llvm_gcroot(MainGroup, 0);
> + llvm_gcroot(mainName, 0);
>
> // Resolve and initialize classes first.
> newThread->resolveClass();
> newThread->initialiseClass(vm);
>
> - newVMThread->resolveClass();
> - newVMThread->initialiseClass(vm);
> -
> threadGroup->resolveClass();
> threadGroup->initialiseClass(vm);
>
> - // Create the main thread
> - RG = rootGroup->getStaticObjectField();
> - assert(RG && "No root group");
> - assert(vm->getMainThread() && "VM did not set its main thread");
> - CreateJavaThread(vm, (JavaThread*)vm->getMainThread(), "main", RG);
> -
> // Create the "system" group.
> SystemGroup = threadGroup->doNew(vm);
> initGroup->invokeIntSpecial(vm, threadGroup, SystemGroup);
> - systemName = vm->asciizToStr("system");
> - groupName->setInstanceObjectField(SystemGroup, systemName);
> +
> + // Create the "main" group, child of the "system" group.
> + MainGroup = threadGroup->doNew(vm);
> + mainName = vm->asciizToStr("main");
> + initNamedGroup->invokeIntSpecial(vm, threadGroup, MainGroup,
> &SystemGroup, &mainName);
> +
> + // Create the main thread
> + assert(vm->getMainThread() && "VM did not set its main thread");
> + CreateJavaThread(vm, (JavaThread*)vm->getMainThread(), "main",
> MainGroup);
>
> // Create the finalizer thread.
> assert(vm->getFinalizerThread() && "VM did not set its finalizer
> thread");
> @@ -395,65 +388,6 @@ extern "C" JavaString*
> Java_java_lang_VMString_intern__Ljava_lang_String_2(
> return res;
> }
>
> -extern "C" uint8 Java_java_lang_Class_isArray__(JavaObjectClass* klass) {
> - llvm_gcroot(klass, 0);
> - UserCommonClass* cl = 0;
> -
> - BEGIN_NATIVE_EXCEPTION(0)
> -
> - cl = JavaObjectClass::getClass(klass);
> -
> - END_NATIVE_EXCEPTION
> -
> - return (uint8)cl->isArray();
> -}
> -
> -extern "C" JavaObject*
> Java_gnu_classpath_VMStackWalker_getCallingClass__() {
> -
> - JavaObject* res = 0;
> - llvm_gcroot(res, 0);
> -
> - BEGIN_NATIVE_EXCEPTION(0)
> -
> - JavaThread* th = JavaThread::get();
> - UserClass* cl = th->getCallingClassLevel(2);
> - if (cl != NULL) res = cl->getClassDelegatee(th->getJVM());
> -
> - END_NATIVE_EXCEPTION
> -
> - return res;
> -}
> -
> -extern "C" JavaObject*
> Java_gnu_classpath_VMStackWalker_getCallingClassLoader__() {
> -
> - JavaObject* res = 0;
> - llvm_gcroot(res, 0);
> -
> - BEGIN_NATIVE_EXCEPTION(0)
> -
> - JavaThread* th = JavaThread::get();
> - UserClass* cl = th->getCallingClassLevel(2);
> - res = cl->classLoader->getJavaClassLoader();
> -
> - END_NATIVE_EXCEPTION
> -
> - return res;
> -}
> -
> -extern "C" JavaObject*
> Java_gnu_classpath_VMStackWalker_firstNonNullClassLoader__() {
> - JavaObject* res = 0;
> - llvm_gcroot(res, 0);
> -
> - BEGIN_NATIVE_EXCEPTION(0)
> -
> - JavaThread* th = JavaThread::get();
> - res = th->getNonNullClassLoader();
> -
> - END_NATIVE_EXCEPTION
> -
> - return res;
> -}
> -
> extern "C" JavaObject*
> Java_sun_reflect_Reflection_getCallerClass__I(uint32 index) {
>
> JavaObject* res = 0;
> @@ -512,30 +446,6 @@ extern "C" void nativeJavaObjectConstructorTracer(
> JavaObjectConstructor::staticTracer(obj, closure);
> }
>
> -extern "C" void nativeJavaObjectVMThreadTracer(
> - JavaObjectVMThread* obj, word_t closure) {
> - JavaObjectVMThread::staticTracer(obj, closure);
> -}
> -
> -extern "C" JavaString*
> Java_java_lang_VMSystem_getenv__Ljava_lang_String_2(JavaString* str) {
> - JavaString* ret = 0;
> - llvm_gcroot(str, 0);
> - llvm_gcroot(ret, 0);
> -
> - BEGIN_NATIVE_EXCEPTION(0)
> -
> - mvm::ThreadAllocator allocator;
> - char* buf = JavaString::strToAsciiz(str, &allocator);
> - char* res = getenv(buf);
> - if (res) {
> - Jnjvm* vm = JavaThread::get()->getJVM();
> - ret = vm->asciizToStr(res);
> - }
> -
> - END_NATIVE_EXCEPTION
> -
> - return ret;
> -}
>
> void Classpath::initialiseClasspath(JnjvmClassLoader* loader) {
>
> @@ -566,21 +476,23 @@ void
> Classpath::initialiseClasspath(JnjvmClassLoader* loader) {
> newThrowable =
> UPCALL_CLASS(loader, "java/lang/Throwable");
>
> - newException =
> - UPCALL_CLASS(loader, "java/lang/Exception");
> + backtrace =
> + UPCALL_FIELD(loader, "java/lang/Throwable",
> + "backtrace", "Ljava/lang/Object;", ACC_VIRTUAL);
>
> - newPointer32 =
> - UPCALL_CLASS(loader, "gnu/classpath/Pointer32");
> + detailMessage =
> + UPCALL_FIELD(loader, "java/lang/Throwable",
> + "detailMessage", "Ljava/lang/String;", ACC_VIRTUAL);
>
> - newPointer64 =
> - UPCALL_CLASS(loader, "gnu/classpath/Pointer64");
> + newException =
> + UPCALL_CLASS(loader, "java/lang/Exception");
>
> newDirectByteBuffer =
> - UPCALL_CLASS(loader, "java/nio/DirectByteBufferImpl$ReadWrite");
> + UPCALL_CLASS(loader, "java/nio/DirectByteBuffer");
>
> + //TODO: Revisit this one, verify signature.
> InitDirectByteBuffer =
> - UPCALL_METHOD(loader, "java/nio/DirectByteBufferImpl$ReadWrite",
> "<init>",
> - "(Ljava/lang/Object;Lgnu/classpath/Pointer;III)V",
> + UPCALL_METHOD(loader, "java/nio/DirectByteBuffer", "<init>", "(JI)V",
> ACC_VIRTUAL);
>
> initClass =
> @@ -606,7 +518,9 @@ void
> Classpath::initialiseClasspath(JnjvmClassLoader* loader) {
>
> initConstructor =
> UPCALL_METHOD(loader, "java/lang/reflect/Constructor", "<init>",
> - "(Ljava/lang/Class;I)V", ACC_VIRTUAL);
> + "(Ljava/lang/Class;[Ljava/lang/Class;[Ljava/lang/Class;"
> + "IILjava/lang/String;[B[B)V",
> + ACC_VIRTUAL);
>
> newConstructor =
> UPCALL_CLASS(loader, "java/lang/reflect/Constructor");
> @@ -622,7 +536,9 @@ void
> Classpath::initialiseClasspath(JnjvmClassLoader* loader) {
>
> initMethod =
> UPCALL_METHOD(loader, "java/lang/reflect/Method", "<init>",
> - "(Ljava/lang/Class;Ljava/lang/String;I)V", ACC_VIRTUAL);
> + "(Ljava/lang/Class;Ljava/lang/String;[Ljava/lang/Class;"
> +
> "Ljava/lang/Class;[Ljava/lang/Class;IILjava/lang/String;"
> + "[B[B[B)V", ACC_VIRTUAL);
>
> newMethod =
> UPCALL_CLASS(loader, "java/lang/reflect/Method");
> @@ -635,7 +551,8 @@ void
> Classpath::initialiseClasspath(JnjvmClassLoader* loader) {
>
> initField =
> UPCALL_METHOD(loader, "java/lang/reflect/Field", "<init>",
> - "(Ljava/lang/Class;Ljava/lang/String;I)V", ACC_VIRTUAL);
> +
>
> "(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/Class;IILjava/lang/String;[B)V",
> + ACC_VIRTUAL);
>
> newField =
> UPCALL_CLASS(loader, "java/lang/reflect/Field");
> @@ -650,29 +567,14 @@ void
> Classpath::initialiseClasspath(JnjvmClassLoader* loader) {
> classArrayClass =
> UPCALL_ARRAY_CLASS(loader, "java/lang/Class", 1);
>
> - newVMThrowable =
> - UPCALL_CLASS(loader, "java/lang/VMThrowable");
> -
> - initVMThrowable =
> - UPCALL_METHOD(loader, "java/lang/VMThrowable", "<init>", "()V",
> ACC_VIRTUAL);
> -
> - vmDataVMThrowable =
> - UPCALL_FIELD(loader, "java/lang/VMThrowable", "vmdata",
> "Ljava/lang/Object;",
> - ACC_VIRTUAL);
> -
> bufferAddress =
> UPCALL_FIELD(loader, "java/nio/Buffer", "address",
> "Lgnu/classpath/Pointer;",
> ACC_VIRTUAL);
>
> - dataPointer32 =
> - UPCALL_FIELD(loader, "gnu/classpath/Pointer32", "data", "I",
> ACC_VIRTUAL);
> -
> - dataPointer64 =
> - UPCALL_FIELD(loader, "gnu/classpath/Pointer64", "data", "J",
> ACC_VIRTUAL);
> -
> - vmdataClassLoader =
> - UPCALL_FIELD(loader, "java/lang/ClassLoader", "vmdata",
> "Ljava/lang/Object;",
> - ACC_VIRTUAL);
> + // TODO: Resolve how to tie a ClassLoader to its internal representation
> + //vmdataClassLoader =
> + // UPCALL_FIELD(loader, "java/lang/ClassLoader", "vmdata",
> "Ljava/lang/Object;",
> + // ACC_VIRTUAL);
>
> newStackTraceElement =
> UPCALL_CLASS(loader, "java/lang/StackTraceElement");
> @@ -682,7 +584,7 @@ void
> Classpath::initialiseClasspath(JnjvmClassLoader* loader) {
>
> initStackTraceElement =
> UPCALL_METHOD(loader, "java/lang/StackTraceElement", "<init>",
> -
> "(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Z)V",
> +
> "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)V",
> ACC_VIRTUAL);
>
> boolValue =
> @@ -739,25 +641,14 @@ void
> Classpath::initialiseClasspath(JnjvmClassLoader* loader) {
> Classpath::OfObject =
> UPCALL_CLASS(loader, "java/lang/Object");
>
> - vmStackWalker =
> - UPCALL_CLASS(loader, "gnu/classpath/VMStackWalker");
> -
> loadInClassLoader =
> UPCALL_METHOD(loader, "java/lang/ClassLoader", "loadClass",
> "(Ljava/lang/String;)Ljava/lang/Class;", ACC_VIRTUAL);
>
> - JavaMethod* internString =
> - UPCALL_METHOD(loader, "java/lang/VMString", "intern",
> - "(Ljava/lang/String;)Ljava/lang/String;", ACC_STATIC);
> - internString->setNative();
> -
> - JavaMethod* isArray =
> - UPCALL_METHOD(loader, "java/lang/Class", "isArray", "()Z",
> ACC_VIRTUAL);
> - isArray->setNative();
> -
> // Make sure classes the JIT optimizes on are loaded.
> - UPCALL_CLASS(loader, "java/lang/VMFloat");
> - UPCALL_CLASS(loader, "java/lang/VMDouble");
> + // TODO: What to do with these? I think we can just remove them...
> + //UPCALL_CLASS(loader, "java/lang/VMFloat");
> + //UPCALL_CLASS(loader, "java/lang/VMDouble");
>
> UPCALL_REFLECT_CLASS_EXCEPTION(loader, InvocationTargetException);
> UPCALL_CLASS_EXCEPTION(loader, ArrayStoreException);
> @@ -791,6 +682,7 @@ void
> Classpath::initialiseClasspath(JnjvmClassLoader* loader) {
> UPCALL_CLASS_EXCEPTION(loader, UnknownError);
> UPCALL_CLASS_EXCEPTION(loader, ClassNotFoundException);
> UPCALL_CLASS_EXCEPTION(loader, ArithmeticException);
> + UPCALL_CLASS_EXCEPTION(loader, CloneNotSupportedException);
>
> UPCALL_METHOD_EXCEPTION(loader, InvocationTargetException);
> UPCALL_METHOD_EXCEPTION(loader, ArrayStoreException);
> @@ -824,6 +716,7 @@ void
> Classpath::initialiseClasspath(JnjvmClassLoader* loader) {
> UPCALL_METHOD_EXCEPTION(loader, UnknownError);
> UPCALL_METHOD_EXCEPTION(loader, ClassNotFoundException);
> UPCALL_METHOD_EXCEPTION(loader, ArithmeticException);
> + UPCALL_METHOD_EXCEPTION(loader, CloneNotSupportedException);
>
> UPCALL_METHOD_WITH_EXCEPTION(loader, NoClassDefFoundError);
> UPCALL_METHOD_WITH_EXCEPTION(loader, ExceptionInInitializerError);
> @@ -842,44 +735,34 @@ void
> Classpath::initialiseClasspath(JnjvmClassLoader* loader) {
>
> "(Ljava/lang/Object;ILjava/lang/Object;II)V",
> ACC_STATIC);
>
> - VMSystemArraycopy = UPCALL_METHOD(loader, "java/lang/VMSystem",
> "arraycopy",
> -
> "(Ljava/lang/Object;ILjava/lang/Object;II)V",
> - ACC_STATIC);
> + SystemClass = UPCALL_CLASS(loader, "java/lang/System");
> +
> + initSystem =
> + UPCALL_METHOD(loader, "java/lang/System", "initializeSystemClass",
> "()V",
> + ACC_STATIC);
>
> SystemClass = UPCALL_CLASS(loader, "java/lang/System");
> EnumClass = UPCALL_CLASS(loader, "java/lang/Enum");
>
> + cloneableClass = UPCALL_CLASS(loader, "java/lang/Cloneable");
> +
> newThread =
> UPCALL_CLASS(loader, "java/lang/Thread");
>
> - newVMThread =
> - UPCALL_CLASS(loader, "java/lang/VMThread");
> -
> - assocThread =
> - UPCALL_FIELD(loader, "java/lang/VMThread", "thread",
> "Ljava/lang/Thread;",
> - ACC_VIRTUAL);
> -
> - vmdataVMThread =
> - UPCALL_FIELD(loader, "java/lang/VMThread", "vmdata",
> "Ljava/lang/Object;",
> - ACC_VIRTUAL);
> -
> - inheritableThreadLocal =
> - UPCALL_CLASS(loader, "java/lang/InheritableThreadLocal");
> -
> - finaliseCreateInitialThread =
> - UPCALL_METHOD(loader, "java/lang/InheritableThreadLocal",
> "newChildThread",
> - "(Ljava/lang/Thread;)V", ACC_STATIC);
> -
> initThread =
> UPCALL_METHOD(loader, "java/lang/Thread", "<init>",
> - "(Ljava/lang/VMThread;Ljava/lang/String;IZ)V",
> ACC_VIRTUAL);
> + "(Ljava/lang/ThreadGroup;Ljava/lang/String;)V", ACC_VIRTUAL);
>
> - initVMThread =
> - UPCALL_METHOD(loader, "java/lang/VMThread", "<init>",
> - "(Ljava/lang/Thread;)V", ACC_VIRTUAL);
> + runThread =
> + UPCALL_METHOD(loader, "java/lang/Thread", "run", "()V", ACC_VIRTUAL);
>
> - runVMThread =
> - UPCALL_METHOD(loader, "java/lang/VMThread", "run", "()V",
> ACC_VIRTUAL);
> + // TODO: ...And what to do with this?
> + //inheritableThreadLocal =
> + // UPCALL_CLASS(loader, "java/lang/InheritableThreadLocal");
> + //
> + //finaliseCreateInitialThread =
> + // UPCALL_METHOD(loader, "java/lang/InheritableThreadLocal",
> "newChildThread",
> + // "(Ljava/lang/Thread;)V", ACC_STATIC);
>
>
> groupAddThread =
> @@ -890,39 +773,32 @@ void
> Classpath::initialiseClasspath(JnjvmClassLoader* loader) {
> UPCALL_METHOD(loader, "java/lang/ThreadGroup", "<init>",
> "()V", ACC_VIRTUAL);
>
> + initNamedGroup =
> + UPCALL_METHOD(loader, "java/lang/ThreadGroup", "<init>",
> + "(Ljava/lang/ThreadGroup;Ljava/lang/String;)V",
> ACC_VIRTUAL);
> +
> groupName =
> UPCALL_FIELD(loader, "java/lang/ThreadGroup", "name",
> "Ljava/lang/String;",
> ACC_VIRTUAL);
> -
> - threadName =
> - UPCALL_FIELD(loader, "java/lang/Thread", "name",
> "Ljava/lang/String;",
> - ACC_VIRTUAL);
> -
> -
> priority =
> UPCALL_FIELD(loader, "java/lang/Thread", "priority", "I",
> ACC_VIRTUAL);
>
> daemon =
> UPCALL_FIELD(loader, "java/lang/Thread", "daemon", "Z", ACC_VIRTUAL);
>
> + eetop =
> + UPCALL_FIELD(loader, "java/lang/Thread", "eetop", "J", ACC_VIRTUAL);
> +
> + threadStatus =
> + UPCALL_FIELD(loader, "java/lang/Thread", "threadStatus", "I",
> ACC_VIRTUAL);
> group =
> UPCALL_FIELD(loader, "java/lang/Thread", "group",
> "Ljava/lang/ThreadGroup;", ACC_VIRTUAL);
>
> - running =
> - UPCALL_FIELD(loader, "java/lang/VMThread", "running", "Z",
> ACC_VIRTUAL);
> -
> threadGroup =
> UPCALL_CLASS(loader, "java/lang/ThreadGroup");
>
> - rootGroup =
> - UPCALL_FIELD(loader, "java/lang/ThreadGroup", "root",
> - "Ljava/lang/ThreadGroup;", ACC_STATIC);
> -
> - vmThread =
> - UPCALL_FIELD(loader, "java/lang/Thread", "vmThread",
> - "Ljava/lang/VMThread;", ACC_VIRTUAL);
> -
> + // TODO: Verify this works in OpenJDK, merged from upstream
> getUncaughtExceptionHandler =
> UPCALL_METHOD(loader, "java/lang/Thread",
> "getUncaughtExceptionHandler",
> "()Ljava/lang/Thread$UncaughtExceptionHandler;",
> ACC_VIRTUAL);
> @@ -954,55 +830,11 @@ void
> Classpath::initialiseClasspath(JnjvmClassLoader* loader) {
> // Don't compile methods here, we still don't know where to allocate Java
> // strings.
>
> - JavaMethod* getEnv =
> - UPCALL_METHOD(loader, "java/lang/VMSystem", "getenv",
> - "(Ljava/lang/String;)Ljava/lang/String;", ACC_STATIC);
> - getEnv->setNative();
> -
> - JavaMethod* getCallingClass =
> - UPCALL_METHOD(loader, "gnu/classpath/VMStackWalker",
> "getCallingClass",
> - "()Ljava/lang/Class;", ACC_STATIC);
> - getCallingClass->setNative();
> -
> - JavaMethod* getCallingClassLoader =
> - UPCALL_METHOD(loader, "gnu/classpath/VMStackWalker",
> "getCallingClassLoader",
> - "()Ljava/lang/ClassLoader;", ACC_STATIC);
> - getCallingClassLoader->setNative();
> -
> - JavaMethod* firstNonNullClassLoader =
> - UPCALL_METHOD(loader, "gnu/classpath/VMStackWalker",
> "firstNonNullClassLoader",
> - "()Ljava/lang/ClassLoader;", ACC_STATIC);
> - firstNonNullClassLoader->setNative();
> -
> JavaMethod* getCallerClass =
> UPCALL_METHOD(loader, "sun/reflect/Reflection", "getCallerClass",
> "(I)Ljava/lang/Class;", ACC_STATIC);
> getCallerClass->setNative();
>
> - JavaMethod* postProperties =
> - UPCALL_METHOD(loader, "gnu/classpath/VMSystemProperties", "postInit",
> - "(Ljava/util/Properties;)V", ACC_STATIC);
> - postProperties->setNative();
> -
> - // Also implement these twos, implementation in GNU Classpath
> 0.97.2 is buggy.
> - JavaMethod* getAnnotation =
> - UPCALL_METHOD(loader, "java/lang/reflect/AccessibleObject",
> "getAnnotation",
> - "(Ljava/lang/Class;)Ljava/lang/annotation/Annotation;",
> - ACC_VIRTUAL);
> - getAnnotation->setNative();
> -
> - JavaMethod* getAnnotations =
> - UPCALL_METHOD(loader, "java/lang/reflect/AccessibleObject",
> - "getDeclaredAnnotations",
> - "()[Ljava/lang/annotation/Annotation;",
> - ACC_VIRTUAL);
> - getAnnotations->setNative();
> -
> - JavaMethod* getBootPackages =
> - UPCALL_METHOD(loader, "java/lang/VMClassLoader", "getBootPackages",
> - "()[Ljava/lang/String;", ACC_STATIC);
> - getBootPackages->setNative();
> -
>
> //===----------------------------------------------------------------------===//
> //
> // To make classes non GC-allocated, we have to bypass the tracer
> functions of
> @@ -1028,9 +860,10 @@ void
> Classpath::initialiseClasspath(JnjvmClassLoader* loader) {
> (word_t)nativeJavaObjectFieldTracer,
> "nativeJavaObjectFieldTracer");
>
> - newVMThread->getVirtualVT()->setNativeTracer(
> - (word_t)nativeJavaObjectVMThreadTracer,
> - "nativeJavaObjectVMThreadTracer");
> + //TODO: What to do here? Remove?
>
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.
You should be careful about this, because it may break the GC if you do
something wrong.
+ //newVMThread->getVirtualVT()->setNativeTracer(
> + // (word_t)nativeJavaObjectVMThreadTracer,
> + // "nativeJavaObjectVMThreadTracer");
>
> newReference = UPCALL_CLASS(loader, "java/lang/ref/Reference");
>
> @@ -1070,7 +903,24 @@ void
> Classpath::initialiseClasspath(JnjvmClassLoader* loader) {
> }
>
> void Classpath::InitializeSystem(Jnjvm * jvm) {
> - // TODO: Implement me!
> + JavaObject * exc = NULL;
> + llvm_gcroot(exc, 0);
> + TRY {
> + initSystem->invokeIntStatic(jvm, SystemClass);
> + } CATCH {
> + exc = JavaThread::get()->pendingException;
> + } END_CATCH;
> +
> + if (exc) {
> + fprintf(stderr, "Exception %s while initializing system.\n",
> + UTF8Buffer(JavaObject::getClass(exc)->name).cString());
> + JavaString * s =
> (JavaString*)detailMessage->getInstanceObjectField(exc);
> + if (s) {
> + fprintf(stderr, "Exception Message: \"%s\"\n",
> + JavaString::strToAsciiz(s));
> + }
> + abort();
> + }
> }
>
>
> diff --git a/lib/J3/ClassLib/OpenJDK/JavaUpcalls.h
> b/lib/J3/ClassLib/OpenJDK/JavaUpcalls.h
> index 7bb5c8e..e554dc8 100644
> --- a/lib/J3/ClassLib/OpenJDK/JavaUpcalls.h
> +++ b/lib/J3/ClassLib/OpenJDK/JavaUpcalls.h
> @@ -70,6 +70,8 @@ public:
> ISOLATE_STATIC UserClass* newString;
> ISOLATE_STATIC UserClass* newClass;
> ISOLATE_STATIC UserClass* newThrowable;
> + ISOLATE_STATIC JavaField* backtrace;
> + ISOLATE_STATIC JavaField* detailMessage;
> ISOLATE_STATIC UserClass* newException;
> ISOLATE_STATIC JavaMethod* initClass;
> ISOLATE_STATIC JavaMethod* initClassWithProtectionDomain;
> @@ -92,17 +94,11 @@ public:
> ISOLATE_STATIC JavaField* fieldSlot;
> ISOLATE_STATIC UserClassArray* classArrayClass;
> ISOLATE_STATIC JavaMethod* loadInClassLoader;
> - ISOLATE_STATIC JavaMethod* initVMThrowable;
> - ISOLATE_STATIC JavaField* vmDataVMThrowable;
> - ISOLATE_STATIC UserClass* newVMThrowable;
> ISOLATE_STATIC JavaField* bufferAddress;
> - ISOLATE_STATIC JavaField* dataPointer32;
> - ISOLATE_STATIC JavaField* dataPointer64;
> - ISOLATE_STATIC UserClass* newPointer32;
> - ISOLATE_STATIC UserClass* newPointer64;
> ISOLATE_STATIC UserClass* newDirectByteBuffer;
> ISOLATE_STATIC JavaMethod* InitDirectByteBuffer;
> ISOLATE_STATIC JavaField* vmdataClassLoader;
> + ISOLATE_STATIC UserClass* cloneableClass;
> ISOLATE_STATIC UserClass* enumClass;
>
> ISOLATE_STATIC JavaField* boolValue;
> @@ -133,24 +129,19 @@ public:
> ISOLATE_STATIC UserClass* vmStackWalker;
>
> ISOLATE_STATIC UserClass* newThread;
> - ISOLATE_STATIC UserClass* newVMThread;
> - ISOLATE_STATIC JavaField* assocThread;
> - ISOLATE_STATIC JavaField* vmdataVMThread;
> - ISOLATE_STATIC JavaMethod* finaliseCreateInitialThread;
> ISOLATE_STATIC JavaMethod* initThread;
> - ISOLATE_STATIC JavaMethod* initVMThread;
> - ISOLATE_STATIC JavaMethod* runVMThread;
> + ISOLATE_STATIC JavaMethod* runThread;
> + ISOLATE_STATIC JavaMethod* finaliseCreateInitialThread;
> ISOLATE_STATIC JavaMethod* groupAddThread;
> - ISOLATE_STATIC JavaField* threadName;
> ISOLATE_STATIC JavaField* groupName;
> ISOLATE_STATIC JavaMethod* initGroup;
> + ISOLATE_STATIC JavaMethod* initNamedGroup;
> ISOLATE_STATIC JavaField* priority;
> ISOLATE_STATIC JavaField* daemon;
> + ISOLATE_STATIC JavaField* eetop;
> ISOLATE_STATIC JavaField* group;
> - ISOLATE_STATIC JavaField* running;
> + ISOLATE_STATIC JavaField* threadStatus;
> ISOLATE_STATIC UserClass* threadGroup;
> - ISOLATE_STATIC JavaField* rootGroup;
> - ISOLATE_STATIC JavaField* vmThread;
> ISOLATE_STATIC JavaMethod* getUncaughtExceptionHandler;
> ISOLATE_STATIC JavaMethod* uncaughtException;
> ISOLATE_STATIC UserClass* inheritableThreadLocal;
> @@ -188,6 +179,7 @@ public:
> ISOLATE_STATIC UserClass* UnknownError;
> ISOLATE_STATIC UserClass* ClassNotFoundException;
> ISOLATE_STATIC UserClass* ArithmeticException;
> + ISOLATE_STATIC UserClass* CloneNotSupportedException;
>
> ISOLATE_STATIC JavaMethod* InitInvocationTargetException;
> ISOLATE_STATIC JavaMethod* InitArrayStoreException;
> @@ -221,10 +213,11 @@ public:
> ISOLATE_STATIC JavaMethod* InitUnknownError;
> ISOLATE_STATIC JavaMethod* InitClassNotFoundException;
> ISOLATE_STATIC JavaMethod* InitArithmeticException;
> + ISOLATE_STATIC JavaMethod* InitCloneNotSupportedException;
>
> ISOLATE_STATIC JavaMethod* SystemArraycopy;
> - ISOLATE_STATIC JavaMethod* VMSystemArraycopy;
> ISOLATE_STATIC Class* SystemClass;
> + ISOLATE_STATIC JavaMethod* initSystem;
>
> ISOLATE_STATIC JavaMethod* IntToString;
>
> --
> 1.7.5.1
> _______________________________________________
> vmkit-commits mailing list
> vmkit-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/vmkit-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/vmkit-commits/attachments/20111027/0bead19f/attachment.html>
More information about the vmkit-commits
mailing list