[vmkit-commits] [vmkit] r143672 - /vmkit/trunk/lib/J3/ClassLib/OpenJDK/OpenJDK.inc

Will Dietz wdietz2 at illinois.edu
Thu Nov 3 18:08:00 PDT 2011


Author: wdietz2
Date: Thu Nov  3 20:08:00 2011
New Revision: 143672

URL: http://llvm.org/viewvc/llvm-project?rev=143672&view=rev
Log:
Impl JVM_GetClassDeclared{Fields,Methods,Constructors}

Modified:
    vmkit/trunk/lib/J3/ClassLib/OpenJDK/OpenJDK.inc

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





More information about the vmkit-commits mailing list