[vmkit-commits] [vmkit] r144974 - in /vmkit/trunk/lib/J3/ClassLib: GNUClasspath/ClasspathReflect.cpp GNUClasspath/ClasspathReflect.h GNUClasspath/ClasspathVMClass.inc OpenJDK/ClasspathReflect.cpp OpenJDK/ClasspathReflect.h OpenJDK/OpenJDK.inc Reflect.inc

Will Dietz wdietz2 at illinois.edu
Thu Nov 17 20:40:48 PST 2011


Author: wdietz2
Date: Thu Nov 17 22:40:48 2011
New Revision: 144974

URL: http://llvm.org/viewvc/llvm-project?rev=144974&view=rev
Log:
Refactor reflection code into new Reflect.inc (shared) and ClasspathReflect

Also use this refactored layout to add implementations for the OpenJDK port

Added:
    vmkit/trunk/lib/J3/ClassLib/Reflect.inc
Modified:
    vmkit/trunk/lib/J3/ClassLib/GNUClasspath/ClasspathReflect.cpp
    vmkit/trunk/lib/J3/ClassLib/GNUClasspath/ClasspathReflect.h
    vmkit/trunk/lib/J3/ClassLib/GNUClasspath/ClasspathVMClass.inc
    vmkit/trunk/lib/J3/ClassLib/OpenJDK/ClasspathReflect.cpp
    vmkit/trunk/lib/J3/ClassLib/OpenJDK/ClasspathReflect.h
    vmkit/trunk/lib/J3/ClassLib/OpenJDK/OpenJDK.inc

Modified: vmkit/trunk/lib/J3/ClassLib/GNUClasspath/ClasspathReflect.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/ClassLib/GNUClasspath/ClasspathReflect.cpp?rev=144974&r1=144973&r2=144974&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/ClassLib/GNUClasspath/ClasspathReflect.cpp (original)
+++ vmkit/trunk/lib/J3/ClassLib/GNUClasspath/ClasspathReflect.cpp Thu Nov 17 22:40:48 2011
@@ -12,6 +12,8 @@
 #include "JavaObject.h"
 #include "JavaThread.h"
 
+#include "Reflect.inc"
+
 namespace j3 {
 
 JavaMethod* JavaObjectConstructor::getInternalMethod(JavaObjectConstructor* self) {
@@ -27,4 +29,51 @@
   return &(cls->asClass()->virtualMethods[self->slot]);
 }
 
+JavaObjectConstructor* JavaObjectConstructor::createFromInternalConstructor(JavaMethod * cons, int i) {
+  JavaObjectConstructor* ret = 0;
+  llvm_gcroot(ret, 0);
+
+  Jnjvm* vm = JavaThread::get()->getJVM();
+  UserClass* Cons = vm->upcalls->newConstructor;
+  ret = (JavaObjectConstructor*)Cons->doNew(vm);
+  JavaObject* const* Cl = cons->classDef->getDelegateePtr();
+  vm->upcalls->initConstructor->invokeIntSpecial(vm, Cons, ret,
+    Cl, i);
+
+  return ret;
+}
+
+JavaObjectMethod* JavaObjectMethod::createFromInternalMethod(JavaMethod* meth, int i) {
+  JavaObjectMethod* ret = 0;
+  JavaString* str = 0;
+  llvm_gcroot(ret, 0);
+  llvm_gcroot(str, 0);
+
+  Jnjvm* vm = JavaThread::get()->getJVM();
+  UserClass* Meth = vm->upcalls->newMethod;
+  ret = (JavaObjectMethod*)Meth->doNew(vm);
+  str = vm->internalUTF8ToStr(meth->name);
+  JavaObject* const* Cl = meth->classDef->getDelegateePtr();
+  vm->upcalls->initMethod->invokeIntSpecial(vm, Meth, ret,
+    Cl, &str, i);
+
+  return ret;
+}
+
+JavaObjectField* JavaObjectField::createFromInternalField(JavaField* field, int i) {
+  JavaObjectField* ret = 0;
+  JavaString* name = 0;
+  llvm_gcroot(ret, 0);
+  llvm_gcroot(name, 0);
+
+  Jnjvm* vm = JavaThread::get()->getJVM();
+  UserClass* Field = vm->upcalls->newField;
+  ret = (JavaObjectField*)Field->doNew(vm);
+  name = vm->internalUTF8ToStr(field->name);
+  JavaObject* const* Cl = field->classDef->getDelegateePtr();
+  vm->upcalls->initField->invokeIntSpecial(vm, Field, ret,
+    Cl, &name, i);
+
+  return ret;
+}
 }

