[vmkit-commits] [PATCH] Update OpenJDK's classpath reflect--fix field layout and class mapping
Will Dietz
wdietz2 at illinois.edu
Thu Oct 27 13:02:22 PDT 2011
Nevermind. From what you said about the VMThread tracing I think
things on that front clicked, and this is all wrong now :).
Still need to tackle mapping various objects to their internal
representation, but for example realizing that the
Object/Class/Method/Constructor are explicitly not GC-allocated makes
that easier.
However the field layout is wrong, and the protection domain is wrong...
I'll get back to you :).
~Will
On Wed, Oct 26, 2011 at 9:17 PM, Will Dietz <wdietz2 at illinois.edu> wrote:
> Inlined below.
>
> This raises a question that I'm not sure I have a good answer to in
> general: how to replace the various 'vmdata' mappings that GNU
> Classpath so nicely provides?
>
> Here I stash things in a static map, and it seems to work fine. However:
> a)where does the map really belong? The Jnjvm?
> b)seems like a bad idea to put GC'd pointers in a stl container, but I
> could be wrong.
>
> Is there a general way to map /from/ a JavaObject?
>
> We have this issue with java.lang.Thread -> JavaThread, and
> java.lang.ClassLoader -> JnjvmClassLoader (don't bother with
> VMClassLoader intermediate in OpenJDK port, maybe that's a mistake),
> so this is worth discussing/solving.
>
> However those instances I'm able to abuse existing fields ('eetop' for
> JavaThread, and 'classes' for ClassLoader), and the biggest issues
> there seems to be ensuring that plays nice with GC stuff.
>
> Anyway, thoughts welcome :).
>
> ~Will
>
>
> From 4e25b2c950aff018261054ca13baeeadb72d6df1 Mon Sep 17 00:00:00 2001
> From: Will Dietz <w at wdtz.org>
> Date: Wed, 26 Oct 2011 18:23:38 -0500
> Subject: [PATCH 1/2] Update classpathreflect--field layout, class mapping.
>
> ---
> lib/J3/ClassLib/OpenJDK/ClasspathReflect.cpp | 1 +
> lib/J3/ClassLib/OpenJDK/ClasspathReflect.h | 47 ++++++++-----------------
> 2 files changed, 16 insertions(+), 32 deletions(-)
>
> diff --git a/lib/J3/ClassLib/OpenJDK/ClasspathReflect.cpp
> b/lib/J3/ClassLib/OpenJDK/ClasspathReflect.cpp
> index 3d69fa4..31dd417 100644
> --- a/lib/J3/ClassLib/OpenJDK/ClasspathReflect.cpp
> +++ b/lib/J3/ClassLib/OpenJDK/ClasspathReflect.cpp
> @@ -14,6 +14,7 @@
>
> namespace j3 {
>
> +std::map<JavaObjectClass*, UserCommonClass*> JavaObjectClass::ClassMap;
> JavaMethod* JavaObjectConstructor::getInternalMethod(JavaObjectConstructor*
> self) {
> llvm_gcroot(self, 0);
> UserCommonClass* cls = JavaObjectClass::getClass(self->declaringClass);
> diff --git a/lib/J3/ClassLib/OpenJDK/ClasspathReflect.h
> b/lib/J3/ClassLib/OpenJDK/ClasspathReflect.h
> index 08042b3..101e726 100644
> --- a/lib/J3/ClassLib/OpenJDK/ClasspathReflect.h
> +++ b/lib/J3/ClassLib/OpenJDK/ClasspathReflect.h
> @@ -16,25 +16,27 @@
> #include "JavaObject.h"
> #include "JavaThread.h"
>
> +#include <map>
> namespace j3 {
>
> class JavaObjectClass : public JavaObject {
> private:
> - JavaObject* signers;
> - JavaObject* pd;
> - UserCommonClass* vmdata;
> + static std::map<JavaObjectClass*, UserCommonClass*> ClassMap;
> JavaObject* constructor;
> + JavaObject* newInstanceCallerCache;
> + JavaObject* name;
> + JavaObject* pd;
>
> public:
>
> static UserCommonClass* getClass(JavaObjectClass* cl) {
> llvm_gcroot(cl, 0);
> - return cl->vmdata;
> + return ClassMap[cl];
> }
>
> static void setClass(JavaObjectClass* cl, UserCommonClass* vmdata) {
> llvm_gcroot(cl, 0);
> - cl->vmdata = vmdata;
> + ClassMap[cl] = vmdata;
> }
>
> static void setProtectionDomain(JavaObjectClass* cl, JavaObject* pd) {
> @@ -50,11 +52,12 @@ public:
> }
>
> static void staticTracer(JavaObjectClass* obj, word_t closure) {
> - mvm::Collector::markAndTrace(obj, &obj->pd, closure);
> - mvm::Collector::markAndTrace(obj, &obj->signers, closure);
> mvm::Collector::markAndTrace(obj, &obj->constructor, closure);
> - if (obj->vmdata) {
> - JavaObject** Obj = obj->vmdata->classLoader->getJavaClassLoaderPtr();
> + mvm::Collector::markAndTrace(obj, &obj->newInstanceCallerCache, closure);
> + mvm::Collector::markAndTrace(obj, &obj->name, closure);
> + mvm::Collector::markAndTrace(obj, &obj->pd, closure);
> + if (ClassMap[obj]) {
> + JavaObject** Obj = ClassMap[obj]->classLoader->getJavaClassLoaderPtr();
> if (*Obj) mvm::Collector::markAndTraceRoot(Obj, closure);
> }
> }
> @@ -64,8 +67,8 @@ class JavaObjectField : public JavaObject {
> private:
> uint8 flag;
> JavaObjectClass* declaringClass;
> - JavaObject* name;
> uint32 slot;
> + JavaObject* name;
>
> public:
>
> @@ -92,8 +95,8 @@ class JavaObjectMethod : public JavaObject {
> private:
> uint8 flag;
> JavaObjectClass* declaringClass;
> - JavaObject* name;
> uint32 slot;
> + JavaObject* name;
>
> public:
>
> @@ -133,32 +136,12 @@ public:
>
> };
>
> -class JavaObjectVMThread : public JavaObject {
> -private:
> - JavaObject* thread;
> - bool running;
> - JavaThread* vmdata;
> -
> -public:
> - static void staticTracer(JavaObjectVMThread* obj, word_t closure) {
> - mvm::Collector::markAndTrace(obj, &obj->thread, closure);
> - }
> -
> - static void setVmdata(JavaObjectVMThread* vmthread,
> - JavaThread* internal_thread) {
> - llvm_gcroot(vmthread, 0);
> - vmthread->vmdata = internal_thread;
> - }
> -
> -};
> -
> -
> class JavaObjectThrowable : public JavaObject {
> private:
> + JavaObject* backtrace;
> JavaObject* detailedMessage;
> JavaObject* cause;
> JavaObject* stackTrace;
> - JavaObject* vmState;
>
> public:
>
> --
> 1.7.5.1
>
More information about the vmkit-commits
mailing list