[vmkit-commits] [vmkit] r180341 - getDeclaredAnnotations in VMField is working for GNUClasspath

Peter Senna Tschudin peter.senna at gmail.com
Thu Apr 25 10:01:05 PDT 2013


Author: peter.senna
Date: Thu Apr 25 11:59:31 2013
New Revision: 180341

URL: http://llvm.org/viewvc/llvm-project?rev=180341&view=rev
Log:
getDeclaredAnnotations in VMField is working for GNUClasspath
(cherry picked from commit 43fb29a378aee7d15ad27760c978615cdea505b1)

Modified:
    vmkit/trunk/incinerator/tests/AnnotationClassTest.java
    vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMField.inc

Modified: vmkit/trunk/incinerator/tests/AnnotationClassTest.java
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/incinerator/tests/AnnotationClassTest.java?rev=180341&r1=180340&r2=180341&view=diff
==============================================================================
--- vmkit/trunk/incinerator/tests/AnnotationClassTest.java (original)
+++ vmkit/trunk/incinerator/tests/AnnotationClassTest.java Thu Apr 25 11:59:31 2013
@@ -28,9 +28,13 @@ public class AnnotationClassTest {
     Method m = Sample.class.getMethod("y");
     Sample sample = new Sample();
     sample.x = 14;
+    
+    f.getDeclaredAnnotations();
 
     MyAnnotation xx = (MyAnnotation)f.getAnnotation(MyAnnotation.class);
 		MyAnnotation yy = (MyAnnotation)f.getAnnotation(MyAnnotation.class);
+		
+		
 
     check(f.getInt(sample) == 14);
     f.setInt(sample, 17);

Modified: vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMField.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMField.inc?rev=180341&r1=180340&r2=180341&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMField.inc (original)
+++ vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMField.inc Thu Apr 25 11:59:31 2013
@@ -28,7 +28,7 @@
 
 #include "Reader.h"
 
-#if 1
+#if 0
 using namespace vmkit;
 #define dprintf(...) do { printf("ClasspathVMField: "); printf(__VA_ARGS__); } while(0)
 #else
@@ -60,7 +60,7 @@ JavaObjectVMField* VMField, JavaObjectCl
   if (annotationClass) {
     /* Retrieving annotationClass classname */
     UserClass* clazz = JavaObjectClass::getClass(annotationClass)->asClass();
-    dprintf("searched annotation : %s\n\n", UTF8Buffer(clazz->name).cString());
+    dprintf("searched annotation : %s in loader %ld\n\n", UTF8Buffer(clazz->name).cString(), JavaObjectClass::getClass(annotationClass)->classLoader);
 
     /* Retrieving VMField.class attributes list */
     UserClass* compilingClass = JavaObjectVMField::getClass(VMField);
@@ -83,6 +83,8 @@ JavaObjectVMField* VMField, JavaObjectCl
 				dprintf("Comparing with  : %s\n", UTF8Buffer(annoType).cString());
 				if (clazz->name->equals(annoType->elements+1, annoType->size-2)) {
 	  			newHashMap = AR.createAnnotationMapValues();
+	  			
+	  			
 	  			break;
 
 				} else {
@@ -105,6 +107,77 @@ JavaObjectVMField* VMField, JavaObjectCl
   return res;
 }
 
+JNIEXPORT JavaObject* JNICALL Java_java_lang_reflect_VMField_getDeclaredAnnotations(
+#ifdef NATIVE_JNI
+JNIEnv *env, 
+#endif
+JavaObjectVMField* VMField) { 
+  JavaObject* res = 0;
+  JavaObject* annon = 0;
+  JavaObject* newHashMap = 0;
+  JavaObject* annotationClass = 0;
+  llvm_gcroot(res, 0);
+  llvm_gcroot(annon, 0);
+  llvm_gcroot(newHashMap, 0);
+  llvm_gcroot(VMField, 0);
+  llvm_gcroot(annotationClass, 0);
+
+  BEGIN_NATIVE_EXCEPTION(0)
+
+  Jnjvm* vm = JavaThread::get()->getJVM();
+  Classpath* upcalls = vm->upcalls;
+
+  /* Retrieving VMField.class attributes list */
+  UserClass* compilingClass = JavaObjectVMField::getClass(VMField);
+  JavaField* field = JavaObjectVMField::getInternalField(VMField);
+  Attribut* annotationsAtt =
+    field->lookupAttribut(Attribut::annotationsAttribut);
+  dprintf("JavaField : %s\n", UTF8Buffer(field->name).cString());
+  
+  //UserCommonClass* cl = JavaObject::getClass(VMField);
+	JnjvmClassLoader* loader = compilingClass->classLoader;
+
+  if (annotationsAtt) {
+    Reader reader(annotationsAtt, compilingClass->bytes);
+    AnnotationReader AR(reader, compilingClass);
+    uint16 numAnnotations = reader.readU2();
+    
+    UserClassArray* array = upcalls->annotationArrayClass;
+    res = array->doNew(numAnnotations, vm);
+		dprintf("JavaField : %s % with %d fields \n", UTF8Buffer(field->name).cString(), numAnnotations);
+		dprintf("The loader to use is : %ld\n", loader);
+    for (uint16 i = 0; i < numAnnotations; ++i) {
+			uint16 typeIndex = reader.readU2();
+			const UTF8* annoType = compilingClass->ctpInfo->UTF8At(typeIndex);
+			newHashMap = AR.createAnnotationMapValues();
+			
+			annoType = annoType->extract(loader->hashUTF8, 1,annoType->size-1);
+			dprintf("Annotation type : %s\n", UTF8Buffer(annoType).cString());
+			UserClass* AnnonClass = 0;
+			UserCommonClass* commClass = loader->lookupClass(annoType);
+			
+			if (commClass) 
+				AnnonClass = commClass -> asClass();
+			else
+				AnnonClass = loader->loadName(annoType, true, true, NULL);
+				
+			if (!AnnonClass) {
+				dprintf("AHHHHHH\n");
+				abort();
+			}
+			dprintf("Loaded class : %s \n", UTF8Buffer(AnnonClass->name).cString());
+			annotationClass = AnnonClass->getClassDelegatee(vm);
+			
+			annon = upcalls->createAnnotation->invokeJavaObjectStatic(vm, upcalls->newAnnotationHandler, &annotationClass, &newHashMap);
+			ArrayObject::setElement((ArrayObject *)res, annon, i);
+		} // end for
+  }
+
+  END_NATIVE_EXCEPTION
+	dprintf("getDeclaredAnnotations done\n");
+  return res;
+}
+
 JNIEXPORT jint JNICALL Java_java_lang_reflect_VMField_getModifiersInternal(
 #ifdef NATIVE_JNI
 JNIEnv *env,





More information about the vmkit-commits mailing list