[vmkit-commits] [vmkit] r180436 - Arrays of enumeration in annotations

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


Author: peter.senna
Date: Thu Apr 25 12:09:34 2013
New Revision: 180436

URL: http://llvm.org/viewvc/llvm-project?rev=180436&view=rev
Log:
Arrays of enumeration in annotations
(cherry picked from commit c31910b9b6e0dbcec4b96325d1d1e657d3069811)

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=180436&r1=180435&r2=180436&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMMethod.inc (original)
+++ vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMMethod.inc Thu Apr 25 12:09:34 2013
@@ -31,8 +31,10 @@ JNIEnv *env,
 #endif
 JavaObjectVMMethod* VMMeth) {
   JavaObject* res = 0;
+  JavaObject* methodType;
   llvm_gcroot(VMMeth, 0);
   llvm_gcroot(res, 0);
+  llvm_gcroot(methodType, 0);
 
   BEGIN_NATIVE_EXCEPTION(0)
   dprintf("*************VMMethod_getDefaultValue*************\n");
@@ -46,6 +48,7 @@ JavaObjectVMMethod* VMMeth) {
   if (cl->inheritName(name->elements, name->size)) {
     // Find "default attribute"
     JavaMethod* method = JavaObjectVMMethod::getInternalMethod(VMMeth);
+    
     JavaAttribute* annotationsAtt =
       method->lookupAttribute(JavaAttribute::annotationDefaultAttribute);
     dprintf("JavaMethod:%s\n", UTF8Buffer(method->name).cString());
@@ -53,8 +56,8 @@ JavaObjectVMMethod* VMMeth) {
     if (annotationsAtt) {
       Reader reader(annotationsAtt, cl->bytes);
       AnnotationReader AR(reader, cl);
-
-      res = AR.createElementValue();
+	  methodType = method->getReturnType(cl->classLoader);
+      res = AR.createElementValue(true, methodType);
     }
   }
 

Modified: vmkit/trunk/lib/j3/VMCore/JavaClass.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JavaClass.cpp?rev=180436&r1=180435&r2=180436&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JavaClass.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/JavaClass.cpp Thu Apr 25 12:09:34 2013
@@ -1750,18 +1750,22 @@ void AnnotationReader::readElementValue(
   }
 }
 
