Looks good, please apply :)<br><br><div class="gmail_quote">On Thu, Nov 17, 2011 at 1:05 AM, 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;">
<div class="im">On Wed, Nov 9, 2011 at 3:44 PM, Nicolas Geoffray<br>
<<a href="mailto:nicolas.geoffray@gmail.com">nicolas.geoffray@gmail.com</a>> wrote:<br>
> Actually, I'm just trying to be the less annoying  as possible for<br>
> refactoring, as I guess there are much more we can do to get a nicer code<br>
> base while still supporting two class libraries. But that would be in your<br>
> way of getting openjdk support, and I surely prefer having openjdk support<br>
> than a nice class library layer that supports classpath and openjdk, for now<br>
> :)<br>
> Nicolas<br>
<br>
</div>Okay, understood.<br>
<br>
And thank you very much for being understanding about deferring a<br>
better organization until later, and working with me to get all this<br>
committed and cleaned up :)<br>
<br>
Very much appreciated! :)<br>
<br>
Anyway, here's an updated version of the patch that I think should<br>
address the previously mentioned concerns.  Of course, if not let me<br>
know :).<br>
<br>
Inlined below.<br>
<br>
~Will<br>
<br>
>From 64a5a3448785ea04d24540b020c1cd8b5bc04c96 Mon Sep 17 00:00:00 2001<br>
<div class="im">From: Will Dietz <<a href="mailto:w@wdtz.org">w@wdtz.org</a>><br>
Date: Sat, 5 Nov 2011 23:53:56 -0500<br>
</div>Subject: [PATCH] Refactor reflection code into new Reflect.inc (shared) and<br>
 ClasspathReflect<br>
<br>
Also use this refactored layout to add implementations for the OpenJDK port<br>
---<br>
 lib/J3/ClassLib/GNUClasspath/ClasspathReflect.cpp |   49 ++++<br>
 lib/J3/ClassLib/GNUClasspath/ClasspathReflect.h   |   12 +<br>
 lib/J3/ClassLib/GNUClasspath/ClasspathVMClass.inc |  191 +--------------<br>
 lib/J3/ClassLib/OpenJDK/ClasspathReflect.cpp      |  119 +++++++++-<br>
 lib/J3/ClassLib/OpenJDK/ClasspathReflect.h        |   12 +<br>
 lib/J3/ClassLib/OpenJDK/OpenJDK.inc               |  262 +++++----------------<br>
 lib/J3/ClassLib/Reflect.inc                       |  255 ++++++++++++++++++++<br>
 7 files changed, 510 insertions(+), 390 deletions(-)<br>
 create mode 100644 lib/J3/ClassLib/Reflect.inc<br>
<br>
diff --git a/lib/J3/ClassLib/GNUClasspath/ClasspathReflect.cpp<br>
b/lib/J3/ClassLib/GNUClasspath/ClasspathReflect.cpp<br>
index 90bd617..20fa7b1 100644<br>
--- a/lib/J3/ClassLib/GNUClasspath/ClasspathReflect.cpp<br>
+++ b/lib/J3/ClassLib/GNUClasspath/ClasspathReflect.cpp<br>
@@ -12,6 +12,8 @@<br>
 #include "JavaObject.h"<br>
 #include "JavaThread.h"<br>
<br>
+#include "Reflect.inc"<br>
+<br>
 namespace j3 {<br>
<br>
 JavaMethod* JavaObjectConstructor::getInternalMethod(JavaObjectConstructor*<br>
self) {<br>
@@ -27,4 +29,51 @@ JavaMethod*<br>
JavaObjectMethod::getInternalMethod(JavaObjectMethod* self) {<br>
   return &(cls->asClass()->virtualMethods[self->slot]);<br>
 }<br>
<br>
+JavaObjectConstructor*<br>
JavaObjectConstructor::createFromInternalConstructor(JavaMethod *<br>
cons, int i) {<br>
+  JavaObjectConstructor* ret = 0;<br>
<div class="im">+  llvm_gcroot(ret, 0);<br>
+<br>
+  Jnjvm* vm = JavaThread::get()->getJVM();<br>
+  UserClass* Cons = vm->upcalls->newConstructor;<br>
</div>+  ret = (JavaObjectConstructor*)Cons->doNew(vm);<br>
<div class="im">+  JavaObject* const* Cl = cons->classDef->getDelegateePtr();<br>
+  vm->upcalls->initConstructor->invokeIntSpecial(vm, Cons, ret,<br>
+    Cl, i);<br>
+<br>
+  return ret;<br>
+}<br>
+<br>
</div>+JavaObjectMethod*<br>
JavaObjectMethod::createFromInternalMethod(JavaMethod* meth, int i) {<br>
+  JavaObjectMethod* ret = 0;<br>
<div class="im">+  JavaString* str = 0;<br>
+  llvm_gcroot(ret, 0);<br>
+  llvm_gcroot(str, 0);<br>
+<br>
+  Jnjvm* vm = JavaThread::get()->getJVM();<br>
+  UserClass* Meth = vm->upcalls->newMethod;<br>
</div>+  ret = (JavaObjectMethod*)Meth->doNew(vm);<br>
<div class="im">+  str = vm->internalUTF8ToStr(meth->name);<br>
+  JavaObject* const* Cl = meth->classDef->getDelegateePtr();<br>
+  vm->upcalls->initMethod->invokeIntSpecial(vm, Meth, ret,<br>
+    Cl, &str, i);<br>
+<br>
+  return ret;<br>
+}<br>
+<br>
</div>+JavaObjectField* JavaObjectField::createFromInternalField(JavaField*<br>
field, int i) {<br>
+  JavaObjectField* ret = 0;<br>
<div class="im">+  JavaString* name = 0;<br>
+  llvm_gcroot(ret, 0);<br>
+  llvm_gcroot(name, 0);<br>
+<br>
+  Jnjvm* vm = JavaThread::get()->getJVM();<br>
+  UserClass* Field = vm->upcalls->newField;<br>
</div>+  ret = (JavaObjectField*)Field->doNew(vm);<br>
<div class="im">+  name = vm->internalUTF8ToStr(field->name);<br>
+  JavaObject* const* Cl = field->classDef->getDelegateePtr();<br>
+  vm->upcalls->initField->invokeIntSpecial(vm, Field, ret,<br>
+    Cl, &name, i);<br>
+<br>
+  return ret;<br>
+}<br>
 }<br>
</div>diff --git a/lib/J3/ClassLib/GNUClasspath/ClasspathReflect.h<br>
b/lib/J3/ClassLib/GNUClasspath/ClasspathReflect.h<br>
index d847b98..23c79c5 100644<br>
--- a/lib/J3/ClassLib/GNUClasspath/ClasspathReflect.h<br>
+++ b/lib/J3/ClassLib/GNUClasspath/ClasspathReflect.h<br>
@@ -60,6 +60,15 @@ public:<br>
       if (*Obj) mvm::Collector::markAndTraceRoot(Obj, closure);<br>
     }<br>
   }<br>