Modified: vmkit/trunk/lib/J3/ClassLib/GNUClasspath/ClasspathReflect.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/ClassLib/GNUClasspath/ClasspathReflect.h?rev=144974&r1=144973&r2=144974&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/ClassLib/GNUClasspath/ClasspathReflect.h (original)
+++ vmkit/trunk/lib/J3/ClassLib/GNUClasspath/ClasspathReflect.h Thu Nov 17 22:40:48 2011
@@ -60,6 +60,15 @@
       if (*Obj) mvm::Collector::markAndTraceRoot(Obj, closure);
     }
   }
+
+  static ArrayObject* getDeclaredAnnotations(JavaObjectClass* Cl);
+  static ArrayObject* getDeclaredClasses(JavaObjectClass* Cl, bool publicOnly);
+  static ArrayObject* getDeclaredConstructors(JavaObjectClass* Cl, bool publicOnly);
+  static ArrayObject* getDeclaredFields(JavaObjectClass* Cl, bool publicOnly);
+  static ArrayObject* getDeclaredMethods(JavaObjectClass* Cl, bool publicOnly);
+  static ArrayObject* getInterfaces(JavaObjectClass* Cl);
+  static JavaObject* getDeclaringClass(JavaObjectClass* Cl);
+  static int getModifiers(JavaObjectClass* Cl);
 };
 
 class JavaObjectField : public JavaObject {
@@ -88,6 +97,7 @@
     return cls->asClass();
   }
 
+  static JavaObjectField* createFromInternalField(JavaField* field, int i);
 };
 
 class JavaObjectMethod : public JavaObject {
@@ -112,6 +122,7 @@
     return cls->asClass();
   }
 
+  static JavaObjectMethod* createFromInternalMethod(JavaMethod* meth, int i);
 };
 
 class JavaObjectConstructor : public JavaObject {
@@ -133,6 +144,7 @@
     return cls->asClass();
   }
 
+  static JavaObjectConstructor* createFromInternalConstructor(JavaMethod* cons, int i);
 };
 
 class JavaObjectVMThread : public JavaObject {

Modified: vmkit/trunk/lib/J3/ClassLib/GNUClasspath/ClasspathVMClass.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/ClassLib/GNUClasspath/ClasspathVMClass.inc?rev=144974&r1=144973&r2=144974&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/ClassLib/GNUClasspath/ClasspathVMClass.inc (original)
+++ vmkit/trunk/lib/J3/ClassLib/GNUClasspath/ClasspathVMClass.inc Thu Nov 17 22:40:48 2011
@@ -86,48 +86,12 @@
 jboolean publicOnly) {
 
   ArrayObject* ret = 0;
-  JavaObject* tmp = 0;
   llvm_gcroot(Cl, 0);
   llvm_gcroot(ret, 0);
-  llvm_gcroot(tmp, 0);
 
   BEGIN_NATIVE_EXCEPTION(0)
 
-  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;
-        tmp = Cons->doNew(vm);
-        vm->upcalls->initConstructor->invokeIntSpecial(vm, Cons, tmp, &Cl, i);
-        ArrayObject::setElement(ret, tmp, index);
-        index++;
-      }
-    }
-  }
+  ret = JavaObjectClass::getDeclaredConstructors((JavaObjectClass*)Cl, publicOnly);
 
   END_NATIVE_EXCEPTION
 