-JavaObject* AnnotationReader::createElementValue() {
-  uint8 tag = reader.readU1();
+JavaObject* AnnotationReader::createElementValue(bool nextParameterIsTypeOfMethod, JavaObject* type) {
   JavaObject* res = 0;
   JavaObject* tmp = 0;
   JavaString* str = 0;
   JavaObject* field = 0;
   JavaObject* clazzLoaded = 0;
+  JavaObject* classOfCurrentAnnotationProperty = 0;
   llvm_gcroot(res, 0);
   llvm_gcroot(tmp, 0);
   llvm_gcroot(str, 0);
   llvm_gcroot(clazzLoaded, 0);
   llvm_gcroot(field, 0);
+  llvm_gcroot(type, 0);
+  llvm_gcroot(classOfCurrentAnnotationProperty, 0);
+
+  uint8 tag = reader.readU1();
 	
   Jnjvm* vm = JavaThread::get()->getJVM();
   Classpath* upcalls = vm->upcalls;
@@ -1818,7 +1822,7 @@ JavaObject* AnnotationReader::createElem
   } else if (tag == 's') {
     const UTF8* s = cl->ctpInfo->UTF8At(reader.readU2());
     ddprintf("s=%s", PrintBuffer(s).cString());
-    res = JavaString::internalToJava(s, JavaThread::get()->getJVM());
+    res = JavaString::internalToJava(s, vm);
 
   } else if (tag == 'e') {
     const UTF8* n = cl->ctpInfo->UTF8At(reader.readU2());
@@ -1862,14 +1866,21 @@ JavaObject* AnnotationReader::createElem
 
   } else if (tag == '[') {
     uint16 numValues = reader.readU2();
-
-    if (numValues > 0)
-    	res = createArrayByTag(numValues);
-    else {
-    	// FIXME : Do something, I do not know the kind of array to create
-    	fprintf(stderr, "Empty array not implemented %c type\n", tag);
-    	abort();
+    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");
+		classOfCurrentAnnotationProperty = clazzOfAnnotation->virtualMethods[i].getReturnType(this->cl->classLoader);
     }
+	UserClassArray* clazzOfProperty = UserCommonClass::resolvedImplClass(vm, nextParameterIsTypeOfMethod? type : 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);
 
   } else {
     // Element_value Annotation not implemented
@@ -1881,8 +1892,7 @@ JavaObject* AnnotationReader::createElem
   return res;
 }
 
-JavaObject* AnnotationReader::createArrayByTag(uint16 numValues) {
-	JavaObject* res = 0;
+void AnnotationReader::fillArray(JavaObject* res, int numValues) {
 	JavaString* str = 0;
 	JavaObject* clazzObject = 0;
 	JavaObject* field = 0;
@@ -1895,6 +1905,8 @@ JavaObject* AnnotationReader::createArra
 	llvm_gcroot(field, 0);
 	llvm_gcroot(myEnum, 0);
 
+	// FIXME : Do something with all casts
+
 	sint32 valS;
 	uint32 valU;
 	sint64 val64S;
@@ -1907,119 +1919,8 @@ JavaObject* AnnotationReader::createArra
 	UserClassArray* array = 0;
 	Jnjvm* vm = JavaThread::get()->getJVM();
 	Classpath* upcalls = vm->upcalls;
-	uint8 tag = reader.readU1();
-	switch (tag) {
-	case 'B':
-		array = upcalls->ArrayOfByte;
-		res = array->doNew(numValues, vm);
-		valS = cl->ctpInfo->IntegerAt(reader.readU2());
-		ArraySInt8::setElement((ArraySInt8*)res, valS, 0);
-		break;
-	case 'C':
-		array = upcalls->ArrayOfChar;
-		res = array->doNew(numValues, vm);
-		valS = cl->ctpInfo->IntegerAt(reader.readU2());
-		ArraySInt16::setElement((ArraySInt16*)res, valS, 0);
-		break;
-	case 'D':
-		array = upcalls->ArrayOfDouble;
-		res = array->doNew(numValues, vm);
-		valD = cl->ctpInfo->DoubleAt(reader.readU2());
-		ArrayDouble::setElement((ArrayDouble*)res, valD, 0);
-		break;
-	case 'F':
-		array = upcalls->ArrayOfFloat;
-		res = array->doNew(numValues, vm);
-		valF = cl->ctpInfo->FloatAt(reader.readU2());
-		ArrayFloat::setElement((ArrayFloat*)res, valF, 0);
-		break;
-	case 'J':
-		array = upcalls->ArrayOfLong;
-		res = array->doNew(numValues, vm);
-		val64S = cl->ctpInfo->LongAt(reader.readU2());
-		ArrayLong::setElement((ArrayLong*)res, val64S, 0);
-		break;
-	case 'S':
-		array = upcalls->ArrayOfShort;
-		res = array->doNew(numValues, vm);
-		valS = cl->ctpInfo->IntegerAt(reader.readU2());
-		ArraySInt16::setElement((ArraySInt16*)res, valS, 0);
-		break;
-	case 'I':
-		array = upcalls->ArrayOfInt;
-		res = array->doNew(numValues, vm);
-		valS = cl->ctpInfo->IntegerAt(reader.readU2());
-		ArraySInt32::setElement((ArraySInt32*)res, valS,0);
-		break;
-	case 'Z':
-		array = upcalls->ArrayOfBool;
-		res = array->doNew(numValues, vm);
-		valU = cl->ctpInfo->IntegerAt(reader.readU2());
-		ArrayUInt8::setElement((ArrayUInt8*)res, valU, 0);
-		break;
-	case 's':
-		array = upcalls->ArrayOfString;
-		res = array->doNew(numValues, vm);
-		s = cl->ctpInfo->UTF8At(reader.readU2());
-		str = JavaString::internalToJava(s, JavaThread::get()->getJVM());
-		ArrayObject::setElement((ArrayObject *)res, str, 0);
-		break;
-	case 'e':
-		JCL = this->cl->classLoader;
-		//printf("Haciendo un arreglo del tipo : %s \n", UTF8Buffer(lastKey).cString());
-		array = JCL->constructArray(JCL->asciizConstructUTF8("[LDays;"));
-		res = array->doNew(numValues, vm);
-		n = cl->ctpInfo->UTF8At(reader.readU2());
-		m = cl->ctpInfo->UTF8At(reader.readU2());
-
-		n = n->extract(JCL->hashUTF8, 1,n->size-1);
-		clLoaded = JCL->loadClassFromUserUTF8(n,true,false, NULL);
-		if (clLoaded != NULL && !clLoaded->isPrimitive()) {
-			if (clLoaded->asClass())
-				clLoaded->asClass()->initialiseClass(vm);
-			clazzLoaded = clLoaded->getClassDelegatee(vm);
-			str = JavaString::internalToJava(m, vm);
-			assert(clazzLoaded && "Class not found");
-			assert(str && "Null string");
-			field = upcalls->getFieldInClass->invokeJavaObjectVirtual(vm, upcalls->newClass, clazzLoaded, &str);
-			assert(field && "Field not found");
-			JavaObject* obj = 0;
-			myEnum = upcalls->getInField->invokeJavaObjectVirtual(vm, upcalls->newField, field, &obj);
-			ArrayObject::setElement((ArrayObject *)res, str, 0);
-		} else {
-			str = JavaString::internalToJava(n, vm);
-			vm->classNotFoundException(str);
-		}
-		break;
-	case 'c':
-		array = upcalls->classArrayClass;
-		res = array->doNew(numValues, vm);
-		s = cl->ctpInfo->UTF8At(reader.readU2());
-		JCL = this->cl->classLoader;
-		s = s->extract(JCL->hashUTF8, 1,s->size-1);
-		clLoaded = JCL->loadClassFromUserUTF8(s,true,false, NULL);
-		if (clLoaded != NULL && !clLoaded->isPrimitive()) {
-			if (clLoaded->asClass())
-				clLoaded->asClass()->initialiseClass(vm);
-			clazzObject = clLoaded->getClassDelegatee(vm);
-		} else {
-		  str = JavaString::internalToJava(s, vm);
-		  vm->classNotFoundException(str);
-		}
-		ArrayObject::setElement((ArrayObject *)res, clazzObject, 0);
-		break;
-	case '@':
-		fprintf(stderr, "Annotation not supported for %c (nested annotations) type\n", tag);
-		abort();
-		break;
-	default:
-		fprintf(stderr, "Wrong class file\n");
-		abort();
-		break;
-	}
-
-	for (int i = 1 ; i < numValues ; i++) {
-		uint8 tmptag = reader.readU1();
+	for (int i = 0 ; i < numValues ; i++) {
+		uint8 tag = reader.readU1();
 		switch (tag) {
 			case 'B':
 				valS = cl->ctpInfo->IntegerAt(reader.readU2());
@@ -2106,8 +2007,6 @@ JavaObject* AnnotationReader::createArra
 				break;
 			}
 	}
-
-	return res;
 }
 
 JavaObject* AnnotationReader::createAnnotationMapValues(JavaObject* type) {
@@ -2115,16 +2014,18 @@ JavaObject* AnnotationReader::createAnno
   JavaObject* tmp = 0;
   JavaString* str = 0;
   JavaObject* newHashMap = 0;
+  llvm_gcroot(type, 0);
   llvm_gcroot(tmp, 0);
   llvm_gcroot(str, 0);
   llvm_gcroot(newHashMap, 0);
-  llvm_gcroot(type, 0);
+
 
   const UTF8* key = 0;
 
   Jnjvm * vm = JavaThread::get()->getJVM();
   Classpath* upcalls = vm->upcalls;
   UserClass* HashMap = upcalls->newHashMap;
+
   newHashMap = HashMap->doNew(vm);
   upcalls->initHashMap->invokeIntSpecial(vm, HashMap, newHashMap);
 
@@ -2133,9 +2034,10 @@ 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();
+    tmp = createElementValue(false, type);
     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=180436&r1=180435&r2=180436&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JavaClass.h (original)
+++ vmkit/trunk/lib/j3/VMCore/JavaClass.h Thu Apr 25 12:09:34 2013
@@ -84,9 +84,9 @@ public:
   // createElementValue - create the Java type associated with the value
   // of the current annotation key.
   //
-  JavaObject* createElementValue();
+  JavaObject* createElementValue(bool nextParameterIsTypeOfMethod,JavaObject* type);
 
-  JavaObject* createArrayByTag(uint16 numValues);
+  void fillArray(JavaObject* res, int numValues);
 };
 
 /// Attribute - This class represents JVM attributes to Java class, methods and





More information about the vmkit-commits mailing list