[vmkit-commits] [vmkit] r143672 - /vmkit/trunk/lib/J3/ClassLib/OpenJDK/OpenJDK.inc
Will Dietz
wdietz2 at illinois.edu
Thu Nov 3 18:08:00 PDT 2011
Author: wdietz2
Date: Thu Nov 3 20:08:00 2011
New Revision: 143672
URL: http://llvm.org/viewvc/llvm-project?rev=143672&view=rev
Log:
Impl JVM_GetClassDeclared{Fields,Methods,Constructors}
Modified:
vmkit/trunk/lib/J3/ClassLib/OpenJDK/OpenJDK.inc
Modified: vmkit/trunk/lib/J3/ClassLib/OpenJDK/OpenJDK.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/ClassLib/OpenJDK/OpenJDK.inc?rev=143672&r1=143671&r2=143672&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/ClassLib/OpenJDK/OpenJDK.inc (original)
+++ vmkit/trunk/lib/J3/ClassLib/OpenJDK/OpenJDK.inc Thu Nov 3 20:08:00 2011
@@ -1016,17 +1016,237 @@
JNIEXPORT jobjectArray JNICALL
JVM_GetClassDeclaredMethods(JNIEnv *env, jclass ofClass, jboolean publicOnly) {
- NYI();
+ ArrayObject* ret = 0;
+ JavaObject* tmp = 0;
+ JavaString* str = 0;
+ JavaObject * Cl = 0;
+ llvm_gcroot(Cl, 0);
+ llvm_gcroot(ret, 0);
+ llvm_gcroot(tmp, 0);
+ llvm_gcroot(str, 0);
+
+ BEGIN_JNI_EXCEPTION
+
+ Cl = *(JavaObject**)ofClass;
+
+ Jnjvm* vm = JavaThread::get()->getJVM();
+ UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, Cl, false);
+ Classpath* upcalls = vm->upcalls;
+
+ if (cl->isArray() || cl->isPrimitive()) {
+ ret = (ArrayObject*)upcalls->methodArrayClass->doNew(0, vm);
+ } else {
+ UserClass* realCl = cl->asClass();
+ 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;
+ }
+ }
+
+
+ ret = (ArrayObject*)upcalls->methodArrayClass->doNew(size, vm);
+
+ sint32 index = 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)) {
+ // TODO: check parameter types
+ UserClass* Meth = vm->upcalls->newMethod;
+ tmp = Meth->doNew(vm);
+ str = vm->internalUTF8ToStr(meth->name);
+ JavaObject * pArr = meth->getParameterTypes(classLoader);
+ JavaObject * eArr = meth->getExceptionTypes(classLoader);
+ JavaObject * retTy = meth->getReturnType(classLoader);
+ upcalls->initMethod->invokeIntSpecial(vm, Meth, tmp,
+ &Cl, /* declaring class */
+ &str, /* name */
+ &pArr, /* parameter types */
+ &retTy, /* return type */
+ &eArr, /* exceptions */
+ meth->access, /* modifiers */
+ i, /* slot */
+ NULL, /* signature */
+ NULL, /* annotations */
+ NULL, /* parameter annotations */
+ NULL, /* default annotations */
+ i);
+ ArrayObject::setElement(ret, tmp, index);
+ index++;
+ }
+ }
+ }
+
+ RETURN_FROM_JNI((jobjectArray)th->pushJNIRef(ret));
+
+ END_JNI_EXCEPTION
+
+ return 0;
}
JNIEXPORT jobjectArray JNICALL
JVM_GetClassDeclaredFields(JNIEnv *env, jclass ofClass, jboolean publicOnly) {
- NYI();
+ ArrayObject* ret = 0;
+ JavaObject* tmp = 0;
+ JavaString* name = 0;
+ JavaObject*const* type = 0;
+ JavaString* sign = 0;
+ JavaObject* annArray = 0;
+ llvm_gcroot(ret, 0);
+ llvm_gcroot(tmp, 0);
+ llvm_gcroot(name, 0);
+ llvm_gcroot(type, 0);
+ llvm_gcroot(sign, 0);
+ llvm_gcroot(annArray, 0);
+
+ BEGIN_JNI_EXCEPTION
+
+ JavaObject * Cl = *(JavaObject**)ofClass;
+ llvm_gcroot(Cl, 0);
+
+ Jnjvm* vm = JavaThread::get()->getJVM();
+ UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, Cl, false);
+
+ if (!cl->isClass()) {
+ ret = (ArrayObject*)vm->upcalls->fieldArrayClass->doNew(0, vm);
+ } else {
+ UserClass* realCl = cl->asClass();
+ uint32 size = 0;
+ for (uint32 i = 0; i < realCl->nbVirtualFields + realCl->nbStaticFields;
+ ++i) {
+ JavaField* field = &realCl->virtualFields[i];
+ if (!publicOnly || isPublic(field->access)) {
+ ++size;
+ }
+ }
+
+
+ ret = (ArrayObject*)vm->upcalls->fieldArrayClass->doNew(size, vm);
+
+ sint32 index = 0;
+ for (uint32 i = 0; i < realCl->nbVirtualFields + realCl->nbStaticFields;
+ ++i) {
+ JavaField* field = &realCl->virtualFields[i];
+ if (!publicOnly || isPublic(field->access)) {
+ // TODO: check parameter types
+ UserClass* Field = vm->upcalls->newField;
+ tmp = Field->doNew(vm);
+ name = vm->internalUTF8ToStr(field->name);
+
+ //type->Class
+ UserCommonClass * fieldCl = field->getSignature()->assocClass(cl->classLoader);
+ assert(fieldCl);
+ type = fieldCl->getClassDelegateePtr(vm);
+
+ // TODO:Implement these!
+ sign = NULL;
+ annArray = NULL;
+
+ //Convert to string
+
+ /* java.reflect.Field(
+ * Class declaringClass,
+ * String name,
+ * Class type,
+ * int modifiers,
+ * int slot,
+ * String signature,
+ * byte[] annotations)
+ */
+ vm->upcalls->initField->invokeIntSpecial(vm, Field, tmp,
+ &Cl,
+ &name,
+ type,
+ field->access,
+ i,
+ sign,
+ annArray);
+ ArrayObject::setElement(ret, tmp, index);
+ index++;
+ }
+ }
+ }
+ RETURN_FROM_JNI((jobjectArray)th->pushJNIRef(ret));
+
+ END_JNI_EXCEPTION
+
+ return 0;
}
JNIEXPORT jobjectArray JNICALL
JVM_GetClassDeclaredConstructors(JNIEnv *env, jclass ofClass, jboolean publicOnly) {
- NYI();
+ ArrayObject* ret = 0;
+ JavaObject* tmp = 0;
+ JavaObject* Cl = 0;
+ llvm_gcroot(Cl, 0);
+ llvm_gcroot(ret, 0);
+ llvm_gcroot(tmp, 0);
+
+ BEGIN_JNI_EXCEPTION
+
+ Cl = *(JavaObject**)ofClass;
+
+ Jnjvm* vm = JavaThread::get()->getJVM();
+ UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, Cl, false);
+
+ if (cl->isArray() || cl->isInterface() || cl->isPrimitive()) {
+ ret = (ArrayObject*)vm->upcalls->constructorArrayClass->doNew(0, vm);
+ } else {
+ UserClass* realCl = cl->asClass();;
+ 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;
+ }
+ }
+
+ ret = (ArrayObject*)vm->upcalls->constructorArrayClass->doNew(size, vm);
+
+ sint32 index = 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)) {
+ UserClass* Cons = vm->upcalls->newConstructor;
+ JavaObject * pArr = meth->getParameterTypes(classLoader);
+ JavaObject * eArr = meth->getExceptionTypes(classLoader);
+ tmp = Cons->doNew(vm);
+ vm->upcalls->initConstructor->invokeIntSpecial(vm, Cons, tmp,
+ &Cl, /* declaringClass */
+ &pArr, /* parameterTypes */
+ &eArr, /* checkedExceptions */
+ meth->access, /* modifiers */
+ i, /* slot */
+ NULL, /* String signature */
+ NULL, /* annotations */
+ NULL /* parameterAnnotations */
+ );
+ ArrayObject::setElement(ret, tmp, index);
+ index++;
+ }
+ }
+ }
+
+ RETURN_FROM_JNI((jobjectArray)th->pushJNIRef(ret));
+
+ END_JNI_EXCEPTION
+
+ return 0;
}
/* Differs from JVM_GetClassModifiers in treatment of inner classes.
@@ -1170,6 +1390,8 @@
RETURN_FROM_JNI((jobject)th->pushJNIRef(res));
END_JNI_EXCEPTION
+
+ return NULL;
}
JNIEXPORT jobject JNICALL
More information about the vmkit-commits
mailing list