@@ -143,58 +107,12 @@
 jboolean publicOnly) {
 
   ArrayObject* ret = 0;
-  JavaObject* tmp = 0;
-  JavaString* str = 0;
   llvm_gcroot(Cl, 0);
   llvm_gcroot(ret, 0);
-  llvm_gcroot(tmp, 0);
-  llvm_gcroot(str, 0);
 
   BEGIN_NATIVE_EXCEPTION(0)
 
-  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)) && 
-          !(meth->name->equals(classLoader->bootstrapLoader->clinitName)) && 
-          (!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)) && 
-          !(meth->name->equals(classLoader->bootstrapLoader->clinitName)) && 
-          (!publicOnly || pub)) {
-        // TODO: check parameter types
-        UserClass* Meth = vm->upcalls->newMethod;
-        tmp = Meth->doNew(vm);
-        str = vm->internalUTF8ToStr(meth->name);
-        upcalls->initMethod->invokeIntSpecial(vm, Meth, tmp, &Cl, &str, i);
-        ArrayObject::setElement(ret, tmp, index);
-        index++;
-      }
-    }
-  }
+  ret = JavaObjectClass::getDeclaredMethods((JavaObjectClass*)Cl, publicOnly);
 
   END_NATIVE_EXCEPTION
 
@@ -214,14 +132,7 @@
 
   BEGIN_NATIVE_EXCEPTION(0)
 
-  Jnjvm* vm = JavaThread::get()->getJVM();
-  UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, Cl, false);
-  res = cl->getAccess();
-
-  if (isEnum(res) && cl->getSuper() != vm->upcalls->EnumClass) {
-    // javac may put that flag to inner classes of enum classes. 
-    res &= ~ACC_ENUM;
-  }
+  res = JavaObjectClass::getModifiers((JavaObjectClass*)Cl);
 
   END_NATIVE_EXCEPTION
   return res;
@@ -428,49 +339,12 @@
 JavaObject* Cl, jboolean publicOnly) {
 
   ArrayObject* ret = 0;
-  JavaObject* tmp = 0;
-  JavaString* name = 0;
   llvm_gcroot(Cl, 0);
   llvm_gcroot(ret, 0);
-  llvm_gcroot(tmp, 0);
-  llvm_gcroot(name, 0);
 
   BEGIN_NATIVE_EXCEPTION(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);
-        vm->upcalls->initField->invokeIntSpecial(vm, Field, tmp, &Cl, &name, i);
-        ArrayObject::setElement(ret, tmp, index);
-        index++;
-      }
-    }
-  }
+  ret = JavaObjectClass::getDeclaredFields((JavaObjectClass*)Cl, publicOnly);
 
   END_NATIVE_EXCEPTION
 
@@ -490,14 +364,7 @@
 
   BEGIN_NATIVE_EXCEPTION(0)
 
-  Jnjvm* vm = JavaThread::get()->getJVM();
-  UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, Cl, false);
-  res = (ArrayObject*)vm->upcalls->classArrayClass->doNew(cl->nbInterfaces, vm);
-
-  for (uint16 i = 0; i < cl->nbInterfaces; ++i) {
-    UserClass* klass = cl->interfaces[i];
-    ArrayObject::setElement(res, klass->getClassDelegatee(vm), i);
-  }
+  res = JavaObjectClass::getInterfaces((JavaObjectClass*)Cl);
 
   END_NATIVE_EXCEPTION
 
@@ -518,16 +385,7 @@
 
   BEGIN_NATIVE_EXCEPTION(0)
 
-  Jnjvm* vm = JavaThread::get()->getJVM();
-  UserClass* cl = UserCommonClass::resolvedImplClass(vm, Cl, false)->asClass();
-
-  if (cl) {
-    cl->resolveInnerOuterClasses();
-    UserClass* outer = cl->getOuterClass();
-    if (outer) {
-      res = outer->getClassDelegatee(vm);
-    }
-  }
+  res = JavaObjectClass::getDeclaringClass((JavaObjectClass*)Cl);
 
   END_NATIVE_EXCEPTION
 
@@ -548,33 +406,7 @@
 
   BEGIN_NATIVE_EXCEPTION(0)
 
