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>