+<br>
+  static ArrayObject* getDeclaredAnnotations(JavaObjectClass* Cl);<br>
+  static ArrayObject* getDeclaredClasses(JavaObjectClass* Cl, bool publicOnly);<br>
+  static ArrayObject* getDeclaredConstructors(JavaObjectClass* Cl,<br>
bool publicOnly);<br>
+  static ArrayObject* getDeclaredFields(JavaObjectClass* Cl, bool publicOnly);<br>
+  static ArrayObject* getDeclaredMethods(JavaObjectClass* Cl, bool publicOnly);<br>
+  static ArrayObject* getInterfaces(JavaObjectClass* Cl);<br>
+  static JavaObject* getDeclaringClass(JavaObjectClass* Cl);<br>
+  static int getModifiers(JavaObjectClass* Cl);<br>
 };<br>
<br>
 class JavaObjectField : public JavaObject {<br>
@@ -88,6 +97,7 @@ public:<br>
     return cls->asClass();<br>
   }<br>
<br>
+  static JavaObjectField* createFromInternalField(JavaField* field, int i);<br>
 };<br>
<br>
 class JavaObjectMethod : public JavaObject {<br>
@@ -112,6 +122,7 @@ public:<br>
     return cls->asClass();<br>
   }<br>
<br>
+  static JavaObjectMethod* createFromInternalMethod(JavaMethod* meth, int i);<br>
 };<br>
<br>
 class JavaObjectConstructor : public JavaObject {<br>
@@ -133,6 +144,7 @@ public:<br>
     return cls->asClass();<br>
   }<br>
<br>
+  static JavaObjectConstructor*<br>
createFromInternalConstructor(JavaMethod* cons, int i);<br>
 };<br>
<br>
 class JavaObjectVMThread : public JavaObject {<br>
diff --git a/lib/J3/ClassLib/GNUClasspath/ClasspathVMClass.inc<br>
b/lib/J3/ClassLib/GNUClasspath/ClasspathVMClass.inc<br>
index 0c4d21c..0c8eb4f 100644<br>
--- a/lib/J3/ClassLib/GNUClasspath/ClasspathVMClass.inc<br>
+++ b/lib/J3/ClassLib/GNUClasspath/ClasspathVMClass.inc<br>
@@ -86,48 +86,12 @@ JavaObject* Cl,<br>
<div><div class="h5"> jboolean publicOnly) {<br>
<br>
   ArrayObject* ret = 0;<br>
-  JavaObject* tmp = 0;<br>
   llvm_gcroot(Cl, 0);<br>
   llvm_gcroot(ret, 0);<br>
-  llvm_gcroot(tmp, 0);<br>
<br>
   BEGIN_NATIVE_EXCEPTION(0)<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>
-        tmp = Cons->doNew(vm);<br>
-        vm->upcalls->initConstructor->invokeIntSpecial(vm, Cons, tmp, &Cl, i);<br>
-        ArrayObject::setElement(ret, tmp, index);<br>
-        index++;<br>
-      }<br>
-    }<br>
-  }<br>
</div></div>+  ret = JavaObjectClass::getDeclaredConstructors((JavaObjectClass*)Cl,<br>
publicOnly);<br>
<br>
   END_NATIVE_EXCEPTION<br>