-  Jnjvm* vm = JavaThread::get()->getJVM();
-  UserClass* cl = UserCommonClass::resolvedImplClass(vm, Cl, false)->asClass();
-  if (cl) {
-    cl->resolveInnerOuterClasses();
-    UserClassArray* array = vm->upcalls->constructorArrayClass;
-    
-    uint16 sizeArray = 0;
-
-    if (publicOnly) {
-      for (uint16 i = 0; i < cl->nbInnerClasses; ++i) {
-        UserClass* klass = cl->innerClasses[i];
-        if (isPublic(klass->innerAccess)) ++sizeArray;
-      }
-    } else {
-      sizeArray = cl->nbInnerClasses;
-    }
-
-    result = (ArrayObject*)array->doNew(sizeArray, vm);
-    int index = 0;
-    for (uint16 i = 0; i < cl->nbInnerClasses; ++i) {
-      UserClass* klass = cl->innerClasses[i];
-      if (!publicOnly || isPublic(klass->innerAccess))
-        ArrayObject::setElement(result, klass->getClassDelegatee(vm), index++); 
-    }
-    assert(index == sizeArray);
-  }
-  
+  result = JavaObjectClass::getDeclaredClasses((JavaObjectClass*)Cl, publicOnly);
 
   END_NATIVE_EXCEPTION
 
@@ -603,16 +435,14 @@
 #endif
 JavaObject* Cl) {
   // TODO implement me
-  
+
   ArrayObject* res = 0;
   llvm_gcroot(res, 0);
   llvm_gcroot(Cl, 0);
-  
+
   BEGIN_NATIVE_EXCEPTION(0)
 
-  Jnjvm* vm = JavaThread::get()->getJVM();
-  UserClassArray* array = vm->upcalls->constructorArrayAnnotation;
-  res = (ArrayObject*)array->doNew(0, vm);
+  res = JavaObjectClass::getDeclaredAnnotations((JavaObjectClass*)Cl);
 
   END_NATIVE_EXCEPTION
 
@@ -641,5 +471,4 @@
   return res;
 }
 
-
 }

Modified: vmkit/trunk/lib/J3/ClassLib/OpenJDK/ClasspathReflect.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/ClassLib/OpenJDK/ClasspathReflect.cpp?rev=144974&r1=144973&r2=144974&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/ClassLib/OpenJDK/ClasspathReflect.cpp (original)
+++ vmkit/trunk/lib/J3/ClassLib/OpenJDK/ClasspathReflect.cpp Thu Nov 17 22:40:48 2011
@@ -8,12 +8,14 @@
 //===----------------------------------------------------------------------===//
 
 #include "ClasspathReflect.h"
+#include "JavaArray.h"
 #include "JavaClass.h"
 #include "JavaObject.h"
 #include "JavaThread.h"
-#include "Jnjvm.h"
+#include "JavaTypes.h"
 #include "JavaUpcalls.h"
-#include "JavaArray.h"
+#include "Jnjvm.h"
+#include "Reflect.inc"
 
 namespace j3 {
 
@@ -80,4 +82,117 @@
   return size;
 }
 
