[vmkit-commits] [vmkit] r57648 - in /vmkit/trunk/lib: JnJVM/Classpath/ClasspathReflect.h JnJVM/Classpath/ClasspathVMClass.cpp JnJVM/Classpath/ClasspathVMStackWalker.cpp JnJVM/VMCore/JavaUpcalls.cpp JnJVM/VMCore/Jnjvm.cpp JnJVM/VMCore/JnjvmClassLoader.cpp JnJVM/VMCore/Makefile JnJVM/VMCore/NativeUtil.cpp Mvm/BoehmGC/MvmGC.h Mvm/GCMmap2/MvmGC.h
Nicolas Geoffray
nicolas.geoffray at lip6.fr
Thu Oct 16 13:03:18 PDT 2008
Author: geoffray
Date: Thu Oct 16 15:03:17 2008
New Revision: 57648
URL: http://llvm.org/viewvc/llvm-project?rev=57648&view=rev
Log:
Change the tracer functions of reflection classes so that
they trace the classloader instead of the class/field/method.
Added:
vmkit/trunk/lib/JnJVM/Classpath/ClasspathReflect.h
Modified:
vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClass.cpp
vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMStackWalker.cpp
vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp
vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp
vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp
vmkit/trunk/lib/JnJVM/VMCore/Makefile
vmkit/trunk/lib/JnJVM/VMCore/NativeUtil.cpp
vmkit/trunk/lib/Mvm/BoehmGC/MvmGC.h
vmkit/trunk/lib/Mvm/GCMmap2/MvmGC.h
Added: vmkit/trunk/lib/JnJVM/Classpath/ClasspathReflect.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathReflect.h?rev=57648&view=auto
==============================================================================
--- vmkit/trunk/lib/JnJVM/Classpath/ClasspathReflect.h (added)
+++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathReflect.h Thu Oct 16 15:03:17 2008
@@ -0,0 +1,97 @@
+//===------ ClasspathReflect.h - GNU classpath definitions of ----------------//
+// java/lang/Class, java/lang/reflect/Field, java/lang/reflect/Method and ----//
+// java/lang/reflect/Constructor as compiled by JnJVM. -----------------------//
+//
+// JnJVM
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef JNJVM_CLASSPATH_REFLECT_H
+#define JNJVM_CLASSPATH_REFLECT_H
+
+#include "MvmGC.h"
+
+#include <JavaClass.h>
+#include <JavaObject.h>
+
+namespace jnjvm {
+
+class JavaObjectClass : public JavaObject {
+private:
+ JavaObject* signers;
+ JavaObject* pd;
+ UserCommonClass* vmdata;
+ JavaObject* constructor;
+
+public:
+
+ UserCommonClass* getClass() {
+ return vmdata;
+ }
+
+ static void STATIC_TRACER(JavaObjectClass) {
+ obj->JavaObject::CALL_TRACER;
+ obj->pd->MARK_AND_TRACE;
+ obj->signers->MARK_AND_TRACE;
+ obj->constructor->MARK_AND_TRACE;
+ obj->vmdata->classLoader->MARK_AND_TRACE;
+ }
+};
+
+class JavaObjectField : public JavaObject {
+private:
+ uint8 flag;
+ JavaObject* declaringClass;
+ JavaObject* name;
+ JavaField* slot;
+
+public:
+
+ static void STATIC_TRACER(JavaObjectField) {
+ obj->JavaObject::CALL_TRACER;
+ obj->name->MARK_AND_TRACE;
+ obj->declaringClass->MARK_AND_TRACE;
+ obj->slot->classDef->classLoader->MARK_AND_TRACE;
+ }
+
+};
+
+class JavaObjectMethod : public JavaObject {
+private:
+ uint8 flag;
+ JavaObject* declaringClass;
+ JavaObject* name;
+ JavaMethod* slot;
+
+public:
+
+ static void STATIC_TRACER(JavaObjectMethod) {
+ obj->JavaObject::CALL_TRACER;
+ obj->name->MARK_AND_TRACE;
+ obj->declaringClass->MARK_AND_TRACE;
+ obj->slot->classDef->classLoader->MARK_AND_TRACE;
+ }
+
+};
+
+class JavaObjectConstructor : public JavaObject {
+private:
+ uint8 flag;
+ JavaObject* clazz;
+ JavaMethod* slot;
+
+public:
+ static void STATIC_TRACER(JavaObjectConstructor) {
+ obj->JavaObject::CALL_TRACER;
+ obj->clazz->MARK_AND_TRACE;
+ obj->slot->classDef->classLoader->MARK_AND_TRACE;
+ }
+
+};
+
+}
+
+#endif
Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClass.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClass.cpp?rev=57648&r1=57647&r2=57648&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClass.cpp (original)
+++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClass.cpp Thu Oct 16 15:03:17 2008
@@ -11,6 +11,7 @@
#include "types.h"
+#include "ClasspathReflect.h"
#include "JavaAccess.h"
#include "JavaArray.h"
#include "JavaClass.h"
@@ -35,10 +36,7 @@
#endif
jobject klass) {
- Jnjvm* vm = JavaThread::get()->isolate;
- JavaField* field = vm->upcalls->vmdataClass;
- UserCommonClass* cl =
- (UserCommonClass*)field->getObjectField((JavaObject*)klass);
+ UserCommonClass* cl = ((JavaObjectClass*)klass)->getClass();
return cl->isArray();
@@ -158,8 +156,7 @@
#endif
jobject Cl) {
Jnjvm* vm = JavaThread::get()->isolate;
- UserCommonClass* cl =
- (UserCommonClass*)vm->upcalls->vmdataClass->getObjectField((JavaObject*)Cl);
+ UserCommonClass* cl = ((JavaObjectClass*)Cl)->getClass();
const UTF8* iname = cl->getName();
const UTF8* res = iname->internalToJava(vm, 0, iname->size);
@@ -173,9 +170,7 @@
jclass clazz,
#endif
jclass Cl) {
- Jnjvm* vm = JavaThread::get()->isolate;
- UserCommonClass* cl =
- (UserCommonClass*)vm->upcalls->vmdataClass->getObjectField((JavaObject*)Cl);
+ UserCommonClass* cl = ((JavaObjectClass*)Cl)->getClass();
return cl->isPrimitive();
}
@@ -199,8 +194,7 @@
#endif
jclass Cl) {
Jnjvm* vm = JavaThread::get()->isolate;
- UserCommonClass* cl =
- (UserCommonClass*)vm->upcalls->vmdataClass->getObjectField((JavaObject*)Cl);
+ UserCommonClass* cl = ((JavaObjectClass*)Cl)->getClass();
if (cl->isArray()) {
UserCommonClass* bc = ((UserClassArray*)cl)->baseClass();
@@ -216,9 +210,7 @@
jclass clazz,
#endif
jclass Cl) {
- Jnjvm* vm = JavaThread::get()->isolate;
- UserCommonClass* cl =
- (UserCommonClass*)vm->upcalls->vmdataClass->getObjectField((JavaObject*)Cl);
+ UserCommonClass* cl = ((JavaObjectClass*)Cl)->getClass();
return (jobject)cl->classLoader->getJavaClassLoader();
}
@@ -228,11 +220,8 @@
jclass clazz,
#endif
jclass Cl1, jclass Cl2) {
- Jnjvm* vm = JavaThread::get()->isolate;
- UserCommonClass* cl1 =
- (UserCommonClass*)vm->upcalls->vmdataClass->getObjectField((JavaObject*)Cl1);
- UserCommonClass* cl2 =
- (UserCommonClass*)vm->upcalls->vmdataClass->getObjectField((JavaObject*)Cl2);
+ UserCommonClass* cl1 = ((JavaObjectClass*)Cl1)->getClass();
+ UserCommonClass* cl2 = ((JavaObjectClass*)Cl2)->getClass();
cl2->resolveClass();
return cl2->isAssignableFrom(cl1);
@@ -246,8 +235,7 @@
#endif
jclass Cl) {
Jnjvm* vm = JavaThread::get()->isolate;
- UserCommonClass* cl =
- (UserCommonClass*)vm->upcalls->vmdataClass->getObjectField((JavaObject*)Cl);
+ UserCommonClass* cl = ((JavaObjectClass*)Cl)->getClass();
if (cl->isInterface())
return 0;
else {
@@ -263,9 +251,7 @@
jclass clazz,
#endif
jclass Cl, jobject obj) {
- Jnjvm* vm = JavaThread::get()->isolate;
- UserCommonClass* cl =
- (UserCommonClass*)vm->upcalls->vmdataClass->getObjectField((JavaObject*)Cl);
+ UserCommonClass* cl = ((JavaObjectClass*)Cl)->getClass();
return ((JavaObject*)obj)->instanceOf(cl);
}
Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMStackWalker.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMStackWalker.cpp?rev=57648&r1=57647&r2=57648&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMStackWalker.cpp (original)
+++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMStackWalker.cpp Thu Oct 16 15:03:17 2008
@@ -14,6 +14,7 @@
#include "mvm/JIT.h"
+#include "ClasspathReflect.h"
#include "JavaArray.h"
#include "JavaClass.h"
#include "JavaJIT.h"
@@ -138,10 +139,8 @@
jclass clazz,
#endif
jclass _Cl) {
- Jnjvm* vm = JavaThread::get()->isolate;
JavaObject* Cl = (JavaObject*)_Cl;
- JavaField* field = vm->upcalls->vmdataClass;
- UserCommonClass* cl = (UserCommonClass*)field->getObjectField(Cl);
+ UserCommonClass* cl = ((JavaObjectClass*)Cl)->getClass();
return (jobject)cl->classLoader->getJavaClassLoader();
}
Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp?rev=57648&r1=57647&r2=57648&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp Thu Oct 16 15:03:17 2008
@@ -11,6 +11,7 @@
#include "mvm/JIT.h"
+#include "ClasspathReflect.h"
#include "JavaAccess.h"
#include "JavaClass.h"
#include "JavaJIT.h"
@@ -613,9 +614,6 @@
}
extern "C" uint8 isArray(JavaObject* klass) {
- Jnjvm* vm = JavaThread::get()->isolate;
- UserCommonClass* cl =
- (UserCommonClass*)((vm->upcalls->vmdataClass->getObjectField(klass)));
-
+ UserCommonClass* cl = ((JavaObjectClass*)klass)->getClass();
return (uint8)cl->isArray();
}
Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp?rev=57648&r1=57647&r2=57648&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Thu Oct 16 15:03:17 2008
@@ -20,6 +20,7 @@
#include "mvm/JIT.h"
#include "mvm/Threads/Thread.h"
+#include "ClasspathReflect.h"
#include "JavaArray.h"
#include "JavaClass.h"
#include "JavaConstantPool.h"
@@ -672,14 +673,35 @@
#define LOAD_CLASS(cl) \
cl->resolveClass(); \
cl->initialiseClass(this);
-
- LOAD_CLASS(upcalls->newClass);
- LOAD_CLASS(upcalls->newConstructor);
+
+ // If a string belongs to the vm hashmap, we must remove it when
+ // it's destroyed. So we change the destructor of java.lang.String
+ // to perform this action.
LOAD_CLASS(upcalls->newString);
uintptr_t* ptr = ((uintptr_t*)upcalls->newString->getVirtualVT());
- ptr[0] = (uintptr_t)JavaString::stringDestructor;
+ ptr[VT_DESTRUCTOR_OFFSET] = (uintptr_t)JavaString::stringDestructor;
+
+ // To make classes non GC-allocated, we have to bypass the tracer
+ // functions of java.lang.Class, java.lang.reflect.Field,
+ // java.lang.reflect.Method and java.lang.reflect.constructor. The new
+ // tracer functions trace the classloader instead of the class/field/method.
+ LOAD_CLASS(upcalls->newClass);
+ ptr = ((uintptr_t*)upcalls->newClass->getVirtualVT());
+ ptr[VT_TRACER_OFFSET] = (uintptr_t)JavaObjectClass::staticTracer;
+
+ LOAD_CLASS(upcalls->newConstructor);
+ ptr = ((uintptr_t*)upcalls->newConstructor->getVirtualVT());
+ ptr[VT_TRACER_OFFSET] = (uintptr_t)JavaObjectConstructor::staticTracer;
+
+
LOAD_CLASS(upcalls->newMethod);
+ ptr = ((uintptr_t*)upcalls->newMethod->getVirtualVT());
+ ptr[VT_TRACER_OFFSET] = (uintptr_t)JavaObjectMethod::staticTracer;
+
LOAD_CLASS(upcalls->newField);
+ ptr = ((uintptr_t*)upcalls->newField->getVirtualVT());
+ ptr[VT_TRACER_OFFSET] = (uintptr_t)JavaObjectField::staticTracer;
+
LOAD_CLASS(upcalls->newStackTraceElement);
LOAD_CLASS(upcalls->newVMThrowable);
LOAD_CLASS(upcalls->boolClass);
Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp?rev=57648&r1=57647&r2=57648&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Thu Oct 16 15:03:17 2008
@@ -15,6 +15,7 @@
#include "mvm/Allocator.h"
+#include "ClasspathReflect.h"
#include "JavaClass.h"
#include "JavaConstantPool.h"
#include "JavaThread.h"
@@ -150,7 +151,7 @@
JavaObject* obj = (JavaObject*)
upcalls->loadInClassLoader->invokeJavaObjectVirtual(isolate, forCtp,
javaLoader, str);
- cl = (UserCommonClass*)(upcalls->vmdataClass->getObjectField(obj));
+ cl = (UserCommonClass*)((JavaObjectClass*)obj)->getClass();
}
if (cl) assert(!cl->isArray());
Modified: vmkit/trunk/lib/JnJVM/VMCore/Makefile
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Makefile?rev=57648&r1=57647&r2=57648&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/Makefile (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/Makefile Thu Oct 16 15:03:17 2008
@@ -14,7 +14,7 @@
include $(LEVEL)/Makefile.common
-CXX.Flags += -I$(PROJ_OBJ_DIR)/../LLVMRuntime $(CLASSPATH_FLAGS)
+CXX.Flags += -I$(PROJ_OBJ_DIR)/../LLVMRuntime -I$(PROJ_SRC_DIR)/../Classpath $(CLASSPATH_FLAGS)
ifeq ($(ISOLATE_BUILD), 1)
CXX.Flags += -I$(PROJ_SRC_DIR)/../Isolate
Modified: vmkit/trunk/lib/JnJVM/VMCore/NativeUtil.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/NativeUtil.cpp?rev=57648&r1=57647&r2=57648&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/NativeUtil.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/NativeUtil.cpp Thu Oct 16 15:03:17 2008
@@ -11,6 +11,7 @@
#include <stdlib.h>
#include <string.h>
+#include "ClasspathReflect.h"
#include "JavaArray.h"
#include "JavaClass.h"
#include "JavaConstantPool.h"
@@ -227,9 +228,7 @@
#undef PRE_LEN
UserCommonClass* NativeUtil::resolvedImplClass(Jnjvm* vm, jclass clazz, bool doClinit) {
- JavaObject *Cl = (JavaObject*)clazz;
- UserCommonClass* cl =
- (UserCommonClass*)vm->upcalls->vmdataClass->getObjectField(Cl);
+ UserCommonClass* cl = ((JavaObjectClass*)clazz)->getClass();
cl->resolveClass();
if (doClinit) cl->initialiseClass(vm);
return cl;
Modified: vmkit/trunk/lib/Mvm/BoehmGC/MvmGC.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/BoehmGC/MvmGC.h?rev=57648&r1=57647&r2=57648&view=diff
==============================================================================
--- vmkit/trunk/lib/Mvm/BoehmGC/MvmGC.h (original)
+++ vmkit/trunk/lib/Mvm/BoehmGC/MvmGC.h Thu Oct 16 15:03:17 2008
@@ -17,6 +17,7 @@
//#include "gc/gc_local_alloc.h"
#include "gc/gc.h"
+#define STATIC_TRACER(type) staticTracer(type* obj)
#define TRACER tracer()
#define PARENT_TRACER tracer()
#define MARK_AND_TRACE markAndTrace()
Modified: vmkit/trunk/lib/Mvm/GCMmap2/MvmGC.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/GCMmap2/MvmGC.h?rev=57648&r1=57647&r2=57648&view=diff
==============================================================================
--- vmkit/trunk/lib/Mvm/GCMmap2/MvmGC.h (original)
+++ vmkit/trunk/lib/Mvm/GCMmap2/MvmGC.h Thu Oct 16 15:03:17 2008
@@ -21,10 +21,12 @@
#ifdef MULTIPLE_GC
+#define STATIC_TRACER(type) staticTracer(type* obj, void* GC)
#define TRACER tracer(void* GC)
#define CALL_TRACER tracer(GC)
#define MARK_AND_TRACE markAndTrace((Collector*)GC)
#else
+#define STATIC_TRACER(type) staticTracer(type* obj)
#define TRACER tracer()
#define CALL_TRACER tracer()
#define MARK_AND_TRACE markAndTrace()
More information about the vmkit-commits
mailing list