<br>
@@ -143,58 +107,12 @@ JavaObject* Cl,<br>
<div><div class="h5"> jboolean publicOnly) {<br>
<br>
   ArrayObject* ret = 0;<br>
-  JavaObject* tmp = 0;<br>
-  JavaString* str = 0;<br>
   llvm_gcroot(Cl, 0);<br>
   llvm_gcroot(ret, 0);<br>
-  llvm_gcroot(tmp, 0);<br>
-  llvm_gcroot(str, 0);<br>
<br>
   BEGIN_NATIVE_EXCEPTION(0)<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>
-          !(meth->name->equals(classLoader->bootstrapLoader->clinitName)) &&<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>
-          !(meth->name->equals(classLoader->bootstrapLoader->clinitName)) &&<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>
-        upcalls->initMethod->invokeIntSpecial(vm, Meth, tmp, &Cl, &str, i);<br>
-        ArrayObject::setElement(ret, tmp, index);<br>
-        index++;<br>
-      }<br>
-    }<br>
-  }<br>
</div></div>+  ret = JavaObjectClass::getDeclaredMethods((JavaObjectClass*)Cl, publicOnly);<br>
<br>
   END_NATIVE_EXCEPTION<br>
<br>
@@ -214,14 +132,7 @@ jboolean ignore) {<br>
<div class="im"><br>
   BEGIN_NATIVE_EXCEPTION(0)<br>
<br>
-  Jnjvm* vm = JavaThread::get()->getJVM();<br>
-  UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, Cl, false);<br>
-  res = cl->getAccess();<br>
-<br>
-  if (isEnum(res) && cl->getSuper() != vm->upcalls->EnumClass) {<br>
-    // javac may put that flag to inner classes of enum classes.<br>
-    res &= ~ACC_ENUM;<br>
-  }<br>
</div>+  res = JavaObjectClass::getModifiers((JavaObjectClass*)Cl);<br>
<br>
   END_NATIVE_EXCEPTION<br>
   return res;<br>
@@ -428,49 +339,12 @@ jclass clazz,<br>
<div><div class="h5"> JavaObject* Cl, jboolean publicOnly) {<br>
<br>
   ArrayObject* ret = 0;<br>
-  JavaObject* tmp = 0;<br>
-  JavaString* name = 0;<br>
   llvm_gcroot(Cl, 0);<br>
   llvm_gcroot(ret, 0);<br>
-  llvm_gcroot(tmp, 0);<br>
-  llvm_gcroot(name, 0);<br>
<br>
   BEGIN_NATIVE_EXCEPTION(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>
-        vm->upcalls->initField->invokeIntSpecial(vm, Field, tmp, &Cl,<br>
&name, i);<br>
-        ArrayObject::setElement(ret, tmp, index);<br>
-        index++;<br>
-      }<br>
-    }<br>
-  }<br>
</div></div>+  ret = JavaObjectClass::getDeclaredFields((JavaObjectClass*)Cl, publicOnly);<br>
<br>
   END_NATIVE_EXCEPTION<br>
<br>
@@ -490,14 +364,7 @@ JavaObject* Cl) {<br>
<div class="im"><br>
   BEGIN_NATIVE_EXCEPTION(0)<br>
<br>
-  Jnjvm* vm = JavaThread::get()->getJVM();<br>
-  UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, Cl, false);<br>
-  res = (ArrayObject*)vm->upcalls->classArrayClass->doNew(cl->nbInterfaces,<br>
vm);<br>
-<br>
-  for (uint16 i = 0; i < cl->nbInterfaces; ++i) {<br>
-    UserClass* klass = cl->interfaces[i];<br>
-    ArrayObject::setElement(res, klass->getClassDelegatee(vm), i);<br>
-  }<br>
</div>+  res = JavaObjectClass::getInterfaces((JavaObjectClass*)Cl);<br>
<br>
   END_NATIVE_EXCEPTION<br>
<br>
@@ -518,16 +385,7 @@ JavaObject* Cl) {<br>
<div class="im"><br>
   BEGIN_NATIVE_EXCEPTION(0)<br>
<br>
-  Jnjvm* vm = JavaThread::get()->getJVM();<br>
-  UserClass* cl = UserCommonClass::resolvedImplClass(vm, Cl, false)->asClass();<br>
-<br>
-  if (cl) {<br>
-    cl->resolveInnerOuterClasses();<br>
-    UserClass* outer = cl->getOuterClass();<br>
-    if (outer) {<br>
-      res = outer->getClassDelegatee(vm);<br>
-    }<br>
-  }<br>
</div>+  res = JavaObjectClass::getDeclaringClass((JavaObjectClass*)Cl);<br>
<br>
   END_NATIVE_EXCEPTION<br>
<br>
@@ -548,33 +406,7 @@ JavaObject* Cl, bool publicOnly) {<br>
<div><div class="h5"><br>
   BEGIN_NATIVE_EXCEPTION(0)<br>
<br>
-  Jnjvm* vm = JavaThread::get()->getJVM();<br>
-  UserClass* cl = UserCommonClass::resolvedImplClass(vm, Cl, false)->asClass();<br>
-  if (cl) {<br>
-    cl->resolveInnerOuterClasses();<br>
-    UserClassArray* array = vm->upcalls->constructorArrayClass;<br>
-<br>
-    uint16 sizeArray = 0;<br>
-<br>
-    if (publicOnly) {<br>
-      for (uint16 i = 0; i < cl->nbInnerClasses; ++i) {<br>
-        UserClass* klass = cl->innerClasses[i];<br>
-        if (isPublic(klass->innerAccess)) ++sizeArray;<br>
-      }<br>
-    } else {<br>
-      sizeArray = cl->nbInnerClasses;<br>
-    }<br>
-<br>
-    result = (ArrayObject*)array->doNew(sizeArray, vm);<br>
-    int index = 0;<br>
-    for (uint16 i = 0; i < cl->nbInnerClasses; ++i) {<br>
-      UserClass* klass = cl->innerClasses[i];<br>
-      if (!publicOnly || isPublic(klass->innerAccess))<br>
-        ArrayObject::setElement(result, klass->getClassDelegatee(vm),<br>
index++);<br>
-    }<br>
-    assert(index == sizeArray);<br>
-  }<br>
-<br>
</div></div>+  result = JavaObjectClass::getDeclaredClasses((JavaObjectClass*)Cl,<br>
publicOnly);<br>
<br>
   END_NATIVE_EXCEPTION<br>
<br>
@@ -603,16 +435,14 @@ jclass clazz,<br>
<div class="im"> #endif<br>
 JavaObject* Cl) {<br>
   // TODO implement me<br>
-<br>
+<br>
   ArrayObject* res = 0;<br>
   llvm_gcroot(res, 0);<br>
   llvm_gcroot(Cl, 0);<br>
-<br>
+<br>
   BEGIN_NATIVE_EXCEPTION(0)<br>
<br>
-  Jnjvm* vm = JavaThread::get()->getJVM();<br>
-  UserClassArray* array = vm->upcalls->constructorArrayAnnotation;<br>
-  res = (ArrayObject*)array->doNew(0, vm);<br>
</div>+  res = JavaObjectClass::getDeclaredAnnotations((JavaObjectClass*)Cl);<br>
<br>
   END_NATIVE_EXCEPTION<br>
<br>
@@ -641,5 +471,4 @@ JavaObject* Cl) {<br>
   return res;<br>
 }<br>