+JavaObjectConstructor* JavaObjectConstructor::createFromInternalConstructor(JavaMethod * cons, int i) {
+  JavaObjectConstructor* ret = 0;
+  JavaObject* pArr = 0;
+  JavaObject* eArr = 0;
+  llvm_gcroot(ret, 0);
+  llvm_gcroot(pArr, 0);
+  llvm_gcroot(eArr, 0);
+
+  Jnjvm* vm = JavaThread::get()->getJVM();
+  JnjvmClassLoader * classLoader = cons->classDef->classLoader;
+
+  UserClass* Cons = vm->upcalls->newConstructor;
+  pArr = cons->getParameterTypes(classLoader);
+  eArr = cons->getExceptionTypes(classLoader);
+  ret = (JavaObjectConstructor*)Cons->doNew(vm);
+  JavaObject* const* Cl = cons->classDef->getDelegateePtr();
+  vm->upcalls->initConstructor->invokeIntSpecial(vm, Cons, ret,
+    Cl,           /* declaringClass */
+    &pArr,        /* parameterTypes */
+    &eArr,        /* checkedExceptions */
+    cons->access, /* modifiers */
+    i,            /* slot */
+    NULL,         /* String signature */
+    NULL,         /* annotations */
+    NULL          /* parameterAnnotations */
+  );
+
+  return ret;
+}
+
+JavaObjectMethod* JavaObjectMethod::createFromInternalMethod(JavaMethod* meth, int i) {
+  JavaObjectMethod* ret = 0;
+  JavaString* str = 0;
+  JavaObject* pArr = 0;
+  JavaObject* eArr = 0;
+  JavaObject* retTy = 0;
+  llvm_gcroot(ret, 0);
+  llvm_gcroot(str, 0);
+  llvm_gcroot(pArr, 0);
+  llvm_gcroot(eArr, 0);
+  llvm_gcroot(retTy, 0);
+
+  // TODO: check parameter types
+  Jnjvm* vm = JavaThread::get()->getJVM();
+  JnjvmClassLoader * classLoader = meth->classDef->classLoader;
+
+  UserClass* Meth = vm->upcalls->newMethod;
+  ret = (JavaObjectMethod*)Meth->doNew(vm);
+  str = vm->internalUTF8ToStr(meth->name);
+  pArr = meth->getParameterTypes(classLoader);
+  eArr = meth->getExceptionTypes(classLoader);
+  retTy = meth->getReturnType(classLoader);
+  JavaObject* const* Cl = meth->classDef->getClassDelegateePtr(vm);
+  vm->upcalls->initMethod->invokeIntSpecial(vm, Meth, ret,
+    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 */
+
+  return ret;
+}
+
+JavaObjectField* JavaObjectField::createFromInternalField(JavaField* field, int i) {
+  JavaObjectField* ret = 0;
+  JavaString* name = 0;
+  llvm_gcroot(ret, 0);
+  llvm_gcroot(name, 0);
+
+  // TODO: check parameter types
+  Jnjvm* vm = JavaThread::get()->getJVM();
+  UserClass* Field = vm->upcalls->newField;
+  ret = (JavaObjectField*)Field->doNew(vm);
+  name = vm->internalUTF8ToStr(field->name);
+
+  //type->Class
+  JnjvmClassLoader* loader = field->classDef->classLoader;
+  UserCommonClass * fieldCl = field->getSignature()->assocClass(loader);
+  assert(fieldCl);
+  JavaObject* const* type = fieldCl->getClassDelegateePtr(vm);
+  JavaObject* const* Cl = field->classDef->getClassDelegateePtr(vm);
+
+  // TODO:Implement these!
+  JavaObject** sign = NULL;
+  JavaObject** annArray = NULL;
+
+  /* java.reflect.Field(
+  *   Class declaringClass,
+  *   String name,
+  *   Class type,
+  *   int modifiers,
+  *   int slot,
+  *   String signature,
+  *   byte[] annotations)
+  */
+  vm->upcalls->initField->invokeIntSpecial(vm, Field, ret,
+    Cl,
+    &name,
+    type,
+    field->access,
+    i,
+    sign,
+    annArray);
+
+  return ret;
 }
+
+} // end namespace j3

Modified: vmkit/trunk/lib/J3/ClassLib/OpenJDK/ClasspathReflect.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/ClassLib/OpenJDK/ClasspathReflect.h?rev=144974&r1=144973&r2=144974&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/ClassLib/OpenJDK/ClasspathReflect.h (original)
+++ vmkit/trunk/lib/J3/ClassLib/OpenJDK/ClasspathReflect.h Thu Nov 17 22:40:48 2011
@@ -92,6 +92,15 @@
       if (*Obj) mvm::Collector::markAndTraceRoot(Obj, closure);
     }
   }
+
+  static ArrayObject* getDeclaredAnnotations(JavaObjectClass* Cl);
+  static ArrayObject* getDeclaredClasses(JavaObjectClass* Cl, bool publicOnly);
+  static ArrayObject* getDeclaredConstructors(JavaObjectClass* Cl, bool publicOnly);
+  static ArrayObject* getDeclaredFields(JavaObjectClass* Cl, bool publicOnly);
+  static ArrayObject* getDeclaredMethods(JavaObjectClass* Cl, bool publicOnly);
+  static ArrayObject* getInterfaces(JavaObjectClass* Cl);
+  static JavaObject* getDeclaringClass(JavaObjectClass* Cl);
+  static int getModifiers(JavaObjectClass* Cl);
 };
 
 class JavaObjectField : public JavaObject {
@@ -143,6 +152,7 @@
     return cls->asClass();
   }
 
