[vmkit-commits] [vmkit] r180430 - All primitive arrays are now supported in annotations

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


Author: peter.senna
Date: Thu Apr 25 12:09:02 2013
New Revision: 180430

URL: http://llvm.org/viewvc/llvm-project?rev=180430&view=rev
Log:
All primitive arrays are now  supported in annotations
(cherry picked from commit e7c9965fa972e6971aa74a44d9ce474d8272563b)

Modified:
    vmkit/trunk/lib/j3/VMCore/JavaClass.cpp
    vmkit/trunk/lib/j3/VMCore/JavaClass.h

Modified: vmkit/trunk/lib/j3/VMCore/JavaClass.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JavaClass.cpp?rev=180430&r1=180429&r2=180430&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JavaClass.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/JavaClass.cpp Thu Apr 25 12:09:02 2013
@@ -1750,10 +1750,8 @@ void AnnotationReader::readElementValue(
   }
 }
 
-JavaObject* AnnotationReader::createElementValue(uint8* outTag) {
+JavaObject* AnnotationReader::createElementValue() {
   uint8 tag = reader.readU1();
-  if (outTag)
-	  *outTag = tag;
   JavaObject* res = 0;
   JavaObject* tmp = 0;
   JavaString* str = 0;
@@ -1766,7 +1764,7 @@ JavaObject* AnnotationReader::createElem
   ddprintf("value:");
 
   if (tag == 'B') {
-    uint32 val = cl->ctpInfo->IntegerAt(reader.readU2());
+    sint32 val = cl->ctpInfo->IntegerAt(reader.readU2());
     ddprintf("B=%d", val);
     res = upcalls->byteClass->doNew(vm);
     upcalls->byteValue->setInstanceInt8Field(res, val);
@@ -1802,7 +1800,7 @@ JavaObject* AnnotationReader::createElem
     upcalls->shortValue->setInstanceInt16Field(res, val);
     
   } else if (tag == 'I') {
-    uint32 val = cl->ctpInfo->IntegerAt(reader.readU2());
+    sint32 val = cl->ctpInfo->IntegerAt(reader.readU2());
     ddprintf("I=%d", val);
     res = upcalls->intClass->doNew(vm);
     upcalls->intValue->setInstanceInt32Field(res, val);
@@ -1852,16 +1850,8 @@ JavaObject* AnnotationReader::createElem
   } else if (tag == '[') {
     uint16 numValues = reader.readU2();
 
-    uint8 arrayTag = 0;
-    if (numValues > 0) {
-    	tmp = createElementValue(&arrayTag);
-    	res = createArrayByTag(arrayTag, numValues);
-    	ArrayObject::setElement((ArrayObject *)res, tmp, 0);
-    	for (uint32 i = 1; i < numValues; ++i) {
-    		tmp = createElementValue();
-    	    ArrayObject::setElement((ArrayObject *)res, tmp, i);
-    	}
-    }
+    if (numValues > 0)
+    	res = createArrayByTag(numValues);
     else {
     	fprintf(stderr, "Empty array not implemented %c type\n", tag);
     	abort();
@@ -1877,67 +1867,162 @@ JavaObject* AnnotationReader::createElem
   return res;
 }
 
-JavaObject* AnnotationReader::createArrayByTag(uint8 tag, uint16 numValues) {
+JavaObject* AnnotationReader::createArrayByTag(uint16 numValues) {
 	JavaObject* res = 0;
+	JavaObject* str = 0;
 	llvm_gcroot(res, 0);
+	llvm_gcroot(str, 0);
+
+	sint32 valS;
+	uint32 valU;
+	sint64 val64S;
+	double valD;
+	float valF;
+	const UTF8* s = 0;
+
 	UserClassArray* array = 0;
 	Jnjvm* vm = JavaThread::get()->getJVM();
 	Classpath* upcalls = vm->upcalls;
-	ddprintf("value:");
-
-	if (tag == 'B') {
+	uint8 tag = reader.readU1();
+	switch (tag) {
+	case 'B':
 		array = upcalls->ArrayOfByte;
 		res = array->doNew(numValues, vm);
-	} else if (tag == 'C') {
+		valS = cl->ctpInfo->IntegerAt(reader.readU2());
+		ArraySInt8::setElement((ArraySInt8*)res, valS, 0);
+		break;
+	case 'C':
 		array = upcalls->ArrayOfChar;
 		res = array->doNew(numValues, vm);
-
-	} else if (tag == 'D') {
+		valS = cl->ctpInfo->IntegerAt(reader.readU2());
+		ArraySInt16::setElement((ArraySInt16*)res, valS, 0);
+		break;
+	case 'D':
 		array = upcalls->ArrayOfDouble;
 		res = array->doNew(numValues, vm);
-
-	} else if (tag == 'F') {
+		valD = cl->ctpInfo->DoubleAt(reader.readU2());
+		ArrayDouble::setElement((ArrayDouble*)res, valD, 0);
+		break;
+	case 'F':
 		array = upcalls->ArrayOfFloat;
 		res = array->doNew(numValues, vm);
-
-	} else if (tag == 'J') {
+		valF = cl->ctpInfo->FloatAt(reader.readU2());
+		ArrayFloat::setElement((ArrayFloat*)res, valF, 0);
+		break;
+	case 'J':
 		array = upcalls->ArrayOfLong;
 		res = array->doNew(numValues, vm);
-
-	} else if (tag == 'S') {
+		val64S = cl->ctpInfo->LongAt(reader.readU2());
+		ArrayLong::setElement((ArrayLong*)res, val64S, 0);
+		break;
+	case 'S':
 		array = upcalls->ArrayOfShort;
 		res = array->doNew(numValues, vm);
-
-	} else if (tag == 'I') {
+		valS = cl->ctpInfo->IntegerAt(reader.readU2());
+		ArraySInt16::setElement((ArraySInt16*)res, valS, 0);
+		break;
+	case 'I':
 		array = upcalls->ArrayOfInt;
 		res = array->doNew(numValues, vm);
-
-	} else if (tag == 'Z') {
+		valS = cl->ctpInfo->IntegerAt(reader.readU2());
+		ArraySInt32::setElement((ArraySInt32*)res, valS,0);
+		break;
+	case 'Z':
 		array = upcalls->ArrayOfBool;
 		res = array->doNew(numValues, vm);
-
-	} else if (tag == 's') {
+		valU = cl->ctpInfo->IntegerAt(reader.readU2());
+		ArrayUInt8::setElement((ArrayUInt8*)res, valU, 0);
+		break;
+	case 's':
 		array = upcalls->ArrayOfString;
 		res = array->doNew(numValues, vm);
-
-	} else if (tag == 'e') {
+		s = cl->ctpInfo->UTF8At(reader.readU2());
+		str = JavaString::internalToJava(s, JavaThread::get()->getJVM());
+		ArrayObject::setElement((ArrayObject *)res, str, 0);
+		break;
+	case 'e':
 		fprintf(stderr, "Annotation not supported for %c (enumerations) type\n", tag);
 		abort();
-
-	} else if (tag == 'c') {
-		//array = upcalls->constructorArrayClass;
-		//res = array->doNew(numValues, vm);
-		fprintf(stderr, "Annotation not supported for %c (enumerations) type\n", tag);
+		break;
+	case 'c':
+		fprintf(stderr, "Annotation not supported for %c (classes) type\n", tag);
 		abort();
-
-	} else if (tag == '[') {
-		fprintf(stderr, "Annotation not supported for %c (enumerations) type\n", tag);
+		break;
+	case '[':
+		fprintf(stderr, "Only arrays of one dimensions are supported in annotations\n");
 		abort();
-
-	} else {
-		// Element_value Annotation not implemented
-		fprintf(stderr, "Annotation not supported for %c type\n", tag);
+		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();
+		switch (tag) {
+			case 'B':
+				valS = cl->ctpInfo->IntegerAt(reader.readU2());
+				ArraySInt8::setElement((ArraySInt8*)res, valS, i);
+				break;
+			case 'C':
+				valS = cl->ctpInfo->IntegerAt(reader.readU2());
+				ArraySInt16::setElement((ArraySInt16*)res, valS, i);
+				break;
+			case 'D':
+				valD = cl->ctpInfo->DoubleAt(reader.readU2());
+				ArrayDouble::setElement((ArrayDouble*)res, valD, i);
+				break;
+			case 'F':
+				valF = cl->ctpInfo->FloatAt(reader.readU2());
+				ArrayFloat::setElement((ArrayFloat*)res, valF, i);
+				break;
+			case 'J':
+				val64S = cl->ctpInfo->LongAt(reader.readU2());
+				ArrayLong::setElement((ArrayLong*)res, val64S, i);
+				break;
+			case 'S':
+				valS = cl->ctpInfo->IntegerAt(reader.readU2());
+				ArraySInt16::setElement((ArraySInt16*)res, valS, i);
+				break;
+			case 'I':
+				valS = cl->ctpInfo->IntegerAt(reader.readU2());
+				ArraySInt32::setElement((ArraySInt32*)res, valS,i);
+				break;
+			case 'Z':
+				valU = cl->ctpInfo->IntegerAt(reader.readU2());
+				ArrayUInt8::setElement((ArrayUInt8*)res, valU, i);
+				break;
+			case 's':
+				s = cl->ctpInfo->UTF8At(reader.readU2());
+				str = JavaString::internalToJava(s, JavaThread::get()->getJVM());
+				ArrayObject::setElement((ArrayObject *)res, str, i);
+				break;
+			case 'e':
+				fprintf(stderr, "Annotation not supported for %c (enumerations) type\n", tag);
+				abort();
+				break;
+			case 'c':
+				fprintf(stderr, "Annotation not supported for %c (classes) type\n", tag);
+				abort();
+				break;
+			case '[':
+				fprintf(stderr, "Only arrays of one dimensions are supported in annotations\n");
+				abort();
+				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;
+			}
 	}
 
 	return res;

Modified: vmkit/trunk/lib/j3/VMCore/JavaClass.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JavaClass.h?rev=180430&r1=180429&r2=180430&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JavaClass.h (original)
+++ vmkit/trunk/lib/j3/VMCore/JavaClass.h Thu Apr 25 12:09:02 2013
@@ -80,12 +80,12 @@ public:
   //
   JavaObject* createAnnotationMapValues(JavaObject* type);
   
-  // createElementValue - create the Java type associated withe the value 
+  // createElementValue - create the Java type associated with the value
   // of the current annotation key.
   //
-  JavaObject* createElementValue(uint8* outTag = 0);
+  JavaObject* createElementValue();
 
-  JavaObject* createArrayByTag(uint8 tag, uint16 numValues);
+  JavaObject* createArrayByTag(uint16 numValues);
 };
 
 /// Attribute - This class represents JVM attributes to Java class, methods and





More information about the vmkit-commits mailing list