<br>
-<br>
 }<br>
diff --git a/lib/J3/ClassLib/OpenJDK/ClasspathReflect.cpp<br>
b/lib/J3/ClassLib/OpenJDK/ClasspathReflect.cpp<br>
index 4842bb9..f5be3c2 100644<br>
--- a/lib/J3/ClassLib/OpenJDK/ClasspathReflect.cpp<br>
+++ b/lib/J3/ClassLib/OpenJDK/ClasspathReflect.cpp<br>
@@ -8,12 +8,14 @@<br>
 //===----------------------------------------------------------------------===//<br>
<br>
 #include "ClasspathReflect.h"<br>
+#include "JavaArray.h"<br>
 #include "JavaClass.h"<br>
 #include "JavaObject.h"<br>
 #include "JavaThread.h"<br>
-#include "Jnjvm.h"<br>
+#include "JavaTypes.h"<br>
 #include "JavaUpcalls.h"<br>
-#include "JavaArray.h"<br>
+#include "Jnjvm.h"<br>
+#include "Reflect.inc"<br>
<br>
 namespace j3 {<br>
<br>
@@ -80,4 +82,117 @@ int<br>
JavaObjectThrowable::getStackTraceDepth(JavaObjectThrowable * self) {<br>
   return size;<br>
 }<br>
<br>
+JavaObjectConstructor*<br>
JavaObjectConstructor::createFromInternalConstructor(JavaMethod *<br>
cons, int i) {<br>
+  JavaObjectConstructor* ret = 0;<br>
<div class="im">+  JavaObject* pArr = 0;<br>
+  JavaObject* eArr = 0;<br>
+  llvm_gcroot(ret, 0);<br>
+  llvm_gcroot(pArr, 0);<br>
+  llvm_gcroot(eArr, 0);<br>
</div><div class="im">+<br>
+  Jnjvm* vm = JavaThread::get()->getJVM();<br>
</div><div class="im">+  JnjvmClassLoader * classLoader = cons->classDef->classLoader;<br>
+<br>
+  UserClass* Cons = vm->upcalls->newConstructor;<br>
+  pArr = cons->getParameterTypes(classLoader);<br>
+  eArr = cons->getExceptionTypes(classLoader);<br>
</div>+  ret = (JavaObjectConstructor*)Cons->doNew(vm);<br>
<div class="im">+  JavaObject* const* Cl = cons->classDef->getDelegateePtr();<br>
+  vm->upcalls->initConstructor->invokeIntSpecial(vm, Cons, ret,<br>
+    Cl,           /* declaringClass */<br>
+    &pArr,        /* parameterTypes */<br>
+    &eArr,        /* checkedExceptions */<br>
+    cons->access, /* modifiers */<br>
+    i,            /* slot */<br>
+    NULL,         /* String signature */<br>
+    NULL,         /* annotations */<br>
+    NULL          /* parameterAnnotations */<br>
+  );<br>
+<br>
+  return ret;<br>
+}<br>
+<br>
</div>+JavaObjectMethod*<br>
JavaObjectMethod::createFromInternalMethod(JavaMethod* meth, int i) {<br>
+  JavaObjectMethod* ret = 0;<br>
<div class="im">+  JavaString* str = 0;<br>
</div><div class="im">+  JavaObject* pArr = 0;<br>
+  JavaObject* eArr = 0;<br>
+  JavaObject* retTy = 0;<br>
</div><div class="im">+  llvm_gcroot(ret, 0);<br>
+  llvm_gcroot(str, 0);<br>
</div><div class="im">+  llvm_gcroot(pArr, 0);<br>
+  llvm_gcroot(eArr, 0);<br>
+  llvm_gcroot(retTy, 0);<br>
</div><div class="im">+<br>
+  // TODO: check parameter types<br>
+  Jnjvm* vm = JavaThread::get()->getJVM();<br>
+  JnjvmClassLoader * classLoader = meth->classDef->classLoader;<br>
+<br>
+  UserClass* Meth = vm->upcalls->newMethod;<br>
</div>+  ret = (JavaObjectMethod*)Meth->doNew(vm);<br>
<div class="im">+  str = vm->internalUTF8ToStr(meth->name);<br>
+  pArr = meth->getParameterTypes(classLoader);<br>
+  eArr = meth->getExceptionTypes(classLoader);<br>
+  retTy = meth->getReturnType(classLoader);<br>
+  JavaObject* const* Cl = meth->classDef->getClassDelegateePtr(vm);<br>
+  vm->upcalls->initMethod->invokeIntSpecial(vm, Meth, ret,<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>
+<br>
+  return ret;<br>
 }<br>
+<br>
</div>+JavaObjectField* JavaObjectField::createFromInternalField(JavaField*<br>
field, int i) {<br>
+  JavaObjectField* ret = 0;<br>
<div class="im">+  JavaString* name = 0;<br>
+  llvm_gcroot(ret, 0);<br>
+  llvm_gcroot(name, 0);<br>
+<br>
</div><div class="im">+  // TODO: check parameter types<br>
+  Jnjvm* vm = JavaThread::get()->getJVM();<br>
</div><div class="im">+  UserClass* Field = vm->upcalls->newField;<br>
</div>+  ret = (JavaObjectField*)Field->doNew(vm);<br>
<div><div class="h5">+  name = vm->internalUTF8ToStr(field->name);<br>
+<br>
+  //type->Class<br>
+  JnjvmClassLoader* loader = field->classDef->classLoader;<br>
+  UserCommonClass * fieldCl = field->getSignature()->assocClass(loader);<br>
+  assert(fieldCl);<br>
+  JavaObject* const* type = fieldCl->getClassDelegateePtr(vm);<br>
+  JavaObject* const* Cl = field->classDef->getClassDelegateePtr(vm);<br>
+<br>
+  // TODO:Implement these!<br>
+  JavaObject** sign = NULL;<br>
+  JavaObject** annArray = NULL;<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, ret,<br>
+    Cl,<br>
+    &name,<br>
+    type,<br>
+    field->access,<br>
+    i,<br>
+    sign,<br>
+    annArray);<br>
+<br>
+  return ret;<br>
+}<br>
</div></div>+<br>
+} // end namespace j3<br>
diff --git a/lib/J3/ClassLib/OpenJDK/ClasspathReflect.h<br>
b/lib/J3/ClassLib/OpenJDK/ClasspathReflect.h<br>
index 0055a73..15e9574 100644<br>
--- a/lib/J3/ClassLib/OpenJDK/ClasspathReflect.h<br>
+++ b/lib/J3/ClassLib/OpenJDK/ClasspathReflect.h<br>
@@ -92,6 +92,15 @@ public:<br>
       if (*Obj) mvm::Collector::markAndTraceRoot(Obj, closure);<br>
     }<br>
   }<br>