+  static JavaObjectField* createFromInternalField(JavaField* field, int i);
 };
 
 class JavaObjectMethod : public JavaObject {
@@ -196,6 +206,7 @@
     return cls->asClass();
   }
 
+  static JavaObjectMethod* createFromInternalMethod(JavaMethod* meth, int i);
 };
 
 class JavaObjectConstructor : public JavaObject {
@@ -240,6 +251,7 @@
     return cls->asClass();
   }
 
+  static JavaObjectConstructor* createFromInternalConstructor(JavaMethod* cons, int i);
 };
 
 class JavaObjectThrowable : public JavaObject {

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=144974&r1=144973&r2=144974&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/ClassLib/OpenJDK/OpenJDK.inc (original)
+++ vmkit/trunk/lib/J3/ClassLib/OpenJDK/OpenJDK.inc Thu Nov 17 22:40:48 2011
@@ -1186,7 +1186,18 @@
 
 JNIEXPORT jobjectArray JNICALL
 JVM_GetClassInterfaces(JNIEnv *env, jclass cls) {
-  NYI();
+  ArrayObject* ret = 0;
+  llvm_gcroot(ret, 0);
+
+  BEGIN_JNI_EXCEPTION
+
+  ret = JavaObjectClass::getInterfaces(*(JavaObjectClass**)cls);
+
+  RETURN_FROM_JNI((jobjectArray)th->pushJNIRef(ret));
+
+  END_JNI_EXCEPTION
+
+  return 0;
 }
 
 JNIEXPORT jobject JNICALL
@@ -1328,23 +1339,13 @@
 
 JNIEXPORT jint JNICALL
 JVM_GetClassModifiers(JNIEnv *env, jclass cls) {
-  JavaObject * Cl = 0;
+  JavaObjectClass * Cl = 0;
   llvm_gcroot(Cl, 0);
   BEGIN_JNI_EXCEPTION
 
-  Cl = *(JavaObject**)cls;
-
-  Jnjvm* vm = JavaThread::get()->getJVM();
-  UserClass* cl = UserCommonClass::resolvedImplClass(vm, Cl, false)->asClass();;
+  Cl = *(JavaObjectClass**)cls;
 
-  jint res = cl->getAccess();
-
-  if (isEnum(res) && cl->getSuper() != vm->upcalls->EnumClass) {
-    // javac may put that flag to inner classes of enum classes.
-    res &= ~ACC_ENUM;
-  }
-
-  RETURN_FROM_JNI(res);
+  RETURN_FROM_JNI(JavaObjectClass::getModifiers(Cl));
 
   END_JNI_EXCEPTION
 
@@ -1353,12 +1354,35 @@
 
 JNIEXPORT jobjectArray JNICALL
 JVM_GetDeclaredClasses(JNIEnv *env, jclass ofClass) {
-  NYI();
+  ArrayObject* ret = 0;
+  llvm_gcroot(ret, 0);
+
+  BEGIN_JNI_EXCEPTION
+
+  // TODO: Verify boolean parameter here, assuming should default to true.
+  ret = JavaObjectClass::getDeclaredClasses(*(JavaObjectClass**)ofClass, false);
+
+  RETURN_FROM_JNI((jobjectArray)th->pushJNIRef(ret));
+
+  END_JNI_EXCEPTION
+
+  return 0;
 }
 
 JNIEXPORT jclass JNICALL
 JVM_GetDeclaringClass(JNIEnv *env, jclass ofClass) {
-  NYI();
+  JavaObject* ret = 0;
+  llvm_gcroot(ret, 0);
+
+  BEGIN_JNI_EXCEPTION
+
+  ret = JavaObjectClass::getDeclaringClass(*(JavaObjectClass**)ofClass);
+
+  RETURN_FROM_JNI((jclass)th->pushJNIRef(ret));
+
+  END_JNI_EXCEPTION
+
+  return 0;
 }
 
 /* Generics support (JDK 1.5) */
@@ -1370,7 +1394,18 @@
 /* Annotations support (JDK 1.5) */
 JNIEXPORT jbyteArray JNICALL
 JVM_GetClassAnnotations(JNIEnv *env, jclass cls) {
-  NYI();
+  ArrayObject* ret = 0;
+  llvm_gcroot(ret, 0);
+
+  BEGIN_JNI_EXCEPTION
+
+  ret = JavaObjectClass::getDeclaredAnnotations(*(JavaObjectClass**)cls);
+
+  RETURN_FROM_JNI((jbyteArray)th->pushJNIRef(ret));
+
+  END_JNI_EXCEPTION
+
+  return 0;
 }
 
 /*
@@ -1380,74 +1415,11 @@
 JNIEXPORT jobjectArray JNICALL
 JVM_GetClassDeclaredMethods(JNIEnv *env, jclass ofClass, jboolean publicOnly) {
   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++;
-      }
-    }
-  }
+  ret = JavaObjectClass::getDeclaredMethods(*(JavaObjectClass**)ofClass, publicOnly);
 
   RETURN_FROM_JNI((jobjectArray)th->pushJNIRef(ret));
 
@@ -1459,85 +1431,12 @@
 JNIEXPORT jobjectArray JNICALL
 JVM_GetClassDeclaredFields(JNIEnv *env, jclass ofClass, jboolean publicOnly) {
   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);
+  ret = JavaObjectClass::getDeclaredFields(*(JavaObjectClass**)ofClass, publicOnly);
 
-  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
@@ -1548,62 +1447,11 @@
 JNIEXPORT jobjectArray JNICALL
 JVM_GetClassDeclaredConstructors(JNIEnv *env, jclass ofClass, jboolean publicOnly) {
   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++;
-      }
-    }
-  }
+  ret = JavaObjectClass::getDeclaredConstructors(*(JavaObjectClass**)ofClass, publicOnly);
 
   RETURN_FROM_JNI((jobjectArray)th->pushJNIRef(ret));
 

Added: vmkit/trunk/lib/J3/ClassLib/Reflect.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/ClassLib/Reflect.inc?rev=144974&view=auto
==============================================================================
--- vmkit/trunk/lib/J3/ClassLib/Reflect.inc (added)
+++ vmkit/trunk/lib/J3/ClassLib/Reflect.inc Thu Nov 17 22:40:48 2011
@@ -0,0 +1,255 @@
+//===---- Reflect.inc - Shared reflecation code ---------------------------===//
+//
+//                            The VMKit project
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "ClasspathReflect.h"
+#include "JavaArray.h"
+#include "JavaUpcalls.h"
+#include "Jnjvm.h"
+
+namespace j3 {
+
+ArrayObject* JavaObjectClass::getDeclaredConstructors(JavaObjectClass* Cl, bool publicOnly) {
+  ArrayObject* ret = 0;
+  JavaObject* tmp = 0;
+  llvm_gcroot(Cl, 0);
+  llvm_gcroot(ret, 0);
+  llvm_gcroot(tmp, 0);
+
+
+  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)) {
+        tmp = JavaObjectConstructor::createFromInternalConstructor(meth, i);
+        ArrayObject::setElement(ret, tmp, index);
+        index++;
+      }
+    }
+  }
+
+  return ret;
+}
+
+ArrayObject* JavaObjectClass::getDeclaredMethods(JavaObjectClass* Cl, bool publicOnly) {
+  ArrayObject* ret = 0;
+  JavaObject* tmp = 0;
+  JavaString* str = 0;
+  llvm_gcroot(Cl, 0);
+  llvm_gcroot(ret, 0);
+  llvm_gcroot(tmp, 0);
+  llvm_gcroot(str, 0);
+
+  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)) &&
+          !(meth->name->equals(classLoader->bootstrapLoader->clinitName)) &&
+          (!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)) &&
+          !(meth->name->equals(classLoader->bootstrapLoader->clinitName)) &&
+          (!publicOnly || pub)) {
+        tmp = JavaObjectMethod::createFromInternalMethod(meth, i);
+        ArrayObject::setElement(ret, tmp, index);
+        index++;
+      }
+    }
+  }
+
+  return ret;
+}
+
+JavaObject* JavaObjectClass::getDeclaringClass(JavaObjectClass* Cl) {
+  JavaObject* res = 0;
+  llvm_gcroot(Cl, 0);
+  llvm_gcroot(res, 0);
+
+  Jnjvm* vm = JavaThread::get()->getJVM();
+  UserClass* cl = UserCommonClass::resolvedImplClass(vm, Cl, false)->asClass();
+
+  if (cl) {
+    cl->resolveInnerOuterClasses();
+    UserClass* outer = cl->getOuterClass();
+    if (outer) {
+      res = outer->getClassDelegatee(vm);
+    }
+  }
+
+  return res;
+}
+
+ArrayObject* JavaObjectClass::getDeclaredClasses(JavaObjectClass* Cl, bool publicOnly) {
+  ArrayObject* result = 0;
+  llvm_gcroot(result, 0);
+  llvm_gcroot(Cl, 0);
+
+  Jnjvm* vm = JavaThread::get()->getJVM();
+  UserClass* cl = UserCommonClass::resolvedImplClass(vm, Cl, false)->asClass();
+  if (cl) {
+    cl->resolveInnerOuterClasses();
+    UserClassArray* array = vm->upcalls->constructorArrayClass;
+
+    uint16 sizeArray = 0;
+
+    if (publicOnly) {
+      for (uint16 i = 0; i < cl->nbInnerClasses; ++i) {
+        UserClass* klass = cl->innerClasses[i];
+        if (isPublic(klass->innerAccess)) ++sizeArray;
+      }
+    } else {
+      sizeArray = cl->nbInnerClasses;
+    }
+
+    result = (ArrayObject*)array->doNew(sizeArray, vm);
+    int index = 0;
+    for (uint16 i = 0; i < cl->nbInnerClasses; ++i) {
+      UserClass* klass = cl->innerClasses[i];
+      if (!publicOnly || isPublic(klass->innerAccess))
+        ArrayObject::setElement(result, klass->getClassDelegatee(vm), index++);
+    }
+    assert(index == sizeArray);
+  }
+
+  return result;
+}
+
+ArrayObject* JavaObjectClass::getDeclaredFields(JavaObjectClass* Cl, bool publicOnly) {
+  ArrayObject* ret = 0;
+  JavaObject* tmp = 0;
+  JavaString* name = 0;
+  llvm_gcroot(Cl, 0);
+  llvm_gcroot(ret, 0);
+  llvm_gcroot(tmp, 0);
+  llvm_gcroot(name, 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)) {
+        tmp = JavaObjectField::createFromInternalField(field, i);
+        ArrayObject::setElement(ret, tmp, index);
+        index++;
+      }
+    }
+  }
+
+  return ret;
+}
+
+ArrayObject* JavaObjectClass::getInterfaces(JavaObjectClass* Cl) {
+  ArrayObject* res = 0;
+  llvm_gcroot(Cl, 0);
+  llvm_gcroot(res, 0);
+
+  Jnjvm* vm = JavaThread::get()->getJVM();
+  UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, Cl, false);
+  res = (ArrayObject*)vm->upcalls->classArrayClass->doNew(cl->nbInterfaces, vm);
+
+  for (uint16 i = 0; i < cl->nbInterfaces; ++i) {
+    UserClass* klass = cl->interfaces[i];
+    ArrayObject::setElement(res, klass->getClassDelegatee(vm), i);
+  }
+
+  return res;
+}
+
+ArrayObject* JavaObjectClass::getDeclaredAnnotations(JavaObjectClass* Cl) {
+  // TODO: Implement me (for now just returning empty array)
+  ArrayObject* res = 0;
+  llvm_gcroot(res, 0);
+
+  Jnjvm* vm = JavaThread::get()->getJVM();
+  UserClassArray* array = vm->upcalls->constructorArrayAnnotation;
+  res = (ArrayObject*)array->doNew(0, vm);
+
+  return res;
+}
+
+int32_t JavaObjectClass::getModifiers(JavaObjectClass* Cl) {
+  llvm_gcroot(Cl, 0);
+  int32_t res;
+
+  Jnjvm* vm = JavaThread::get()->getJVM();
+  UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, Cl, false);
+  res = cl->getAccess();
+
+  if (isEnum(res) && cl->getSuper() != vm->upcalls->EnumClass) {
+    // javac may put that flag to inner classes of enum classes.
+    res &= ~ACC_ENUM;
+  }
+
+  return res;
+}
+
+} // end namespace j3





More information about the vmkit-commits mailing list