[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