+<br>
+  static ArrayObject* getDeclaredAnnotations(JavaObjectClass* Cl);<br>
+  static ArrayObject* getDeclaredClasses(JavaObjectClass* Cl, bool publicOnly);<br>
+  static ArrayObject* getDeclaredConstructors(JavaObjectClass* Cl,<br>
bool publicOnly);<br>
+  static ArrayObject* getDeclaredFields(JavaObjectClass* Cl, bool publicOnly);<br>
+  static ArrayObject* getDeclaredMethods(JavaObjectClass* Cl, bool publicOnly);<br>
+  static ArrayObject* getInterfaces(JavaObjectClass* Cl);<br>
+  static JavaObject* getDeclaringClass(JavaObjectClass* Cl);<br>
+  static int getModifiers(JavaObjectClass* Cl);<br>
 };<br>
<br>
 class JavaObjectField : public JavaObject {<br>
@@ -143,6 +152,7 @@ public:<br>
     return cls->asClass();<br>
   }<br>
<br>
+  static JavaObjectField* createFromInternalField(JavaField* field, int i);<br>
 };<br>
<br>
 class JavaObjectMethod : public JavaObject {<br>
@@ -196,6 +206,7 @@ public:<br>
     return cls->asClass();<br>
   }<br>
<br>
+  static JavaObjectMethod* createFromInternalMethod(JavaMethod* meth, int i);<br>
 };<br>
<br>
 class JavaObjectConstructor : public JavaObject {<br>
@@ -240,6 +251,7 @@ public:<br>
     return cls->asClass();<br>
   }<br>
<br>
+  static JavaObjectConstructor*<br>
createFromInternalConstructor(JavaMethod* cons, int i);<br>
 };<br>
