[vmkit-commits] [vmkit] r180438 - Nested annotations

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


Author: peter.senna
Date: Thu Apr 25 12:09:44 2013
New Revision: 180438

URL: http://llvm.org/viewvc/llvm-project?rev=180438&view=rev
Log:
Nested annotations
(cherry picked from commit 35856a89d3f1cc51d6e51ba155826db383cc760b)

Modified:
    vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMMethod.inc
    vmkit/trunk/lib/j3/VMCore/JavaClass.cpp
    vmkit/trunk/lib/j3/VMCore/JavaClass.h

Modified: vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMMethod.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMMethod.inc?rev=180438&r1=180437&r2=180438&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMMethod.inc (original)
+++ vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMMethod.inc Thu Apr 25 12:09:44 2013
@@ -57,7 +57,7 @@ JavaObjectVMMethod* VMMeth) {
       Reader reader(annotationsAtt, cl->bytes);
       AnnotationReader AR(reader, cl);
 	  methodType = method->getReturnType(cl->classLoader);
-      res = AR.createElementValue(true, methodType);
+      res = AR.createElementValue(true, methodType, method->name);
     }
   }
 

Modified: vmkit/trunk/lib/j3/VMCore/JavaClass.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JavaClass.cpp?rev=180438&r1=180437&r2=180438&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JavaClass.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/JavaClass.cpp Thu Apr 25 12:09:44 2013
@@ -1750,13 +1750,15 @@ void AnnotationReader::readElementValue(
   }
 }
 
-JavaObject* AnnotationReader::createElementValue(bool nextParameterIsTypeOfMethod, JavaObject* type) {
+JavaObject* AnnotationReader::createElementValue(bool nextParameterIsTypeOfMethod, JavaObject* type, const UTF8* lastKey) {
   JavaObject* res = 0;
   JavaObject* tmp = 0;
   JavaString* str = 0;
   JavaObject* field = 0;
   JavaObject* clazzLoaded = 0;
   JavaObject* classOfCurrentAnnotationProperty = 0;
+  JavaObject* newHashMap = 0;
+  JavaObject* annotationClass = 0;
   llvm_gcroot(res, 0);
   llvm_gcroot(tmp, 0);
   llvm_gcroot(str, 0);
@@ -1764,6 +1766,8 @@ JavaObject* AnnotationReader::createElem
   llvm_gcroot(field, 0);
   llvm_gcroot(type, 0);
   llvm_gcroot(classOfCurrentAnnotationProperty, 0);
+  llvm_gcroot(newHashMap, 0);
+  llvm_gcroot(annotationClass, 0);
 
   uint8 tag = reader.readU1();
 	
@@ -1780,8 +1784,8 @@ JavaObject* AnnotationReader::createElem
   } else if (tag == 'C') {
     uint32 val = cl->ctpInfo->IntegerAt(reader.readU2());
     ddprintf("C=%c", val);
-    res = upcalls->intClass->doNew(vm);
-    upcalls->intValue->setInstanceInt32Field(res, val);
+    res = upcalls->charClass->doNew(vm);
+    upcalls->charValue->setInstanceInt16Field(res, val);
 
   } else if (tag == 'D') {
     double val = cl->ctpInfo->DoubleAt(reader.readU2());
@@ -1866,6 +1870,7 @@ JavaObject* AnnotationReader::createElem
 
   } else if (tag == '[') {
     uint16 numValues = reader.readU2();
+    classOfCurrentAnnotationProperty = type;
     if (!nextParameterIsTypeOfMethod) {
 		UserCommonClass* uss =  UserCommonClass::resolvedImplClass(vm, type, false);
 		//printf("Class name : %s\n", UTF8Buffer(uss->name).cString());
@@ -1875,16 +1880,31 @@ JavaObject* AnnotationReader::createElem
 		assert((i < clazzOfAnnotation->nbVirtualMethods) && "Incorrect property for annotation");
 		classOfCurrentAnnotationProperty = clazzOfAnnotation->virtualMethods[i].getReturnType(this->cl->classLoader);
     }
-	UserClassArray* clazzOfProperty = UserCommonClass::resolvedImplClass(vm, nextParameterIsTypeOfMethod? type : classOfCurrentAnnotationProperty, false)->asArrayClass();
-
+	UserClassArray* clazzOfProperty = UserCommonClass::resolvedImplClass(vm, classOfCurrentAnnotationProperty, false)->asArrayClass();
 	//printf("Class name is : %s\n", UTF8Buffer(clazzOfProperty->name).cString());
 	res = clazzOfProperty->doNew(numValues, vm);
 	assert(res && "Error creating array of that type");
-    fillArray(res, numValues);
+    fillArray(res, numValues, clazzOfProperty);
 
-  } else {
+  } else if (tag == '@') {
+	  uint16 typeIndex = reader.readU2();
+	  annotationClass = type;
+	  if (!nextParameterIsTypeOfMethod) {
+	  		UserCommonClass* uss =  UserCommonClass::resolvedImplClass(vm, type, false);
+	  		//printf("Class name : %s\n", UTF8Buffer(uss->name).cString());
+	  		UserClass* clazzOfAnnotation = uss->asClass();
+	  		uint16 i = 0;
+	  		while ( i < clazzOfAnnotation->nbVirtualMethods && !(lastKey->equals(clazzOfAnnotation->virtualMethods[i].name))) i++;
+	  		assert((i < clazzOfAnnotation->nbVirtualMethods) && "Incorrect property for annotation");
+	  		annotationClass = clazzOfAnnotation->virtualMethods[i].getReturnType(this->cl->classLoader);
+	 }
+
+	  newHashMap = createAnnotationMapValues(annotationClass);
+	  res = upcalls->createAnnotation->invokeJavaObjectStatic(vm, upcalls->newAnnotationHandler, &annotationClass, &newHashMap);
+  }
+  else {
     // Element_value Annotation not implemented
-    fprintf(stderr, "Annotation not supported for %c type\n", tag);
+    fprintf(stderr, "Wrong classfile format\n");
     abort();
   }
   ddprintf("\n");
@@ -1892,18 +1912,22 @@ JavaObject* AnnotationReader::createElem
   return res;
 }
 
