[vmkit-commits] [vmkit] r180347 - working on VMClass.getDeclaredAnnotations

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


Author: peter.senna
Date: Thu Apr 25 12:00:02 2013
New Revision: 180347

URL: http://llvm.org/viewvc/llvm-project?rev=180347&view=rev
Log:
working on VMClass.getDeclaredAnnotations
(cherry picked from commit 0b143244a48e759c5a86a9bc480f39e282b97fca)

Modified:
    vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMClass.inc

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=180347&r1=180346&r2=180347&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMClass.inc (original)
+++ vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMClass.inc Thu Apr 25 12:00:02 2013
@@ -438,19 +438,69 @@ JavaObject* Cl) {
 	fprintf(stderr, "Java_java_lang_VMClass_getDeclaredAnnotations not implemented\n");
   abort();
 
-  ArrayObject* res = 0;
+  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(Cl, 0);
+  llvm_gcroot(annotationClass, 0);
 
   BEGIN_NATIVE_EXCEPTION(0)
 
   Jnjvm* vm = JavaThread::get()->getJVM();
-  UserClassArray* array = vm->upcalls->constructorArrayAnnotation;
-  res = (ArrayObject*)array->doNew(0, vm);
+  Classpath* upcalls = vm->upcalls;
 
-  END_NATIVE_EXCEPTION
+  /* Retrieving VMField.class attributes list */
+  UserClass* compilingClass = JavaObject::getClass(Cl)->asClass();
+  //JavaField* field = JavaObjectVMField::getInternalField(VMField);
+  JavaAttribute* annotationsAtt =
+    compilingClass->lookupAttribute(JavaAttribute::annotationsAttribute);
+  //dprintf("JavaClass : %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);
+    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) {
+				assert(AnnonClass && "Panic, imposible conditions");
+				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
+		*/
+  }
 
-  return res;
+  END_NATIVE_EXCEPTION
+  return (ArrayObject*)res;
 }
 
 JNIEXPORT jboolean Java_java_lang_VMClass_isAnonymousClass(





More information about the vmkit-commits mailing list