<br>
 class JavaObjectThrowable : public JavaObject {<br>
diff --git a/lib/J3/ClassLib/OpenJDK/OpenJDK.inc<br>
b/lib/J3/ClassLib/OpenJDK/OpenJDK.inc<br>
index 016c067..ed84bf1 100644<br>
--- a/lib/J3/ClassLib/OpenJDK/OpenJDK.inc<br>
+++ b/lib/J3/ClassLib/OpenJDK/OpenJDK.inc<br>
@@ -1186,7 +1186,18 @@ JVM_GetClassName(JNIEnv *env, jclass cls) {<br>
<div class="im"><br>
 JNIEXPORT jobjectArray JNICALL<br>
 JVM_GetClassInterfaces(JNIEnv *env, jclass cls) {<br>
-  NYI();<br>
+  ArrayObject* ret = 0;<br>
+  llvm_gcroot(ret, 0);<br>
+<br>
+  BEGIN_JNI_EXCEPTION<br>
+<br>
</div>+  ret = JavaObjectClass::getInterfaces(*(JavaObjectClass**)cls);<br>
<div class="im">+<br>
+  RETURN_FROM_JNI((jobjectArray)th->pushJNIRef(ret));<br>
+<br>
+  END_JNI_EXCEPTION<br>
+<br>
+  return 0;<br>
 }<br>
<br>
 JNIEXPORT jobject JNICALL<br>
</div>@@ -1328,23 +1339,13 @@ JVM_GetComponentType(JNIEnv *env, jclass cls) {<br>
<br>
 JNIEXPORT jint JNICALL<br>
 JVM_GetClassModifiers(JNIEnv *env, jclass cls) {<br>
<div class="im">-  JavaObject * Cl = 0;<br>
</div>+  JavaObjectClass * Cl = 0;<br>
   llvm_gcroot(Cl, 0);<br>
   BEGIN_JNI_EXCEPTION<br>
<br>
-  Cl = *(JavaObject**)cls;<br>
<div class="im">-<br>
-  Jnjvm* vm = JavaThread::get()->getJVM();<br>
</div><div class="im">-  UserClass* cl = UserCommonClass::resolvedImplClass(vm, Cl,<br>
false)->asClass();;<br>
-<br>
-  jint res = cl->getAccess();<br>
</div>+  Cl = *(JavaObjectClass**)cls;<br>
<div class="im"><br>
-  if (isEnum(res) && cl->getSuper() != vm->upcalls->EnumClass) {<br>
-    // javac may put that flag to inner classes of enum classes.<br>
-    res &= ~ACC_ENUM;<br>
-  }<br>
-<br>
-  RETURN_FROM_JNI(res);<br>
</div>+  RETURN_FROM_JNI(JavaObjectClass::getModifiers(Cl));<br>
<br>
   END_JNI_EXCEPTION<br>
<br>
@@ -1353,12 +1354,35 @@ JVM_GetClassModifiers(JNIEnv *env, jclass cls) {<br>
<div class="im"><br>
 JNIEXPORT jobjectArray JNICALL<br>
 JVM_GetDeclaredClasses(JNIEnv *env, jclass ofClass) {<br>
-  NYI();<br>
+  ArrayObject* ret = 0;<br>
+  llvm_gcroot(ret, 0);<br>
+<br>
+  BEGIN_JNI_EXCEPTION<br>
+<br>
+  // TODO: Verify boolean parameter here, assuming should default to true.<br>
</div>+  ret = JavaObjectClass::getDeclaredClasses(*(JavaObjectClass**)ofClass,<br>
<div class="im">false);<br>
+<br>
+  RETURN_FROM_JNI((jobjectArray)th->pushJNIRef(ret));<br>
+<br>
+  END_JNI_EXCEPTION<br>
+<br>
+  return 0;<br>
 }<br>
<br>
 JNIEXPORT jclass JNICALL<br>
 JVM_GetDeclaringClass(JNIEnv *env, jclass ofClass) {<br>
-  NYI();<br>
+  JavaObject* ret = 0;<br>
+  llvm_gcroot(ret, 0);<br>
+<br>
+  BEGIN_JNI_EXCEPTION<br>
+<br>
</div>+  ret = JavaObjectClass::getDeclaringClass(*(JavaObjectClass**)ofClass);<br>
<div class="im">+<br>
+  RETURN_FROM_JNI((jclass)th->pushJNIRef(ret));<br>
+<br>
+  END_JNI_EXCEPTION<br>
+<br>
+  return 0;<br>
 }<br>
<br>
 /* Generics support (JDK 1.5) */<br>
</div>@@ -1370,7 +1394,18 @@ JVM_GetClassSignature(JNIEnv *env, jclass cls) {<br>
<div class="im"> /* Annotations support (JDK 1.5) */<br>
 JNIEXPORT jbyteArray JNICALL<br>
 JVM_GetClassAnnotations(JNIEnv *env, jclass cls) {<br>
-  NYI();<br>
+  ArrayObject* ret = 0;<br>
+  llvm_gcroot(ret, 0);<br>
+<br>
+  BEGIN_JNI_EXCEPTION<br>
+<br>
</div>+  ret = JavaObjectClass::getDeclaredAnnotations(*(JavaObjectClass**)cls);<br>
<div class="im">+<br>
+  RETURN_FROM_JNI((jbyteArray)th->pushJNIRef(ret));<br>
+<br>
+  END_JNI_EXCEPTION<br>
+<br>
+  return 0;<br>
 }<br>
<br>
 /*<br>
</div>@@ -1380,74 +1415,11 @@ JVM_GetClassAnnotations(JNIEnv *env, jclass cls) {<br>
 JNIEXPORT jobjectArray JNICALL<br>
<div class="im"> JVM_GetClassDeclaredMethods(JNIEnv *env, jclass ofClass, jboolean publicOnly) {<br>
</div><div class="im">   ArrayObject* ret = 0;<br>
-  JavaObject* tmp = 0;<br>
-  JavaString* str = 0;<br>
</div><div class="im">-  JavaObject * Cl = 0;<br>
-  llvm_gcroot(Cl, 0);<br>
</div><div class="im">   llvm_gcroot(ret, 0);<br>
-  llvm_gcroot(tmp, 0);<br>
-  llvm_gcroot(str, 0);<br>
<br>
</div><div class="im">   BEGIN_JNI_EXCEPTION<br>
<br>
-  Cl = *(JavaObject**)ofClass;<br>
-<br>
-  Jnjvm* vm = JavaThread::get()->getJVM();<br>
-  UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, Cl, false);<br>
</div><div class="im">-  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>
</div><div class="im">-          (!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>
</div><div><div class="h5">-          (!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>
</div></div>+  ret = JavaObjectClass::getDeclaredMethods(*(JavaObjectClass**)ofClass,<br>
publicOnly);<br>
<br>
   RETURN_FROM_JNI((jobjectArray)th->pushJNIRef(ret));<br>
<br>
@@ -1459,85 +1431,12 @@ JVM_GetClassDeclaredMethods(JNIEnv *env,<br>
<div class="im">jclass ofClass, jboolean publicOnly) {<br>
 JNIEXPORT jobjectArray JNICALL<br>
 JVM_GetClassDeclaredFields(JNIEnv *env, jclass ofClass, jboolean publicOnly) {<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>
</div><div class="im">-<br>
-  Jnjvm* vm = JavaThread::get()->getJVM();<br>
-  UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, Cl, false);<br>
-<br>
</div><div class="im">-  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>
</div>+  ret = JavaObjectClass::getDeclaredFields(*(JavaObjectClass**)ofClass,<br>
publicOnly);<br>
<div><div class="h5"><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>
</div></div>@@ -1548,62 +1447,11 @@ JVM_GetClassDeclaredFields(JNIEnv *env, jclass<br>
<div><div class="h5">ofClass, jboolean publicOnly) {<br>
 JNIEXPORT jobjectArray JNICALL<br>
 JVM_GetClassDeclaredConstructors(JNIEnv *env, jclass ofClass,<br>
jboolean publicOnly) {<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>
</div></div>+  ret = JavaObjectClass::getDeclaredConstructors(*(JavaObjectClass**)ofClass,<br>
publicOnly);<br>
<br>
   RETURN_FROM_JNI((jobjectArray)th->pushJNIRef(ret));<br>
<br>
diff --git a/lib/J3/ClassLib/Reflect.inc b/lib/J3/ClassLib/Reflect.inc<br>
new file mode 100644<br>
index 0000000..1d6effd<br>
--- /dev/null<br>
+++ b/lib/J3/ClassLib/Reflect.inc<br>
@@ -0,0 +1,255 @@<br>
+//===---- Reflect.inc - Shared reflecation code<br>
<div class="im">---------------------------===//<br>
+//<br>
+//                            The VMKit project<br>
+//<br>
+// This file is distributed under the University of Illinois Open Source<br>
+// License. See LICENSE.TXT for details.<br>
+//<br>
+//===----------------------------------------------------------------------===//<br>
+<br>
</div>+#include "ClasspathReflect.h"<br>
+#include "JavaArray.h"<br>
+#include "JavaUpcalls.h"<br>
+#include "Jnjvm.h"<br>
+<br>
+namespace j3 {<br>
+<br>
+ArrayObject* JavaObjectClass::getDeclaredConstructors(JavaObjectClass*<br>
Cl, bool publicOnly) {<br>
<div><div class="h5">+  ArrayObject* ret = 0;<br>
+  JavaObject* tmp = 0;<br>
+  llvm_gcroot(Cl, 0);<br>
+  llvm_gcroot(ret, 0);<br>
+  llvm_gcroot(tmp, 0);<br>
+<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>
</div></div>+        tmp = JavaObjectConstructor::createFromInternalConstructor(meth, i);<br>
<div class="im">+        ArrayObject::setElement(ret, tmp, index);<br>
+        index++;<br>
+      }<br>
+    }<br>
+  }<br>
+<br>
+  return ret;<br>
+}<br>
+<br>
</div>+ArrayObject* JavaObjectClass::getDeclaredMethods(JavaObjectClass* Cl,<br>
bool publicOnly) {<br>
<div><div class="h5">+  ArrayObject* ret = 0;<br>
+  JavaObject* tmp = 0;<br>
+  JavaString* str = 0;<br>
+  llvm_gcroot(Cl, 0);<br>
+  llvm_gcroot(ret, 0);<br>
+  llvm_gcroot(tmp, 0);<br>
+  llvm_gcroot(str, 0);<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>
+          !(meth->name->equals(classLoader->bootstrapLoader->clinitName)) &&<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>
+          !(meth->name->equals(classLoader->bootstrapLoader->clinitName)) &&<br>
+          (!publicOnly || pub)) {<br>
</div></div>+        tmp = JavaObjectMethod::createFromInternalMethod(meth, i);<br>
<div class="im">+        ArrayObject::setElement(ret, tmp, index);<br>
+        index++;<br>
+      }<br>
+    }<br>
+  }<br>
+<br>
+  return ret;<br>
+}<br>
+<br>
</div>+JavaObject* JavaObjectClass::getDeclaringClass(JavaObjectClass* Cl) {<br>
<div class="im">+  JavaObject* res = 0;<br>
+  llvm_gcroot(Cl, 0);<br>
+  llvm_gcroot(res, 0);<br>
+<br>
+  Jnjvm* vm = JavaThread::get()->getJVM();<br>
+  UserClass* cl = UserCommonClass::resolvedImplClass(vm, Cl, false)->asClass();<br>
+<br>
+  if (cl) {<br>
+    cl->resolveInnerOuterClasses();<br>
+    UserClass* outer = cl->getOuterClass();<br>
+    if (outer) {<br>
+      res = outer->getClassDelegatee(vm);<br>
+    }<br>
+  }<br>
+<br>
+  return res;<br>
+}<br>
+<br>
</div>+ArrayObject* JavaObjectClass::getDeclaredClasses(JavaObjectClass* Cl,<br>
<div><div class="h5">bool publicOnly) {<br>
+  ArrayObject* result = 0;<br>
+  llvm_gcroot(result, 0);<br>
+  llvm_gcroot(Cl, 0);<br>
+<br>
+  Jnjvm* vm = JavaThread::get()->getJVM();<br>
+  UserClass* cl = UserCommonClass::resolvedImplClass(vm, Cl, false)->asClass();<br>
+  if (cl) {<br>
+    cl->resolveInnerOuterClasses();<br>
+    UserClassArray* array = vm->upcalls->constructorArrayClass;<br>
+<br>
+    uint16 sizeArray = 0;<br>
+<br>
+    if (publicOnly) {<br>
+      for (uint16 i = 0; i < cl->nbInnerClasses; ++i) {<br>
+        UserClass* klass = cl->innerClasses[i];<br>
+        if (isPublic(klass->innerAccess)) ++sizeArray;<br>
+      }<br>
+    } else {<br>
+      sizeArray = cl->nbInnerClasses;<br>
+    }<br>
+<br>
+    result = (ArrayObject*)array->doNew(sizeArray, vm);<br>
+    int index = 0;<br>
+    for (uint16 i = 0; i < cl->nbInnerClasses; ++i) {<br>
+      UserClass* klass = cl->innerClasses[i];<br>
+      if (!publicOnly || isPublic(klass->innerAccess))<br>
+        ArrayObject::setElement(result, klass->getClassDelegatee(vm), index++);<br>
+    }<br>
+    assert(index == sizeArray);<br>
+  }<br>
+<br>
+  return result;<br>
+}<br>
+<br>
</div></div>+ArrayObject* JavaObjectClass::getDeclaredFields(JavaObjectClass* Cl,<br>
bool publicOnly) {<br>
<div><div class="h5">+  ArrayObject* ret = 0;<br>
+  JavaObject* tmp = 0;<br>
+  JavaString* name = 0;<br>
+  llvm_gcroot(Cl, 0);<br>
+  llvm_gcroot(ret, 0);<br>
+  llvm_gcroot(tmp, 0);<br>
+  llvm_gcroot(name, 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>
+    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>
</div></div>+        tmp = JavaObjectField::createFromInternalField(field, i);<br>
<div class="im">+        ArrayObject::setElement(ret, tmp, index);<br>
+        index++;<br>
+      }<br>
+    }<br>
+  }<br>
+<br>
+  return ret;<br>
+}<br>
+<br>
</div>+ArrayObject* JavaObjectClass::getInterfaces(JavaObjectClass* Cl) {<br>
<div class="im">+  ArrayObject* res = 0;<br>
+  llvm_gcroot(Cl, 0);<br>
+  llvm_gcroot(res, 0);<br>
+<br>
+  Jnjvm* vm = JavaThread::get()->getJVM();<br>
+  UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, Cl, false);<br>
+  res = (ArrayObject*)vm->upcalls->classArrayClass->doNew(cl->nbInterfaces,<br>
vm);<br>
+<br>
+  for (uint16 i = 0; i < cl->nbInterfaces; ++i) {<br>
+    UserClass* klass = cl->interfaces[i];<br>
+    ArrayObject::setElement(res, klass->getClassDelegatee(vm), i);<br>
+  }<br>
+<br>
+  return res;<br>
+}<br>
+<br>
</div>+ArrayObject* JavaObjectClass::getDeclaredAnnotations(JavaObjectClass* Cl) {<br>
<div class="im">+  // TODO: Implement me (for now just returning empty array)<br>
+  ArrayObject* res = 0;<br>
+  llvm_gcroot(res, 0);<br>
+<br>
+  Jnjvm* vm = JavaThread::get()->getJVM();<br>
+  UserClassArray* array = vm->upcalls->constructorArrayAnnotation;<br>
+  res = (ArrayObject*)array->doNew(0, vm);<br>
+<br>
+  return res;<br>
+}<br>
+<br>
</div>+int32_t JavaObjectClass::getModifiers(JavaObjectClass* Cl) {<br>
+  llvm_gcroot(Cl, 0);<br>
+  int32_t res;<br>
<div class="im">+<br>
+  Jnjvm* vm = JavaThread::get()->getJVM();<br>
+  UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, Cl, false);<br>
+  res = cl->getAccess();<br>
+<br>
+  if (isEnum(res) && cl->getSuper() != vm->upcalls->EnumClass) {<br>
+    // javac may put that flag to inner classes of enum classes.<br>
+    res &= ~ACC_ENUM;<br>
+  }<br>
+<br>
+  return res;<br>
+}<br>
</div>+<br>
+} // end namespace j3<br>
<span class="HOEnZb"><font color="#888888">--<br>
1.7.5.1<br>
</font></span></blockquote></div><br>