Looks good!<br><br><div class="gmail_quote">On Thu, Nov 3, 2011 at 3:17 PM, Will Dietz <span dir="ltr"><<a href="mailto:wdietz2@illinois.edu">wdietz2@illinois.edu</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
Inlined below.<br>
<br>
Mostly copied from equivalent Classpath implementations, only the<br>
OpenJDK constructors are different.<br>
<br>
~Will<br>
<br>
>From 0821f3663e504c431f96a52070e9983afd87d4a7 Mon Sep 17 00:00:00 2001<br>
From: Will Dietz <<a href="mailto:w@wdtz.org">w@wdtz.org</a>><br>
Date: Mon, 31 Oct 2011 16:54:28 -0500<br>
Subject: [PATCH 01/17] Impl JVM_GetClassDeclared{Fields,Methods,Constructors}<br>
<br>
---<br>
lib/J3/ClassLib/OpenJDK/OpenJDK.inc | 228 ++++++++++++++++++++++++++++++++++-<br>
1 files changed, 225 insertions(+), 3 deletions(-)<br>
<br>
diff --git a/lib/J3/ClassLib/OpenJDK/OpenJDK.inc<br>
b/lib/J3/ClassLib/OpenJDK/OpenJDK.inc<br>
index f4110b7..b724e73 100644<br>
--- a/lib/J3/ClassLib/OpenJDK/OpenJDK.inc<br>
+++ b/lib/J3/ClassLib/OpenJDK/OpenJDK.inc<br>
@@ -1016,17 +1016,237 @@ JVM_GetClassAnnotations(JNIEnv *env, jclass cls) {<br>
<br>
JNIEXPORT jobjectArray JNICALL<br>
JVM_GetClassDeclaredMethods(JNIEnv *env, jclass ofClass, jboolean publicOnly) {<br>
- NYI();<br>
+ ArrayObject* ret = 0;<br>
+ JavaObject* tmp = 0;<br>
+ JavaString* str = 0;<br>
+ JavaObject * Cl = 0;<br>
+ llvm_gcroot(Cl, 0);<br>
+ llvm_gcroot(ret, 0);<br>
+ llvm_gcroot(tmp, 0);<br>
+ llvm_gcroot(str, 0);<br>
+<br>
+ BEGIN_JNI_EXCEPTION<br>
+<br>
+ Cl = *(JavaObject**)ofClass;<br>
+<br>
+ Jnjvm* vm = JavaThread::get()->getJVM();<br>
+ UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, Cl, false);<br>
+ Classpath* upcalls = vm->upcalls;<br>
+<br>
+ if (cl->isArray() || cl->isPrimitive()) {<br>
+ ret = (ArrayObject*)upcalls->methodArrayClass->doNew(0, vm);<br>
+ } else {<br>
+ UserClass* realCl = cl->asClass();<br>
+ JnjvmClassLoader* classLoader = cl->classLoader;<br>
+ uint32 size = 0;<br>
+<br>
+ for (uint32 i = 0; i < realCl->nbVirtualMethods + realCl->nbStaticMethods;<br>
+ ++i) {<br>
+ JavaMethod* meth = &realCl->virtualMethods[i];<br>
+ bool pub = isPublic(meth->access);<br>
+ if (!(meth->name->equals(classLoader->bootstrapLoader->initName)) &&<br>
+ (!publicOnly || pub)) {<br>
+ ++size;<br>
+ }<br>
+ }<br>
+<br>
+<br>
+ ret = (ArrayObject*)upcalls->methodArrayClass->doNew(size, vm);<br>
+<br>
+ sint32 index = 0;<br>
+ for (uint32 i = 0; i < realCl->nbVirtualMethods + realCl->nbStaticMethods;<br>
+ ++i) {<br>
+ JavaMethod* meth = &realCl->virtualMethods[i];<br>
+ bool pub = isPublic(meth->access);<br>
+ if (!(meth->name->equals(classLoader->bootstrapLoader->initName)) &&<br>
+ (!publicOnly || pub)) {<br>
+ // TODO: check parameter types<br>
+ UserClass* Meth = vm->upcalls->newMethod;<br>
+ tmp = Meth->doNew(vm);<br>
+ str = vm->internalUTF8ToStr(meth->name);<br>
+ JavaObject * pArr = meth->getParameterTypes(classLoader);<br>
+ JavaObject * eArr = meth->getExceptionTypes(classLoader);<br>
+ JavaObject * retTy = meth->getReturnType(classLoader);<br>
+ upcalls->initMethod->invokeIntSpecial(vm, Meth, tmp,<br>
+ &Cl, /* declaring class */<br>
+ &str, /* name */<br>
+ &pArr, /* parameter types */<br>
+ &retTy, /* return type */<br>
+ &eArr, /* exceptions */<br>
+ meth->access, /* modifiers */<br>
+ i, /* slot */<br>
+ NULL, /* signature */<br>
+ NULL, /* annotations */<br>
+ NULL, /* parameter annotations */<br>
+ NULL, /* default annotations */<br>
+ i);<br>
+ ArrayObject::setElement(ret, tmp, index);<br>
+ index++;<br>
+ }<br>
+ }<br>
+ }<br>
+<br>
+ RETURN_FROM_JNI((jobjectArray)th->pushJNIRef(ret));<br>
+<br>
+ END_JNI_EXCEPTION<br>
+<br>
+ return 0;<br>
}<br>
<br>
JNIEXPORT jobjectArray JNICALL<br>
JVM_GetClassDeclaredFields(JNIEnv *env, jclass ofClass, jboolean publicOnly) {<br>
- NYI();<br>
+ ArrayObject* ret = 0;<br>
+ JavaObject* tmp = 0;<br>
+ JavaString* name = 0;<br>
+ JavaObject*const* type = 0;<br>
+ JavaString* sign = 0;<br>
+ JavaObject* annArray = 0;<br>
+ llvm_gcroot(ret, 0);<br>
+ llvm_gcroot(tmp, 0);<br>
+ llvm_gcroot(name, 0);<br>
+ llvm_gcroot(type, 0);<br>
+ llvm_gcroot(sign, 0);<br>
+ llvm_gcroot(annArray, 0);<br>
+<br>
+ BEGIN_JNI_EXCEPTION<br>
+<br>
+ JavaObject * Cl = *(JavaObject**)ofClass;<br>
+ llvm_gcroot(Cl, 0);<br>
+<br>
+ Jnjvm* vm = JavaThread::get()->getJVM();<br>
+ UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, Cl, false);<br>
+<br>
+ if (!cl->isClass()) {<br>
+ ret = (ArrayObject*)vm->upcalls->fieldArrayClass->doNew(0, vm);<br>
+ } else {<br>
+ UserClass* realCl = cl->asClass();<br>
+ uint32 size = 0;<br>
+ for (uint32 i = 0; i < realCl->nbVirtualFields + realCl->nbStaticFields;<br>
+ ++i) {<br>
+ JavaField* field = &realCl->virtualFields[i];<br>
+ if (!publicOnly || isPublic(field->access)) {<br>
+ ++size;<br>
+ }<br>
+ }<br>
+<br>
+<br>
+ ret = (ArrayObject*)vm->upcalls->fieldArrayClass->doNew(size, vm);<br>
+<br>
+ sint32 index = 0;<br>
+ for (uint32 i = 0; i < realCl->nbVirtualFields + realCl->nbStaticFields;<br>
+ ++i) {<br>
+ JavaField* field = &realCl->virtualFields[i];<br>
+ if (!publicOnly || isPublic(field->access)) {<br>
+ // TODO: check parameter types<br>
+ UserClass* Field = vm->upcalls->newField;<br>
+ tmp = Field->doNew(vm);<br>
+ name = vm->internalUTF8ToStr(field->name);<br>
+<br>
+ //type->Class<br>
+ UserCommonClass * fieldCl =<br>
field->getSignature()->assocClass(cl->classLoader);<br>
+ assert(fieldCl);<br>
+ type = fieldCl->getClassDelegateePtr(vm);<br>
+<br>
+ // TODO:Implement these!<br>
+ sign = NULL;<br>
+ annArray = NULL;<br>
+<br>
+ //Convert to string<br>
+<br>
+ /* java.reflect.Field(<br>
+ * Class declaringClass,<br>
+ * String name,<br>
+ * Class type,<br>
+ * int modifiers,<br>
+ * int slot,<br>
+ * String signature,<br>
+ * byte[] annotations)<br>
+ */<br>
+ vm->upcalls->initField->invokeIntSpecial(vm, Field, tmp,<br>
+ &Cl,<br>
+ &name,<br>
+ type,<br>
+ field->access,<br>
+ i,<br>
+ sign,<br>
+ annArray);<br>
+ ArrayObject::setElement(ret, tmp, index);<br>
+ index++;<br>
+ }<br>
+ }<br>
+ }<br>
+ RETURN_FROM_JNI((jobjectArray)th->pushJNIRef(ret));<br>
+<br>
+ END_JNI_EXCEPTION<br>
+<br>
+ return 0;<br>
}<br>
<br>
JNIEXPORT jobjectArray JNICALL<br>
JVM_GetClassDeclaredConstructors(JNIEnv *env, jclass ofClass,<br>
jboolean publicOnly) {<br>
- NYI();<br>
+ ArrayObject* ret = 0;<br>
+ JavaObject* tmp = 0;<br>
+ JavaObject* Cl = 0;<br>
+ llvm_gcroot(Cl, 0);<br>
+ llvm_gcroot(ret, 0);<br>
+ llvm_gcroot(tmp, 0);<br>
+<br>
+ BEGIN_JNI_EXCEPTION<br>
+<br>
+ Cl = *(JavaObject**)ofClass;<br>
+<br>
+ Jnjvm* vm = JavaThread::get()->getJVM();<br>
+ UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, Cl, false);<br>
+<br>
+ if (cl->isArray() || cl->isInterface() || cl->isPrimitive()) {<br>
+ ret = (ArrayObject*)vm->upcalls->constructorArrayClass->doNew(0, vm);<br>
+ } else {<br>
+ UserClass* realCl = cl->asClass();;<br>
+ JnjvmClassLoader* classLoader = cl->classLoader;<br>
+ uint32 size = 0;<br>
+<br>
+ for (uint32 i = 0; i < realCl->nbVirtualMethods; ++i) {<br>
+ JavaMethod* meth = &realCl->virtualMethods[i];<br>
+ bool pub = isPublic(meth->access);<br>
+ if (meth->name->equals(classLoader->bootstrapLoader->initName) &&<br>
+ (!publicOnly || pub)) {<br>
+ ++size;<br>
+ }<br>
+ }<br>
+<br>
+ ret = (ArrayObject*)vm->upcalls->constructorArrayClass->doNew(size, vm);<br>
+<br>
+ sint32 index = 0;<br>
+ for (uint32 i = 0; i < realCl->nbVirtualMethods; ++i) {<br>
+ JavaMethod* meth = &realCl->virtualMethods[i];<br>
+ bool pub = isPublic(meth->access);<br>
+ if (meth->name->equals(classLoader->bootstrapLoader->initName) &&<br>
+ (!publicOnly || pub)) {<br>
+ UserClass* Cons = vm->upcalls->newConstructor;<br>
+ JavaObject * pArr = meth->getParameterTypes(classLoader);<br>
+ JavaObject * eArr = meth->getExceptionTypes(classLoader);<br>
+ tmp = Cons->doNew(vm);<br>
+ vm->upcalls->initConstructor->invokeIntSpecial(vm, Cons, tmp,<br>
+ &Cl, /* declaringClass */<br>
+ &pArr, /* parameterTypes */<br>
+ &eArr, /* checkedExceptions */<br>
+ meth->access, /* modifiers */<br>
+ i, /* slot */<br>
+ NULL, /* String signature */<br>
+ NULL, /* annotations */<br>
+ NULL /* parameterAnnotations */<br>
+ );<br>
+ ArrayObject::setElement(ret, tmp, index);<br>
+ index++;<br>
+ }<br>
+ }<br>
+ }<br>
+<br>
+ RETURN_FROM_JNI((jobjectArray)th->pushJNIRef(ret));<br>
+<br>
+ END_JNI_EXCEPTION<br>
+<br>
+ return 0;<br>
}<br>
<br>
/* Differs from JVM_GetClassModifiers in treatment of inner classes.<br>
@@ -1170,6 +1390,8 @@ JVM_DoPrivileged(JNIEnv *env, jclass cls,<br>
RETURN_FROM_JNI((jobject)th->pushJNIRef(res));<br>
<br>
END_JNI_EXCEPTION<br>
+<br>
+ return NULL;<br>
}<br>
<br>
JNIEXPORT jobject JNICALL<br>
<span class="HOEnZb"><font color="#888888">--<br>
1.7.5.1<br>
_______________________________________________<br>
vmkit-commits mailing list<br>
<a href="mailto:vmkit-commits@cs.uiuc.edu">vmkit-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/vmkit-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/vmkit-commits</a><br>
</font></span></blockquote></div><br>