[vmkit-commits] [vmkit] r147380 - in /vmkit/trunk/lib/j3: ClassLib/OpenJDK/ClasspathReflect.cpp ClassLib/OpenJDK/ClasspathReflect.h ClassLib/OpenJDK/OpenJDK.inc VMCore/JavaClass.cpp VMCore/JavaClass.h VMCore/JnjvmClassLoader.cpp

Will Dietz wdietz2 at illinois.edu
Fri Dec 30 12:40:16 PST 2011


Author: wdietz2
Date: Fri Dec 30 14:40:16 2011
New Revision: 147380

URL: http://llvm.org/viewvc/llvm-project?rev=147380&view=rev
Log:
Add support for annotation-related attributes in OpenJDK.

Populate signature fields in generated reflection objects also.

Modified:
    vmkit/trunk/lib/j3/ClassLib/OpenJDK/ClasspathReflect.cpp
    vmkit/trunk/lib/j3/ClassLib/OpenJDK/ClasspathReflect.h
    vmkit/trunk/lib/j3/ClassLib/OpenJDK/OpenJDK.inc
    vmkit/trunk/lib/j3/VMCore/JavaClass.cpp
    vmkit/trunk/lib/j3/VMCore/JavaClass.h
    vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.cpp

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=147380&r1=147379&r2=147380&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/ClassLib/OpenJDK/ClasspathReflect.cpp (original)
+++ vmkit/trunk/lib/j3/ClassLib/OpenJDK/ClasspathReflect.cpp Fri Dec 30 14:40:16 2011
@@ -10,11 +10,14 @@
 #include "ClasspathReflect.h"
 #include "JavaArray.h"
 #include "JavaClass.h"
+#include "JavaConstantPool.h"
 #include "JavaObject.h"
 #include "JavaThread.h"
 #include "JavaTypes.h"
 #include "JavaUpcalls.h"
 #include "Jnjvm.h"
+#include "Reader.h"
+
 #include "Reflect.inc"
 
 namespace j3 {
@@ -86,9 +89,13 @@
   JavaObjectConstructor* ret = 0;
   JavaObject* pArr = 0;
   JavaObject* eArr = 0;
+  ArraySInt8* ann = 0;
+  ArraySInt8* pmAnn = 0;
   llvm_gcroot(ret, 0);
   llvm_gcroot(pArr, 0);
   llvm_gcroot(eArr, 0);
+  llvm_gcroot(ann, 0);
+  llvm_gcroot(pmAnn, 0);
 
   Jnjvm* vm = JavaThread::get()->getJVM();
   JnjvmClassLoader * classLoader = cons->classDef->classLoader;
@@ -98,15 +105,20 @@
   eArr = cons->getExceptionTypes(classLoader);
   ret = (JavaObjectConstructor*)Cons->doNew(vm);
   JavaObject* const* Cl = cons->classDef->getDelegateePtr();
+
+  JavaString ** sig = getSignature(cons);
+  ann = getAnnotations(cons);
+  pmAnn = getParamAnnotations(cons);
+
   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 */
+    sig,          /* String signature */
+    &ann,         /* annotations */
+    &pmAnn        /* parameterAnnotations */
   );
 
   return ret;
@@ -118,11 +130,17 @@
   JavaObject* pArr = 0;
   JavaObject* eArr = 0;
   JavaObject* retTy = 0;
+  ArraySInt8* ann = 0;
+  ArraySInt8* pmAnn = 0;
+  ArraySInt8* defAnn = 0;
   llvm_gcroot(ret, 0);
   llvm_gcroot(str, 0);
   llvm_gcroot(pArr, 0);
   llvm_gcroot(eArr, 0);
   llvm_gcroot(retTy, 0);
+  llvm_gcroot(ann, 0);
+  llvm_gcroot(pmAnn, 0);
+  llvm_gcroot(defAnn, 0);
 
   // TODO: check parameter types
   Jnjvm* vm = JavaThread::get()->getJVM();
@@ -134,6 +152,11 @@
   pArr = meth->getParameterTypes(classLoader);
   eArr = meth->getExceptionTypes(classLoader);
   retTy = meth->getReturnType(classLoader);