-void AnnotationReader::fillArray(JavaObject* res, int numValues) {
+void AnnotationReader::fillArray(JavaObject* res, int numValues, UserClassArray* classArray) {
 	JavaString* str = 0;
 	JavaObject* clazzObject = 0;
 	JavaObject* field = 0;
 	JavaObject* clazzLoaded = 0;
 	JavaObject* myEnum = 0;
+	JavaObject* annotationClass = 0;
+	JavaObject* newHashMap = 0;
 	llvm_gcroot(res, 0);
 	llvm_gcroot(str, 0);
 	llvm_gcroot(clazzObject, 0);
 	llvm_gcroot(clazzLoaded, 0);
 	llvm_gcroot(field, 0);
 	llvm_gcroot(myEnum, 0);
+	llvm_gcroot(annotationClass, 0);
+	llvm_gcroot(newHashMap, 0);
 
 	// FIXME : Do something with all casts
 
@@ -1915,6 +1939,9 @@ void AnnotationReader::fillArray(JavaObj
 	const UTF8* s = 0, *n = 0, * m = 0;
 	JnjvmClassLoader* JCL;
 	UserCommonClass* clLoaded;
+	UserCommonClass* uss;
+	UserClassArray* arrayClass;
+	UserCommonClass* aaa;
 
 	UserClassArray* array = 0;
 	Jnjvm* vm = JavaThread::get()->getJVM();
@@ -1998,8 +2025,13 @@ void AnnotationReader::fillArray(JavaObj
 				ArrayObject::setElement((ArrayObject *)res, clazzObject, i);
 				break;
 			case '@':
-				fprintf(stderr, "Annotation not supported for %c (nested annotations) type\n", tag);
-				abort();
+				reader.readU2();
+				aaa = classArray->_baseClass;
+				annotationClass = aaa->getDelegatee();
+				newHashMap = createAnnotationMapValues(annotationClass);
+				clazzObject = upcalls->createAnnotation->invokeJavaObjectStatic(vm, upcalls->newAnnotationHandler, &annotationClass, &newHashMap);
+
+				ArrayObject::setElement((ArrayObject *)res, clazzObject, i);
 				break;
 			default:
 				fprintf(stderr, "Wrong class file\n");
@@ -2034,10 +2066,9 @@ JavaObject* AnnotationReader::createAnno
   for (uint16 j = 0; j < numPairs; ++j) {
     uint16 nameIndex = reader.readU2();
     key = cl->ctpInfo->UTF8At(nameIndex);
-    lastKey = key;
     dprintf("keyAn:%s|", PrintBuffer(key).cString());
 
-    tmp = createElementValue(false, type);
+    tmp = createElementValue(false, type, key);
     str = JavaString::internalToJava(key, vm);
     upcalls->putHashMap->invokeJavaObjectVirtual(vm, HashMap, newHashMap, &str, &tmp);
   }

Modified: vmkit/trunk/lib/j3/VMCore/JavaClass.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JavaClass.h?rev=180438&r1=180437&r2=180438&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JavaClass.h (original)
+++ vmkit/trunk/lib/j3/VMCore/JavaClass.h Thu Apr 25 12:09:44 2013
@@ -66,7 +66,6 @@ public:
   Reader& reader;
   Class* cl;
   uint16 AnnotationNameIndex;
-  const UTF8* lastKey;
 
   AnnotationReader(Reader& R, Class* C) : reader(R), cl(C),
     AnnotationNameIndex(0) {}
@@ -84,9 +83,9 @@ public:
   // createElementValue - create the Java type associated with the value
   // of the current annotation key.
   //
-  JavaObject* createElementValue(bool nextParameterIsTypeOfMethod,JavaObject* type);
+  JavaObject* createElementValue(bool nextParameterIsTypeOfMethod,JavaObject* type, const UTF8* lastKey);
 
-  void fillArray(JavaObject* res, int numValues);
+  void fillArray(JavaObject* res, int numValues, UserClassArray* classArray);
 };
 
 /// Attribute - This class represents JVM attributes to Java class, methods and





More information about the vmkit-commits mailing list