[vmkit-commits] [vmkit] r180431 - Arrays of classes are now supported in annotations

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


Author: peter.senna
Date: Thu Apr 25 12:09:06 2013
New Revision: 180431

URL: http://llvm.org/viewvc/llvm-project?rev=180431&view=rev
Log:
Arrays of classes are now supported in annotations
(cherry picked from commit 9889e0ff040eefa38482e35e2aa881700709d753)

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

Modified: vmkit/trunk/lib/j3/VMCore/JavaClass.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JavaClass.cpp?rev=180431&r1=180430&r2=180431&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JavaClass.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/JavaClass.cpp Thu Apr 25 12:09:06 2013
@@ -1829,8 +1829,6 @@ JavaObject* AnnotationReader::createElem
     ddprintf("class=");
     const UTF8* m = cl->ctpInfo->UTF8At(reader.readU2());
 
-    ddprintf("%s", PrintBuffer(m).cString());
-
     JnjvmClassLoader* JCL = this->cl->classLoader;
 
     m = m->extract(JCL->hashUTF8, 1,m->size-1);
@@ -1869,9 +1867,11 @@ JavaObject* AnnotationReader::createElem
 
 JavaObject* AnnotationReader::createArrayByTag(uint16 numValues) {
 	JavaObject* res = 0;
-	JavaObject* str = 0;
+	JavaString* str = 0;
+	JavaObject* clazzObject = 0;
 	llvm_gcroot(res, 0);
 	llvm_gcroot(str, 0);
+	llvm_gcroot(clazzObject, 0);
 
 	sint32 valS;
 	uint32 valU;
@@ -1879,6 +1879,8 @@ JavaObject* AnnotationReader::createArra
 	double valD;
 	float valF;
 	const UTF8* s = 0;
+	JnjvmClassLoader* JCL;
+	UserCommonClass* clLoaded;
 
 	UserClassArray* array = 0;
 	Jnjvm* vm = JavaThread::get()->getJVM();
@@ -1945,8 +1947,21 @@ JavaObject* AnnotationReader::createArra
 		abort();
 		break;
 	case 'c':
-		fprintf(stderr, "Annotation not supported for %c (classes) type\n", tag);
-		abort();
+		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, "Only arrays of one dimensions are supported in annotations\n");
@@ -2007,8 +2022,19 @@ JavaObject* AnnotationReader::createArra
 				abort();
 				break;
 			case 'c':
-				fprintf(stderr, "Annotation not supported for %c (classes) type\n", tag);
-				abort();
+				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, i);
 				break;
 			case '[':
 				fprintf(stderr, "Only arrays of one dimensions are supported in annotations\n");





More information about the vmkit-commits mailing list