+  JavaString ** sig = getSignature(meth);
+  ann = getAnnotations(meth);
+  pmAnn = getParamAnnotations(meth);
+  defAnn = getAnnotationDefault(meth);
+
   JavaObject* const* Cl = meth->classDef->getClassDelegateePtr(vm);
   vm->upcalls->initMethod->invokeIntSpecial(vm, Meth, ret,
     Cl,           /* declaring class */
@@ -143,10 +166,10 @@
     &eArr,        /* exceptions */
     meth->access, /* modifiers */
     i,            /* slot */
-    NULL,         /* signature */
-    NULL,         /* annotations */
-    NULL,         /* parameter annotations */
-    NULL);        /* default annotations */
+    sig,          /* signature */
+    &ann,         /* annotations */
+    &pmAnn,       /* parameter annotations */
+    &defAnn);     /* default annotations */
 
   return ret;
 }
@@ -154,8 +177,10 @@
 JavaObjectField* JavaObjectField::createFromInternalField(JavaField* field, int i) {
   JavaObjectField* ret = 0;
   JavaString* name = 0;
+  ArraySInt8* ann = 0;
   llvm_gcroot(ret, 0);
   llvm_gcroot(name, 0);
+  llvm_gcroot(ann, 0);
 
   // TODO: check parameter types
   Jnjvm* vm = JavaThread::get()->getJVM();
@@ -170,9 +195,8 @@
   JavaObject* const* type = fieldCl->getClassDelegateePtr(vm);
   JavaObject* const* Cl = field->classDef->getClassDelegateePtr(vm);
 
-  // TODO:Implement these!
-  JavaObject** sign = NULL;
-  JavaObject** annArray = NULL;
+  JavaString** sig = getSignature(field);
+  ann = getAnnotations(field);
 
   /* java.reflect.Field(
   *   Class declaringClass,
@@ -189,10 +213,106 @@
     type,
     field->access,
     i,
-    sign,
-    annArray);
+    sig,
+    ann);
 
   return ret;
 }
 
+static inline JavaString** getSignatureString(Attribut* sigAtt, Class* cl) {
+  if (!sigAtt) return 0;
+
+  Reader reader(sigAtt, cl->bytes);
+  uint16 index = reader.readU2();
+
+  return cl->classLoader->UTF8ToStr(cl->getConstantPool()->UTF8At(index));
+
+}
+
+JavaString** JavaObjectClass::getSignature(Class *cl) {
+  Attribut* sigAtt = cl->lookupAttribut(Attribut::signatureAttribut);
+  return getSignatureString(sigAtt, cl);
+}
+
+JavaString** JavaObjectField::getSignature(JavaField* field) {
+  Attribut* sigAtt = field->lookupAttribut(Attribut::signatureAttribut);
+  return getSignatureString(sigAtt, field->classDef);
+}
+
+JavaString** JavaObjectMethod::getSignature(JavaMethod* meth) {
+  Attribut* sigAtt = meth->lookupAttribut(Attribut::signatureAttribut);
+  return getSignatureString(sigAtt, meth->classDef);
+}
+
+JavaString** JavaObjectConstructor::getSignature(JavaMethod* cons) {
+  Attribut* sigAtt = cons->lookupAttribut(Attribut::signatureAttribut);
+  return getSignatureString(sigAtt, cons->classDef);
+}
+
+static inline ArraySInt8* getAttrBytes(Attribut* annotationsAtt, Class* cl) {
+  ArraySInt8* ret = 0;
+  llvm_gcroot(ret, 0);
+
+  if (!annotationsAtt) return 0;
+
+  JavaThread* th = JavaThread::get();
+  Jnjvm* vm = th->getJVM();
+
+  uint32 len = annotationsAtt->nbb;
+  ret = (ArraySInt8*)vm->upcalls->ArrayOfByte->doNew(len, vm);
+
+  Reader reader(annotationsAtt, cl->bytes);
+  for(uint32 i = 0; i < len; ++i) {
+    ArraySInt8::setElement(ret, reader.readS1(), i);
+  }
+
+  return ret;
+}
+
+ArraySInt8* JavaObjectClass::getAnnotations(Class *cl) {
+  Attribut* attr =
+    cl->lookupAttribut(Attribut::annotationsAttribut);
+
+  return getAttrBytes(attr, cl);
+}
+
+ArraySInt8* JavaObjectField::getAnnotations(JavaField *field) {
+  Attribut* attr =
+    field->lookupAttribut(Attribut::annotationsAttribut);
+
+  return getAttrBytes(attr, field->classDef);
+}
+
+ArraySInt8* JavaObjectMethod::getAnnotations(JavaMethod *meth) {
+  Attribut* attr =
+    meth->lookupAttribut(Attribut::annotationsAttribut);
+
+  return getAttrBytes(attr, meth->classDef);
+}
+ArraySInt8* JavaObjectMethod::getParamAnnotations(JavaMethod *meth) {
+  Attribut* attr =
+    meth->lookupAttribut(Attribut::paramAnnotationsAttribut);
+
+  return getAttrBytes(attr, meth->classDef);
+}
+ArraySInt8* JavaObjectMethod::getAnnotationDefault(JavaMethod *meth) {
+  Attribut* attr =
+    meth->lookupAttribut(Attribut::annotationDefaultAttribut);
+
+  return getAttrBytes(attr, meth->classDef);
+}
+
+ArraySInt8* JavaObjectConstructor::getAnnotations(JavaMethod *cons) {
+  Attribut* attr =
+    cons->lookupAttribut(Attribut::annotationsAttribut);
+
+  return getAttrBytes(attr, cons->classDef);
+}
+ArraySInt8* JavaObjectConstructor::getParamAnnotations(JavaMethod *cons) {
+  Attribut* attr =
+    cons->lookupAttribut(Attribut::paramAnnotationsAttribut);
+
+  return getAttrBytes(attr, cons->classDef);
+}
+
 } // 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=147380&r1=147379&r2=147380&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/ClassLib/OpenJDK/ClasspathReflect.h (original)
+++ vmkit/trunk/lib/j3/ClassLib/OpenJDK/ClasspathReflect.h Fri Dec 30 14:40:16 2011
@@ -12,6 +12,7 @@
 
 #include "VmkitGC.h"
 
+#include "JavaArray.h"
 #include "JavaClass.h"
 #include "JavaObject.h"
 #include "JavaThread.h"
@@ -97,7 +98,6 @@
     }
   }
 
-  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);
@@ -105,6 +105,8 @@
   static ArrayObject* getInterfaces(JavaObjectClass* Cl);
   static JavaObject* getDeclaringClass(JavaObjectClass* Cl);
   static int getModifiers(JavaObjectClass* Cl);
+  static JavaString** getSignature(Class* cl);
+  static ArraySInt8* getAnnotations(Class* cl);
 };
 
 class JavaObjectField : public JavaObject {
@@ -157,6 +159,8 @@
   }
 
   static JavaObjectField* createFromInternalField(JavaField* field, int i);
+  static JavaString** getSignature(JavaField* field);
+  static ArraySInt8* getAnnotations(JavaField* field);
 };
 
 class JavaObjectMethod : public JavaObject {
@@ -211,6 +215,10 @@
   }
 
   static JavaObjectMethod* createFromInternalMethod(JavaMethod* meth, int i);
+  static JavaString** getSignature(JavaMethod* meth);
+  static ArraySInt8* getAnnotations(JavaMethod* meth);
+  static ArraySInt8* getParamAnnotations(JavaMethod* meth);
+  static ArraySInt8* getAnnotationDefault(JavaMethod* meth);
 };
 
 class JavaObjectConstructor : public JavaObject {
@@ -256,6 +264,9 @@
   }
 
   static JavaObjectConstructor* createFromInternalConstructor(JavaMethod* cons, int i);
+  static JavaString** getSignature(JavaMethod* cons);
+  static ArraySInt8* getAnnotations(JavaMethod* cons);
+  static ArraySInt8* getParamAnnotations(JavaMethod* cons);
 };
 
 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=147380&r1=147379&r2=147380&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/ClassLib/OpenJDK/OpenJDK.inc (original)
+++ vmkit/trunk/lib/j3/ClassLib/OpenJDK/OpenJDK.inc Fri Dec 30 14:40:16 2011
@@ -1674,7 +1674,6 @@
 JNIEXPORT jstring JNICALL
 JVM_GetClassSignature(JNIEnv *env, jclass cls) {
   JavaObjectClass * Cl = 0;
-  jstring sig = 0;
   llvm_gcroot(Cl, 0);
 
   BEGIN_JNI_EXCEPTION
@@ -1682,24 +1681,11 @@
   Cl = cls ? *(JavaObjectClass**)cls : 0;
   verifyNull(Cl);
 
-  Jnjvm* vm = th->getJVM();
-  CommonClass* CC =
-    UserCommonClass::resolvedImplClass(vm, Cl, false);
-  Class* cl = CC->asClass();
-
-  // Primitives, arrays, interfaces...
-  if (!cl) RETURN_FROM_JNI(0);
-
-  Attribut* sigAtt = cl->lookupAttribut(Attribut::signatureAttribut);
-
-  if (sigAtt) {
-    Reader reader(sigAtt, cl->bytes);
-    uint16 index = reader.readU2();
-
-    sig = (jstring)cl->classLoader->UTF8ToStr(cl->getConstantPool()->UTF8At(index));
-  }
+  Class* cl = JavaObjectClass::getClass(Cl)->asClass();
+  if (!cl) return 0;
 
-  RETURN_FROM_JNI(sig);
+  JavaString** sig = JavaObjectClass::getSignature(cl);
+  RETURN_FROM_JNI((jstring)sig);
 
   END_JNI_EXCEPTION
 
@@ -1718,28 +1704,12 @@
 
   Cl = cls ? *(JavaObjectClass**)cls : 0;
   verifyNull(Cl);
-
-  Jnjvm* vm = th->getJVM();
-  CommonClass* CC = JavaObjectClass::getClass(Cl);
-  assert(CC);
-  Class* cl = CC->asClass();
+  Class * cl = JavaObjectClass::getClass(Cl)->asClass();
   assert(cl);
 
-  Attribut* annotationsAtt =
-    cl->lookupAttribut(Attribut::annotationsAttribut);
-
-  if (annotationsAtt) {
-    uint32 len = annotationsAtt->nbb;
-    ret = (ArraySInt8*)vm->upcalls->ArrayOfByte->doNew(len, vm);
-
-    Reader reader(annotationsAtt, cl->bytes);
-    for(uint32 i = 0; i < len; ++i) {
-      ArraySInt8::setElement(ret, reader.readS1(), i);
-    }
-    RETURN_REF_FROM_JNI(ret, jbyteArray);
-  }
+  ret = JavaObjectClass::getAnnotations(cl);
 
-  RETURN_FROM_JNI(0);
+  RETURN_REF_FROM_JNI(ret, jbyteArray);
 
   END_JNI_EXCEPTION
 

Modified: vmkit/trunk/lib/j3/VMCore/JavaClass.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JavaClass.cpp?rev=147380&r1=147379&r2=147380&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JavaClass.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/JavaClass.cpp Fri Dec 30 14:40:16 2011
@@ -38,6 +38,8 @@
 const UTF8* Attribut::sourceFileAttribut = 0;
 const UTF8* Attribut::signatureAttribut = 0;
 const UTF8* Attribut::enclosingMethodAttribut = 0;
+const UTF8* Attribut::paramAnnotationsAttribut = 0;
+const UTF8* Attribut::annotationDefaultAttribut = 0;
 
 Class* ClassArray::SuperArray;
 Class** ClassArray::InterfacesArray;

Modified: vmkit/trunk/lib/j3/VMCore/JavaClass.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JavaClass.h?rev=147380&r1=147379&r2=147380&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JavaClass.h (original)
+++ vmkit/trunk/lib/j3/VMCore/JavaClass.h Fri Dec 30 14:40:16 2011
@@ -140,7 +140,14 @@
   /// attribut that identifies the method definining a local or anonymous class
   ///
   static const UTF8* enclosingMethodAttribut;
-  
+
+  /// paramAnnotationsAttribut - Annotations for parameters attribut
+  ///
+  static const UTF8* paramAnnotationsAttribut;
+
+  /// annotationDefaultAttribut - The "AnnotationDefault" attribut
+  ///
+  static const UTF8* annotationDefaultAttribut;
 };
 
 /// TaskClassMirror - The isolate specific class information: the initialization

Modified: vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.cpp?rev=147380&r1=147379&r2=147380&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.cpp Fri Dec 30 14:40:16 2011
@@ -152,6 +152,8 @@
   Attribut::sourceFileAttribut = asciizConstructUTF8("SourceFile");
   Attribut::signatureAttribut = asciizConstructUTF8("Signature");
   Attribut::enclosingMethodAttribut = asciizConstructUTF8("EnclosingMethod");
+  Attribut::paramAnnotationsAttribut = asciizConstructUTF8("RuntimeVisibleParameterAnnotations");
+  Attribut::annotationDefaultAttribut = asciizConstructUTF8("AnnotationDefault");
  
   JavaCompiler::InlinePragma =
     asciizConstructUTF8("Lorg/vmmagic/pragma/Inline;");





More information about the vmkit-commits mailing list