[vmkit-commits] [vmkit] r62320 - in /vmkit/trunk/lib/JnJVM: Classpath/ClasspathConstructor.cpp Classpath/ClasspathField.cpp Classpath/ClasspathMethod.cpp Classpath/ClasspathReflect.h Classpath/ClasspathVMClass.cpp VMCore/JnjvmModule.cpp VMCore/JnjvmModule.h

Nicolas Geoffray nicolas.geoffray at lip6.fr
Fri Jan 16 06:55:29 PST 2009


Author: geoffray
Date: Fri Jan 16 08:55:27 2009
New Revision: 62320

URL: http://llvm.org/viewvc/llvm-project?rev=62320&view=rev
Log:
Use the slot field of reflect classes as an index in the method or
field array. We do this because Classpath defines the slot as an int
so 64bit systems won't allow the slot field to be a pointer.


Modified:
    vmkit/trunk/lib/JnJVM/Classpath/ClasspathConstructor.cpp
    vmkit/trunk/lib/JnJVM/Classpath/ClasspathField.cpp
    vmkit/trunk/lib/JnJVM/Classpath/ClasspathMethod.cpp
    vmkit/trunk/lib/JnJVM/Classpath/ClasspathReflect.h
    vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClass.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h

Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathConstructor.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathConstructor.cpp?rev=62320&r1=62319&r2=62320&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/Classpath/ClasspathConstructor.cpp (original)
+++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathConstructor.cpp Fri Jan 16 08:55:27 2009
@@ -24,18 +24,11 @@
 
 extern "C" {
 
-// internalGetClass selects the class of a method depending on the isolate
-// environment. In a sharing environment, the class is located in the 
-// Java object. In regular environment, it is the classDef of the method.
-static UserClass* internalGetClass(Jnjvm* vm, JavaMethod* meth, jobject Meth) {
-#ifdef ISOLATE_SHARING
+static UserClass* internalGetClass(Jnjvm* vm, jobject Meth) {
   JavaField* field = vm->upcalls->constructorClass;
   JavaObject* Cl = (JavaObject*)field->getInt32Field((JavaObject*)Meth);
   UserClass* cl = (UserClass*)UserCommonClass::resolvedImplClass(vm, Cl, false);
   return cl;
-#else
-  return meth->classDef;
-#endif
 }
 
 JNIEXPORT jobject JNICALL Java_java_lang_reflect_Constructor_getParameterTypes(
@@ -50,9 +43,10 @@
 
   verifyNull(cons);
   Jnjvm* vm = JavaThread::get()->getJVM();
+  UserClass* cl = internalGetClass(vm, cons);
   JavaField* field = vm->upcalls->constructorSlot;
-  JavaMethod* meth = (JavaMethod*)(field->getInt32Field((JavaObject*)cons));
-  UserClass* cl = internalGetClass(vm, meth, cons);
+  uint32 index = (uint32)(field->getInt32Field((JavaObject*)cons));
+  JavaMethod* meth = &(cl->virtualMethods[index]);
   JnjvmClassLoader* loader = cl->classLoader;
 
   res = (jobject)meth->getParameterTypes(loader);
@@ -73,8 +67,10 @@
 
   verifyNull(cons);
   Jnjvm* vm = JavaThread::get()->getJVM();
+  UserClass* cl = internalGetClass(vm, cons);
   JavaField* field = vm->upcalls->constructorSlot;
-  JavaMethod* meth = (JavaMethod*)(field->getInt32Field((JavaObject*)cons));
+  uint32 index = (uint32)(field->getInt32Field((JavaObject*)cons));
+  JavaMethod* meth = &(cl->virtualMethods[index]);
   res = meth->access;
 
   END_NATIVE_EXCEPTION
@@ -86,14 +82,15 @@
 #ifdef NATIVE_JNI
 JNIEnv *env,
 #endif
-jobject _cons, jobject _args, jclass Clazz, jint _meth) {
+jobject _cons, jobject _args, jclass Clazz, jint index) {
 
   jobject res = 0;
 
   BEGIN_NATIVE_EXCEPTION(0)
   
   Jnjvm* vm = JavaThread::get()->getJVM();
-  JavaMethod* meth = (JavaMethod*)_meth;
+  UserClass* cl = internalGetClass(vm, _cons);
+  JavaMethod* meth = &(cl->virtualMethods[index]);
   JavaArray* args = (JavaArray*)_args;
   sint32 nbArgs = args ? args->size : 0;
   Signdef* sign = meth->getSignature();
@@ -164,9 +161,10 @@
   
   verifyNull(cons);
   Jnjvm* vm = JavaThread::get()->getJVM();
+  UserClass* cl = internalGetClass(vm, cons);
   JavaField* field = vm->upcalls->constructorSlot;
-  JavaMethod* meth = (JavaMethod*)field->getInt32Field((JavaObject*)cons);
-  UserClass* cl = internalGetClass(vm, meth, cons);
+  uint32 index = (uint32)(field->getInt32Field((JavaObject*)cons));
+  JavaMethod* meth = &(cl->virtualMethods[index]);
   JnjvmClassLoader* loader = cl->classLoader;
 
   res = (jobjectArray)meth->getExceptionTypes(loader);

Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathField.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathField.cpp?rev=62320&r1=62319&r2=62320&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/Classpath/ClasspathField.cpp (original)
+++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathField.cpp Fri Jan 16 08:55:27 2009
@@ -19,15 +19,11 @@
 extern "C" {
 
 
-static UserClass* internalGetClass(Jnjvm* vm, JavaField* field, jobject Field) {
-#ifdef ISOLATE_SHARING
+static UserClass* internalGetClass(Jnjvm* vm, jobject Field) {
   JavaField* slot = vm->upcalls->fieldClass;
   JavaObject* Cl = (JavaObject*)slot->getInt32Field((JavaObject*)Field);
   UserClass* cl = (UserClass*)UserCommonClass::resolvedImplClass(vm, Cl, false);
   return cl;
-#else
-  return field->classDef;
-#endif
 }
 
 JNIEXPORT jint JNICALL Java_java_lang_reflect_Field_getModifiersInternal(
@@ -40,8 +36,10 @@
   BEGIN_NATIVE_EXCEPTION(0)
 
   Jnjvm* vm = JavaThread::get()->getJVM();
+  UserClass* cl = internalGetClass(vm, obj);
   JavaField* slot = vm->upcalls->fieldSlot;
-  JavaField* field = (JavaField*)slot->getInt32Field((JavaObject*)obj);
+  uint32 index = (uint32)slot->getInt32Field((JavaObject*)obj);
+  JavaField* field = &(cl->virtualFields[index]);
   res = field->access;
 
   END_NATIVE_EXCEPTION
@@ -60,12 +58,13 @@
   BEGIN_NATIVE_EXCEPTION(0)
 
   Jnjvm* vm = JavaThread::get()->getJVM();
+  UserClass* cl = internalGetClass(vm, obj);
   JavaField* slot = vm->upcalls->fieldSlot;
-  JavaField* field = (JavaField*)slot->getInt32Field((JavaObject*)obj);
-  UserClass* fieldCl = internalGetClass(vm, field, obj);
-  JnjvmClassLoader* loader = fieldCl->classLoader;
-  UserCommonClass* cl = field->getSignature()->assocClass(loader);
-  res = (jclass)cl->getClassDelegatee(vm);
+  uint32 index = (uint32)slot->getInt32Field((JavaObject*)obj);
+  JavaField* field = &(cl->virtualFields[index]);
+  JnjvmClassLoader* loader = cl->classLoader;
+  UserCommonClass* fieldCl = field->getSignature()->assocClass(loader);
+  res = (jclass)fieldCl->getClassDelegatee(vm);
 
   END_NATIVE_EXCEPTION
 
@@ -83,14 +82,15 @@
   BEGIN_NATIVE_EXCEPTION(0)
 
   Jnjvm* vm = JavaThread::get()->getJVM();
+  UserClass* cl = internalGetClass(vm, obj);
   JavaField* slot = vm->upcalls->fieldSlot;
-  JavaField* field = (JavaField*)slot->getInt32Field((JavaObject*)Field);
+  uint32 index = (uint32)slot->getInt32Field((JavaObject*)obj);
+  JavaField* field = &(cl->virtualFields[index]);
   const Typedef* type = field->getSignature();
   
   void* Obj = (void*)obj;
   
   if (isStatic(field->access)) {
-    UserClass* cl = internalGetClass(vm, field, Field);
     cl->initialiseClass(vm);
     Obj = cl->getStaticInstance();
   } else {
@@ -131,13 +131,14 @@
   BEGIN_NATIVE_EXCEPTION(0)
 
   Jnjvm* vm = JavaThread::get()->getJVM();
+  UserClass* cl = internalGetClass(vm, obj);
   JavaField* slot = vm->upcalls->fieldSlot;
-  JavaField* field = (JavaField*)slot->getInt32Field((JavaObject*)Field);
+  uint32 index = (uint32)slot->getInt32Field((JavaObject*)obj);
+  JavaField* field = &(cl->virtualFields[index]);
   
   void* Obj = (void*)obj;
   
   if (isStatic(field->access)) {
-    UserClass* cl = internalGetClass(vm, field, Field);
     cl->initialiseClass(vm);
     Obj = cl->getStaticInstance();
   } else {
@@ -180,13 +181,14 @@
   BEGIN_NATIVE_EXCEPTION(0)
 
   Jnjvm* vm = JavaThread::get()->getJVM();
+  UserClass* cl = internalGetClass(vm, obj);
   JavaField* slot = vm->upcalls->fieldSlot;
-  JavaField* field = (JavaField*)slot->getInt32Field((JavaObject*)Field);
+  uint32 index = (uint32)slot->getInt32Field((JavaObject*)obj);
+  JavaField* field = &(cl->virtualFields[index]);
   
   void* Obj = (void*)obj;
   
   if (isStatic(field->access)) {
-    UserClass* cl = internalGetClass(vm, field, Field);
     cl->initialiseClass(vm);
     Obj = cl->getStaticInstance();
   } else {
@@ -221,13 +223,14 @@
   BEGIN_NATIVE_EXCEPTION(0)
   
   Jnjvm* vm = JavaThread::get()->getJVM();
+  UserClass* cl = internalGetClass(vm, obj);
   JavaField* slot = vm->upcalls->fieldSlot;
-  JavaField* field = (JavaField*)slot->getInt32Field((JavaObject*)Field);
+  uint32 index = (uint32)slot->getInt32Field((JavaObject*)obj);
+  JavaField* field = &(cl->virtualFields[index]);
   
   void* Obj = (void*)obj;
   
   if (isStatic(field->access)) {
-    UserClass* cl = internalGetClass(vm, field, Field);
     cl->initialiseClass(vm);
     Obj = cl->getStaticInstance();
   } else {
@@ -272,13 +275,14 @@
   BEGIN_NATIVE_EXCEPTION(0)
 
   Jnjvm* vm = JavaThread::get()->getJVM();
+  UserClass* cl = internalGetClass(vm, obj);
   JavaField* slot = vm->upcalls->fieldSlot;
-  JavaField* field = (JavaField*)slot->getInt32Field((JavaObject*)Field);
+  uint32 index = (uint32)slot->getInt32Field((JavaObject*)obj);
+  JavaField* field = &(cl->virtualFields[index]);
   
   void* Obj = (void*)obj;
   
   if (isStatic(field->access)) {
-    UserClass* cl = internalGetClass(vm, field, Field);
     cl->initialiseClass(vm);
     Obj = cl->getStaticInstance();
   } else {
@@ -313,13 +317,14 @@
   
   
   Jnjvm* vm = JavaThread::get()->getJVM();
+  UserClass* cl = internalGetClass(vm, obj);
   JavaField* slot = vm->upcalls->fieldSlot;
-  JavaField* field = (JavaField*)slot->getInt32Field((JavaObject*)Field);
+  uint32 index = (uint32)slot->getInt32Field((JavaObject*)obj);
+  JavaField* field = &(cl->virtualFields[index]);
   
   void* Obj = (void*)obj;
   
   if (isStatic(field->access)) {
-    UserClass* cl = internalGetClass(vm, field, Field);
     cl->initialiseClass(vm);
     Obj = cl->getStaticInstance();
   } else {
@@ -355,13 +360,14 @@
   BEGIN_NATIVE_EXCEPTION(0)
 
   Jnjvm* vm = JavaThread::get()->getJVM();
+  UserClass* cl = internalGetClass(vm, obj);
   JavaField* slot = vm->upcalls->fieldSlot;
-  JavaField* field = (JavaField*)slot->getInt32Field((JavaObject*)Field);
+  uint32 index = (uint32)slot->getInt32Field((JavaObject*)obj);
+  JavaField* field = &(cl->virtualFields[index]);
   
   void* Obj = (void*)obj;
   
   if (isStatic(field->access)) {
-    UserClass* cl = internalGetClass(vm, field, Field);
     cl->initialiseClass(vm);
     Obj = cl->getStaticInstance();
   } else {
@@ -397,13 +403,14 @@
   BEGIN_NATIVE_EXCEPTION(0)
   
   Jnjvm* vm = JavaThread::get()->getJVM();
+  UserClass* cl = internalGetClass(vm, obj);
   JavaField* slot = vm->upcalls->fieldSlot;
-  JavaField* field = (JavaField*)slot->getInt32Field((JavaObject*)Field);
+  uint32 index = (uint32)slot->getInt32Field((JavaObject*)obj);
+  JavaField* field = &(cl->virtualFields[index]);
   
   void* Obj = (void*)obj;
   
   if (isStatic(field->access)) {
-    UserClass* cl = internalGetClass(vm, field, Field);
     cl->initialiseClass(vm);
     Obj = cl->getStaticInstance();
   } else {
@@ -450,13 +457,14 @@
   BEGIN_NATIVE_EXCEPTION(0)
 
   Jnjvm* vm = JavaThread::get()->getJVM();
+  UserClass* cl = internalGetClass(vm, Field);
   JavaField* slot = vm->upcalls->fieldSlot;
-  JavaField* field = (JavaField*)slot->getInt32Field((JavaObject*)Field);
+  uint32 index = (uint32)slot->getInt32Field((JavaObject*)Field);
+  JavaField* field = &(cl->virtualFields[index]);
   
   void* Obj = (void*)_obj;
   
   if (isStatic(field->access)) {
-    UserClass* cl = internalGetClass(vm, field, Field);
     cl->initialiseClass(vm);
     Obj = cl->getStaticInstance();
   } else {
@@ -527,8 +535,10 @@
   BEGIN_NATIVE_EXCEPTION(0)
   
   Jnjvm* vm = JavaThread::get()->getJVM();
+  UserClass* cl = internalGetClass(vm, obj);
   JavaField* slot = vm->upcalls->fieldSlot;
-  JavaField* field = (JavaField*)slot->getInt32Field((JavaObject*)Field);
+  uint32 index = (uint32)slot->getInt32Field((JavaObject*)obj);
+  JavaField* field = &(cl->virtualFields[index]);
   uintptr_t buf = (uintptr_t)alloca(sizeof(uint64));
   void* _buf = (void*)buf;
   const Typedef* type = field->getSignature();
@@ -538,7 +548,6 @@
   void* Obj = (void*)obj;
   
   if (isStatic(field->access)) {
-    UserClass* cl = internalGetClass(vm, field, Field);
     cl->initialiseClass(vm);
     Obj = cl->getStaticInstance();
   } else {
@@ -580,13 +589,14 @@
   BEGIN_NATIVE_EXCEPTION(0)
 
   Jnjvm* vm = JavaThread::get()->getJVM();
+  UserClass* cl = internalGetClass(vm, obj);
   JavaField* slot = vm->upcalls->fieldSlot;
-  JavaField* field = (JavaField*)slot->getInt32Field((JavaObject*)Field);
+  uint32 index = (uint32)slot->getInt32Field((JavaObject*)obj);
+  JavaField* field = &(cl->virtualFields[index]);
   
   void* Obj = (void*)obj;
   
   if (isStatic(field->access)) {
-    UserClass* cl = internalGetClass(vm, field, Field);
     cl->initialiseClass(vm);
     Obj = cl->getStaticInstance();
   } else {
@@ -617,13 +627,14 @@
   BEGIN_NATIVE_EXCEPTION(0)
   
   Jnjvm* vm = JavaThread::get()->getJVM();
+  UserClass* cl = internalGetClass(vm, obj);
   JavaField* slot = vm->upcalls->fieldSlot;
-  JavaField* field = (JavaField*)slot->getInt32Field((JavaObject*)Field);
+  uint32 index = (uint32)slot->getInt32Field((JavaObject*)obj);
+  JavaField* field = &(cl->virtualFields[index]);
   
   void* Obj = (void*)obj;
   
   if (isStatic(field->access)) {
-    UserClass* cl = internalGetClass(vm, field, Field);
     cl->initialiseClass(vm);
     Obj = cl->getStaticInstance();
   } else {
@@ -663,13 +674,14 @@
   BEGIN_NATIVE_EXCEPTION(0)
 
   Jnjvm* vm = JavaThread::get()->getJVM();
+  UserClass* cl = internalGetClass(vm, obj);
   JavaField* slot = vm->upcalls->fieldSlot;
-  JavaField* field = (JavaField*)slot->getInt32Field((JavaObject*)Field);
+  uint32 index = (uint32)slot->getInt32Field((JavaObject*)obj);
+  JavaField* field = &(cl->virtualFields[index]);
   
   void* Obj = (void*)obj;
   
   if (isStatic(field->access)) {
-    UserClass* cl = internalGetClass(vm, field, Field);
     cl->initialiseClass(vm);
     Obj = cl->getStaticInstance();
   } else {
@@ -706,13 +718,14 @@
   BEGIN_NATIVE_EXCEPTION(0)
 
   Jnjvm* vm = JavaThread::get()->getJVM();
+  UserClass* cl = internalGetClass(vm, obj);
   JavaField* slot = vm->upcalls->fieldSlot;
-  JavaField* field = (JavaField*)slot->getInt32Field((JavaObject*)Field);
+  uint32 index = (uint32)slot->getInt32Field((JavaObject*)obj);
+  JavaField* field = &(cl->virtualFields[index]);
   
   void* Obj = (void*)obj;
   
   if (isStatic(field->access)) {
-    UserClass* cl = internalGetClass(vm, field, Field);
     cl->initialiseClass(vm);
     Obj = cl->getStaticInstance();
   } else {
@@ -750,13 +763,14 @@
   BEGIN_NATIVE_EXCEPTION(0)
 
   Jnjvm* vm = JavaThread::get()->getJVM();
+  UserClass* cl = internalGetClass(vm, obj);
   JavaField* slot = vm->upcalls->fieldSlot;
-  JavaField* field = (JavaField*)slot->getInt32Field((JavaObject*)Field);
+  uint32 index = (uint32)slot->getInt32Field((JavaObject*)obj);
+  JavaField* field = &(cl->virtualFields[index]);
   
   void* Obj = (void*)obj;
   
   if (isStatic(field->access)) {
-    UserClass* cl = internalGetClass(vm, field, Field);
     cl->initialiseClass(vm);
     Obj = cl->getStaticInstance();
   } else {
@@ -792,13 +806,14 @@
   BEGIN_NATIVE_EXCEPTION(0)
   
   Jnjvm* vm = JavaThread::get()->getJVM();
+  UserClass* cl = internalGetClass(vm, obj);
   JavaField* slot = vm->upcalls->fieldSlot;
-  JavaField* field = (JavaField*)slot->getInt32Field((JavaObject*)Field);
+  uint32 index = (uint32)slot->getInt32Field((JavaObject*)obj);
+  JavaField* field = &(cl->virtualFields[index]);
   
   void* Obj = (void*)obj;
   
   if (isStatic(field->access)) {
-    UserClass* cl = internalGetClass(vm, field, Field);
     cl->initialiseClass(vm);
     Obj = cl->getStaticInstance();
   } else {
@@ -833,13 +848,14 @@
   BEGIN_NATIVE_EXCEPTION(0)
 
   Jnjvm* vm = JavaThread::get()->getJVM();
+  UserClass* cl = internalGetClass(vm, obj);
   JavaField* slot = vm->upcalls->fieldSlot;
-  JavaField* field = (JavaField*)slot->getInt32Field((JavaObject*)Field);
+  uint32 index = (uint32)slot->getInt32Field((JavaObject*)obj);
+  JavaField* field = &(cl->virtualFields[index]);
   
   void* Obj = (void*)obj;
   
   if (isStatic(field->access)) {
-    UserClass* cl = internalGetClass(vm, field, Field);
     cl->initialiseClass(vm);
     Obj = cl->getStaticInstance();
   } else {
@@ -871,13 +887,14 @@
   BEGIN_NATIVE_EXCEPTION(0)
 
   Jnjvm* vm = JavaThread::get()->getJVM();
+  UserClass* cl = internalGetClass(vm, obj);
   JavaField* slot = vm->upcalls->fieldSlot;
-  JavaField* field = (JavaField*)slot->getInt32Field((JavaObject*)Field);
+  uint32 index = (uint32)slot->getInt32Field((JavaObject*)obj);
+  JavaField* field = &(cl->virtualFields[index]);
   
   void* Obj = (void*)obj;
 
   if (isStatic(field->access)) {
-    UserClass* cl = internalGetClass(vm, field, Field);
     cl->initialiseClass(vm);
     Obj = cl->getStaticInstance();
   } else {
@@ -903,11 +920,12 @@
 #ifdef NATIVE_JNI
 JNIEnv *env,
 #endif
-JavaObject* Unsafe,
-JavaObject* Field) {
+jobject Unsafe, jobject Field) {
   Jnjvm* vm = JavaThread::get()->getJVM();
+  UserClass* cl = internalGetClass(vm, Field);
   JavaField* slot = vm->upcalls->fieldSlot;
-  JavaField* field = (JavaField*)slot->getInt32Field((JavaObject*)Field);
+  uint32 index = (uint32)slot->getInt32Field((JavaObject*)Field);
+  JavaField* field = &(cl->virtualFields[index]);
   return (jlong)field->ptrOffset;
 }
 

Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathMethod.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathMethod.cpp?rev=62320&r1=62319&r2=62320&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/Classpath/ClasspathMethod.cpp (original)
+++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathMethod.cpp Fri Jan 16 08:55:27 2009
@@ -24,18 +24,11 @@
 
 extern "C" {
 
-// internalGetClass selects the class of a method depending on the isolate
-// environment. In a sharing environment, the class is located in the 
-// Java object. In regular environment, it is the classDef of the method.
-static UserClass* internalGetClass(Jnjvm* vm, JavaMethod* meth, jobject Meth) {
-#ifdef ISOLATE_SHARING
+static UserClass* internalGetClass(Jnjvm* vm, jobject Meth) {
   JavaField* field = vm->upcalls->methodClass;
   JavaObject* Cl = (JavaObject*)field->getInt32Field((JavaObject*)Meth);
   UserClass* cl = (UserClass*)UserCommonClass::resolvedImplClass(vm, Cl, false);
   return cl;
-#else
-  return meth->classDef;
-#endif
 }
 
 
@@ -50,8 +43,10 @@
   BEGIN_NATIVE_EXCEPTION(0)
   
   Jnjvm* vm = JavaThread::get()->getJVM();
+  UserClass* cl = internalGetClass(vm, Meth);
   JavaField* slot = vm->upcalls->methodSlot;
-  JavaMethod* meth = (JavaMethod*)slot->getInt32Field((JavaObject*)Meth);
+  uint32 index = (uint32)slot->getInt32Field((JavaObject*)Meth);
+  JavaMethod* meth = &(cl->virtualMethods[index]);
   
   res = meth->access;
 
@@ -71,9 +66,10 @@
   BEGIN_NATIVE_EXCEPTION(0)
 
   Jnjvm* vm = JavaThread::get()->getJVM();
+  UserClass* cl = internalGetClass(vm, Meth);
   JavaField* slot = vm->upcalls->methodSlot;
-  JavaMethod* meth = (JavaMethod*)slot->getInt32Field((JavaObject*)Meth);
-  UserClass* cl = internalGetClass(vm, meth, Meth);
+  uint32 index = (uint32)slot->getInt32Field((JavaObject*)Meth);
+  JavaMethod* meth = &(cl->virtualMethods[index]);
   JnjvmClassLoader* loader = cl->classLoader;
   res = (jclass)meth->getReturnType(loader);
 
@@ -94,9 +90,10 @@
   BEGIN_NATIVE_EXCEPTION(0)
 
   Jnjvm* vm = JavaThread::get()->getJVM();
+  UserClass* cl = internalGetClass(vm, Meth);
   JavaField* slot = vm->upcalls->methodSlot;
-  JavaMethod* meth = (JavaMethod*)slot->getInt32Field((JavaObject*)Meth);
-  UserClass* cl = internalGetClass(vm, meth, Meth);
+  uint32 index = (uint32)slot->getInt32Field((JavaObject*)Meth);
+  JavaMethod* meth = &(cl->virtualMethods[index]);
   JnjvmClassLoader* loader = cl->classLoader;
   
   res = (jobject)(meth->getParameterTypes(loader));
@@ -110,14 +107,17 @@
 #ifdef NATIVE_JNI
 JNIEnv *env, 
 #endif
-jobject Meth, jobject _obj, jobject _args, jclass Cl, jint _meth) {
+jobject Meth, jobject _obj, jobject _args, jclass Cl, jint index) {
   
   JavaObject* res = 0;
 
   BEGIN_NATIVE_EXCEPTION(0)
 
   Jnjvm* vm = JavaThread::get()->getJVM();
-  JavaMethod* meth = (JavaMethod*)_meth;
+  UserClass* cl = internalGetClass(vm, Meth);
+  JavaField* slot = vm->upcalls->methodSlot;
+  uint32 index = (uint32)slot->getInt32Field((JavaObject*)Meth);
+  JavaMethod* meth = &(cl->virtualMethods[index]);
   JavaArray* args = (JavaArray*)_args;
   sint32 nbArgs = args ? args->size : 0;
   Signdef* sign = meth->getSignature();
@@ -251,17 +251,18 @@
 #ifdef NATIVE_JNI
 JNIEnv *env, 
 #endif
-jobject _meth) {
+jobject Meth) {
 
   jobjectArray res = 0;
 
   BEGIN_NATIVE_EXCEPTION(0)
 
-  verifyNull(_meth);
+  verifyNull(Meth);
   Jnjvm* vm = JavaThread::get()->getJVM();
+  UserClass* cl = internalGetClass(vm, Meth);
   JavaField* slot = vm->upcalls->methodSlot;
-  JavaMethod* meth = (JavaMethod*)slot->getInt32Field((JavaObject*)_meth);
-  UserClass* cl = internalGetClass(vm, meth, _meth);
+  uint32 index = (uint32)slot->getInt32Field((JavaObject*)Meth);
+  JavaMethod* meth = &(cl->virtualMethods[index]);
   JnjvmClassLoader* loader = cl->classLoader;
   res = (jobjectArray)meth->getExceptionTypes(loader);
 

Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathReflect.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathReflect.h?rev=62320&r1=62319&r2=62320&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/Classpath/ClasspathReflect.h (original)
+++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathReflect.h Fri Jan 16 08:55:27 2009
@@ -44,9 +44,9 @@
 class JavaObjectField : public JavaObject {
 private:
   uint8 flag;
-  JavaObject* declaringClass;
+  JavaObjectClass* declaringClass;
   JavaObject* name;
-  JavaField* slot;
+  uint32 slot;
 
 public:
 
@@ -54,8 +54,6 @@
     obj->JavaObject::CALL_TRACER;
     obj->name->MARK_AND_TRACE;
     obj->declaringClass->MARK_AND_TRACE;
-    // No need to see if classDef != NULL, it must be.
-    if (obj->slot) obj->slot->classDef->classLoader->MARK_AND_TRACE;
   }
 
 };
@@ -65,7 +63,7 @@
   uint8 flag;
   JavaObject* declaringClass;
   JavaObject* name;
-  JavaMethod* slot;
+  uint32 slot;
 
 public:
   
@@ -73,7 +71,6 @@
     obj->JavaObject::CALL_TRACER;
     obj->name->MARK_AND_TRACE;
     obj->declaringClass->MARK_AND_TRACE;
-    if (obj->slot) obj->slot->classDef->classLoader->MARK_AND_TRACE;
   }
 
 };
@@ -82,13 +79,12 @@
 private:
   uint8 flag;
   JavaObject* clazz;
-  JavaMethod* slot;
+  uint32 slot;
 
 public:
   static void STATIC_TRACER(JavaObjectConstructor) {
     obj->JavaObject::CALL_TRACER;
     obj->clazz->MARK_AND_TRACE;
-    if (obj->slot) obj->slot->classDef->classLoader->MARK_AND_TRACE;
   }
 
 };

Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClass.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClass.cpp?rev=62320&r1=62319&r2=62320&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClass.cpp (original)
+++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClass.cpp Fri Jan 16 08:55:27 2009
@@ -91,20 +91,32 @@
     result = (jobject)vm->upcalls->constructorArrayClass->doNew(0, vm);
   } else {
     UserClass* realCl = (Class*)cl;
-    std::vector<JavaMethod*> res;
-    realCl->getDeclaredConstructors(res, publicOnly);
+    JnjvmClassLoader* classLoader = cl->classLoader;
+    uint32 size = 0;
     
+    for (uint32 i = 0; i < realCl->nbVirtualMethods; ++i) {
+      JavaMethod* meth = &realCl->virtualMethods[i];
+      bool pub = isPublic(meth->access);
+      if (meth->name->equals(classLoader->bootstrapLoader->initName) && 
+          (!publicOnly || pub)) {
+        ++size;
+      }
+    }
+  
+
     ArrayObject* ret = 
-      (ArrayObject*)vm->upcalls->constructorArrayClass->doNew(res.size(), vm);
+      (ArrayObject*)vm->upcalls->constructorArrayClass->doNew(size, vm);
     sint32 index = 0;
-    for (std::vector<JavaMethod*>::iterator i = res.begin(), e = res.end();
-          i != e; ++i, ++index) {
-      JavaMethod* meth = *i;
-      // TODO: check parameter types
-      UserClass* Cons = vm->upcalls->newConstructor;
-      JavaObject* tmp = Cons->doNew(vm);
-      vm->upcalls->initConstructor->invokeIntSpecial(vm, Cons, tmp, Cl, meth);
-      ret->elements[index] = tmp;
+    for (uint32 i = 0; i < realCl->nbVirtualMethods; ++i) {
+      JavaMethod* meth = &realCl->virtualMethods[i];
+      bool pub = isPublic(meth->access);
+      if (meth->name->equals(classLoader->bootstrapLoader->initName) && 
+          (!publicOnly || pub)) {
+        UserClass* Cons = vm->upcalls->newConstructor;
+        JavaObject* tmp = Cons->doNew(vm);
+        vm->upcalls->initConstructor->invokeIntSpecial(vm, Cons, tmp, Cl, i);
+        ret->elements[index++] = tmp;
+      }
     }
     result = (jobject)ret;
   }
@@ -134,23 +146,37 @@
   if (cl->isArray() || cl->isPrimitive()) {
     result = (jobject)upcalls->methodArrayClass->doNew(0, vm);
   } else {
-    std::vector<JavaMethod*> res;
-    UserClass* realCl = cl->asClass();
-    realCl->getDeclaredMethods(res, publicOnly);
+    UserClass* realCl = (Class*)cl;
+    JnjvmClassLoader* classLoader = cl->classLoader;
+    uint32 size = 0;
+
+    for (uint32 i = 0; i < realCl->nbVirtualMethods + realCl->nbStaticMethods;
+         ++i) {
+      JavaMethod* meth = &realCl->virtualMethods[i];
+      bool pub = isPublic(meth->access);
+      if (!(meth->name->equals(classLoader->bootstrapLoader->initName)) && 
+          (!publicOnly || pub)) {
+        ++size; 
+      }
+    }
+
     
-    ArrayObject* ret = 
-      (ArrayObject*)upcalls->methodArrayClass->doNew(res.size(), vm);
+    ArrayObject* ret = (ArrayObject*)upcalls->methodArrayClass->doNew(size, vm);
 
     sint32 index = 0;
-    for (std::vector<JavaMethod*>::iterator i = res.begin(), e = res.end();
-          i != e; ++i, ++index) {
-      JavaMethod* meth = *i;
-      // TODO: check parameter types
-      UserClass* Meth = vm->upcalls->newMethod;
-      JavaObject* tmp = Meth->doNew(vm);
-      JavaString* str = vm->internalUTF8ToStr(meth->name);
-      upcalls->initMethod->invokeIntSpecial(vm, Meth, tmp, Cl, str, meth);
-      ret->elements[index] = tmp;
+    for (uint32 i = 0; i < realCl->nbVirtualMethods + realCl->nbStaticMethods;
+         ++i) {
+      JavaMethod* meth = &realCl->virtualMethods[i];
+      bool pub = isPublic(meth->access);
+      if (!(meth->name->equals(classLoader->bootstrapLoader->initName)) && 
+          (!publicOnly || pub)) {
+        // TODO: check parameter types
+        UserClass* Meth = vm->upcalls->newMethod;
+        JavaObject* tmp = Meth->doNew(vm);
+        JavaString* str = vm->internalUTF8ToStr(meth->name);
+        upcalls->initMethod->invokeIntSpecial(vm, Meth, tmp, Cl, str, i);
+        ret->elements[index++] = tmp;
+      }
     }
     result = (jobject)ret;
   }
@@ -375,21 +401,29 @@
   if (!cl) {
     result = (jobject)vm->upcalls->fieldArrayClass->doNew(0, vm);
   } else {
-    std::vector<JavaField*> res;
-    cl->getDeclaredFields(res, publicOnly);
     
+    uint32 size = 0;
+    for (uint32 i = 0; i < cl->nbVirtualFields + cl->nbStaticFields; ++i) {
+      JavaField* field = &cl->virtualFields[i];
+      if (!publicOnly || isPublic(field->access)) {
+        ++size;
+      }
+    }
+
+
     ArrayObject* ret = 
-      (ArrayObject*)vm->upcalls->fieldArrayClass->doNew(res.size(), vm);
+      (ArrayObject*)vm->upcalls->fieldArrayClass->doNew(size, vm);
     sint32 index = 0;
-    for (std::vector<JavaField*>::iterator i = res.begin(), e = res.end();
-          i != e; ++i, ++index) {
-      JavaField* field = *i;
-      // TODO: check parameter types
-      UserClass* Field = vm->upcalls->newField;
-      JavaObject* tmp = Field->doNew(vm);
-      JavaString* name = vm->internalUTF8ToStr(field->name);
-      vm->upcalls->initField->invokeIntSpecial(vm, Field, tmp, Cl, name, field);
-      ret->elements[index] = tmp;
+    for (uint32 i = 0; i < cl->nbVirtualFields + cl->nbStaticFields; ++i) {
+      JavaField* field = &cl->virtualFields[i];
+      if (!publicOnly || isPublic(field->access)) {
+        // TODO: check parameter types
+        UserClass* Field = vm->upcalls->newField;
+        JavaObject* tmp = Field->doNew(vm);
+        JavaString* name = vm->internalUTF8ToStr(field->name);
+        vm->upcalls->initField->invokeIntSpecial(vm, Field, tmp, Cl, name, i);
+        ret->elements[index++] = tmp;
+      }
     }
     result = (jobject)ret;
   }

Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp?rev=62320&r1=62319&r2=62320&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Fri Jan 16 08:55:27 2009
@@ -1029,41 +1029,55 @@
   // thinlock
   ClassElts.push_back(Constant::getNullValue(ptrType));
 
+  if (cl->nbVirtualFields + cl->nbStaticFields) {
+    ATy = ArrayType::get(JavaFieldType->getContainedType(0), 
+                         cl->nbVirtualFields + cl->nbStaticFields);
+  }
+
   // virtualFields
   if (cl->nbVirtualFields) {
-    ATy = ArrayType::get(JavaFieldType->getContainedType(0), cl->nbVirtualFields);
 
     for (uint32 i = 0; i < cl->nbVirtualFields; ++i) {
       TempElts.push_back(CreateConstantFromJavaField(cl->virtualFields[i]));
     }
 
-    Constant* fields = ConstantArray::get(ATy, TempElts);
-    TempElts.clear();
-    fields = new GlobalVariable(ATy, false, GlobalValue::InternalLinkage,
-                                fields, "", this);
-    fields = ConstantExpr::getCast(Instruction::BitCast, fields, JavaFieldType);
-    ClassElts.push_back(fields);
-  } else {
-    ClassElts.push_back(Constant::getNullValue(JavaFieldType));
-  }
-
-  // nbVirtualFields
-  ClassElts.push_back(ConstantInt::get(Type::Int16Ty, cl->nbVirtualFields));
+  } 
   
   // staticFields
   if (cl->nbStaticFields) {
-    ATy = ArrayType::get(JavaFieldType->getContainedType(0), cl->nbStaticFields);
 
     for (uint32 i = 0; i < cl->nbStaticFields; ++i) {
       TempElts.push_back(CreateConstantFromJavaField(cl->staticFields[i]));
     }
+
+  }
+
+  Constant* fields = 0;
+  if (cl->nbStaticFields + cl->nbVirtualFields) {
   
-    Constant* fields = ConstantArray::get(ATy, TempElts);
+    fields = ConstantArray::get(ATy, TempElts);
     TempElts.clear();
     fields = new GlobalVariable(ATy, false, GlobalValue::InternalLinkage,
                                 fields, "", this);
     fields = ConstantExpr::getCast(Instruction::BitCast, fields, JavaFieldType);
-    ClassElts.push_back(fields);
+  } else {
+    fields = Constant::getNullValue(JavaFieldType);
+  }
+
+  // virtualFields
+  ClassElts.push_back(fields);
+
+  ConstantInt* nbVirtualFields = 
+    ConstantInt::get(Type::Int16Ty, cl->nbVirtualFields);
+  // nbVirtualFields
+  ClassElts.push_back(nbVirtualFields);
+  
+  // staticFields
+  if (cl->nbStaticFields + cl->nbVirtualFields) {
+    
+    Constant* I[1] = { nbVirtualFields };
+    Constant* C = ConstantExpr::getGetElementPtr(fields, I, 1);
+    ClassElts.push_back(C);
   } else {
     ClassElts.push_back(Constant::getNullValue(JavaFieldType));
   }
@@ -1072,15 +1086,26 @@
   ClassElts.push_back(ConstantInt::get(Type::Int16Ty, cl->nbStaticFields));
   
   // virtualMethods
-  if (cl->nbVirtualMethods) {
+  if (cl->nbVirtualMethods + cl->nbStaticMethods) {
     ATy = ArrayType::get(JavaMethodType->getContainedType(0),
-                         cl->nbVirtualMethods);
+                         cl->nbVirtualMethods + cl->nbStaticMethods);
+  }
 
+  if (cl->nbVirtualMethods) {
     for (uint32 i = 0; i < cl->nbVirtualMethods; ++i) {
       TempElts.push_back(CreateConstantFromJavaMethod(cl->virtualMethods[i]));
     }
+  }
+    
+  if (cl->nbStaticMethods) {
+    for (uint32 i = 0; i < cl->nbStaticMethods; ++i) {
+      TempElts.push_back(CreateConstantFromJavaMethod(cl->staticMethods[i]));
+    }
+  }
 
-    Constant* methods = ConstantArray::get(ATy, TempElts);
+  Constant* methods = 0;
+  if (cl->nbVirtualMethods + cl->nbStaticMethods) {
+    methods = ConstantArray::get(ATy, TempElts);
     TempElts.clear();
     GlobalVariable* GV = new GlobalVariable(ATy, false,
                                             GlobalValue::InternalLinkage,
@@ -1088,31 +1113,24 @@
     virtualMethods.insert(std::make_pair(cl, GV));
     methods = ConstantExpr::getCast(Instruction::BitCast, GV,
                                     JavaMethodType);
-    ClassElts.push_back(methods);
   } else {
-    ClassElts.push_back(Constant::getNullValue(JavaMethodType));
+    methods = Constant::getNullValue(JavaMethodType);
   }
 
+  // virtualMethods
+  ClassElts.push_back(methods);
+
+  ConstantInt* nbVirtualMethods = 
+    ConstantInt::get(Type::Int16Ty, cl->nbVirtualMethods);
   // nbVirtualMethods
-  ClassElts.push_back(ConstantInt::get(Type::Int16Ty, cl->nbVirtualMethods));
+  ClassElts.push_back(nbVirtualMethods);
   
   // staticMethods
-  if (cl->nbStaticMethods) {
-    ATy = ArrayType::get(JavaMethodType->getContainedType(0),
-                         cl->nbStaticMethods);
-
-    for (uint32 i = 0; i < cl->nbStaticMethods; ++i) {
-      TempElts.push_back(CreateConstantFromJavaMethod(cl->staticMethods[i]));
-    }
-
-    Constant* methods = ConstantArray::get(ATy, TempElts);
-    TempElts.clear();
-    GlobalVariable* GV = new GlobalVariable(ATy, false,
-                                            GlobalValue::InternalLinkage,
-                                            methods, "", this);
-    staticMethods.insert(std::make_pair(cl, GV));
-    methods = ConstantExpr::getCast(Instruction::BitCast, GV, JavaMethodType);
-    ClassElts.push_back(methods);
+  if (cl->nbStaticMethods + cl->nbVirtualMethods) {
+    Constant* I[1] = { nbVirtualMethods };
+    Constant* C = ConstantExpr::getGetElementPtr(methods, I, 1);
+    ClassElts.push_back(C);
+    staticMethods.insert(std::make_pair(cl, C));
   } else {
     ClassElts.push_back(Constant::getNullValue(JavaMethodType));
   }

Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h?rev=62320&r1=62319&r2=62320&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h Fri Jan 16 08:55:27 2009
@@ -191,10 +191,10 @@
   std::map<const Enveloppe*, llvm::Constant*> enveloppes;
   std::map<const JavaMethod*, llvm::Constant*> nativeFunctions;
   std::map<const UTF8*, llvm::Constant*> utf8s;
-  std::map<const Class*, llvm::GlobalVariable*> virtualMethods;
-  std::map<const Class*, llvm::GlobalVariable*> staticMethods;
+  std::map<const Class*, llvm::Constant*> virtualMethods;
+  std::map<const Class*, llvm::Constant*> staticMethods;
   
-  typedef std::map<const Class*, llvm::GlobalVariable*>::iterator
+  typedef std::map<const Class*, llvm::Constant*>::iterator
     method_iterator;
   
   typedef std::map<const CommonClass*, llvm::Constant*>::iterator





More information about the vmkit-commits mailing list