[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