[vmkit-commits] [vmkit] r180428 - Fixing bug in getDeclaredAnnotations

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


Author: peter.senna
Date: Thu Apr 25 12:08:52 2013
New Revision: 180428

URL: http://llvm.org/viewvc/llvm-project?rev=180428&view=rev
Log:
Fixing bug in getDeclaredAnnotations

When a Field, Method or Class does not has annotations an empty array is returned. I was returning NULL (wrong)
(cherry picked from commit 0ea9484bd1eb2a5f1770812dc97f24e654f1a4c9)

Modified:
    vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMClass.inc
    vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMField.inc
    vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMMethod.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=180428&r1=180427&r2=180428&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMClass.inc (original)
+++ vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMClass.inc Thu Apr 25 12:08:52 2013
@@ -84,15 +84,14 @@ jclass clazz,
 #endif
 JavaObject* Cl, 
 jboolean publicOnly) {
-  JavaObjectClass* jcl = 0;
+
   ArrayObject* ret = 0;
   llvm_gcroot(Cl, 0);
   llvm_gcroot(ret, 0);
-  llvm_gcroot(jcl, 0);
 
   BEGIN_NATIVE_EXCEPTION(0)
 
-  ret = JavaObjectClass::getDeclaredConstructors(jcl = (JavaObjectClass*)Cl, publicOnly);
+  ret = JavaObjectClass::getDeclaredConstructors((JavaObjectClass*)Cl, publicOnly);
 
   END_NATIVE_EXCEPTION
 
@@ -107,15 +106,13 @@ jclass clazz,
 JavaObject* Cl, 
 jboolean publicOnly) {
 
-  JavaObjectClass* jcl = 0;
   ArrayObject* ret = 0;
   llvm_gcroot(Cl, 0);
   llvm_gcroot(ret, 0);
-  llvm_gcroot(jcl, 0);
 
   BEGIN_NATIVE_EXCEPTION(0)
 
-  ret = JavaObjectClass::getDeclaredMethods(jcl = (JavaObjectClass*)Cl, publicOnly);
+  ret = JavaObjectClass::getDeclaredMethods((JavaObjectClass*)Cl, publicOnly);
 
   END_NATIVE_EXCEPTION
 
@@ -130,14 +127,12 @@ jclass clazz,
 JavaObject* Cl, 
 jboolean ignore) {
   
-  JavaObjectClass* jcl = 0;
   jint res = 0;
   llvm_gcroot(Cl, 0);
-  llvm_gcroot(jcl, 0);
 
   BEGIN_NATIVE_EXCEPTION(0)
 
-  res = JavaObjectClass::getModifiers(jcl = (JavaObjectClass*)Cl);
+  res = JavaObjectClass::getModifiers((JavaObjectClass*)Cl);
 
   END_NATIVE_EXCEPTION
   return res;
@@ -342,15 +337,14 @@ JNIEnv *env,
 jclass clazz, 
 #endif
 JavaObject* Cl, jboolean publicOnly) {
-  JavaObjectClass* jcl = 0;
+
   ArrayObject* ret = 0;
   llvm_gcroot(Cl, 0);
   llvm_gcroot(ret, 0);
-  llvm_gcroot(jcl, 0);
 
   BEGIN_NATIVE_EXCEPTION(0)
 
-  ret = JavaObjectClass::getDeclaredFields(jcl = (JavaObjectClass*)Cl, publicOnly);
+  ret = JavaObjectClass::getDeclaredFields((JavaObjectClass*)Cl, publicOnly);
 
   END_NATIVE_EXCEPTION
 
@@ -363,15 +357,14 @@ JNIEnv *env,
 jclass clazz, 
 #endif
 JavaObject* Cl) {
-  JavaObjectClass* jcl = 0;
+
   ArrayObject* res = 0;
   llvm_gcroot(res, 0);
   llvm_gcroot(Cl, 0);
-  llvm_gcroot(jcl, 0);
 
   BEGIN_NATIVE_EXCEPTION(0)
 
-  res = JavaObjectClass::getInterfaces(jcl = (JavaObjectClass*)Cl);
+  res = JavaObjectClass::getInterfaces((JavaObjectClass*)Cl);
 
   END_NATIVE_EXCEPTION
 
@@ -385,16 +378,14 @@ JNIEnv *env,
 jclass clazz, 
 #endif
 JavaObject* Cl) {
-  JavaObjectClass* jcl = 0;
   JavaObject* res = 0;
 
   llvm_gcroot(res, 0);
   llvm_gcroot(Cl, 0);
-  llvm_gcroot(jcl, 0);
 
   BEGIN_NATIVE_EXCEPTION(0)
 
-  res = JavaObjectClass::getDeclaringClass(jcl = (JavaObjectClass*)Cl);
+  res = JavaObjectClass::getDeclaringClass((JavaObjectClass*)Cl);
 
   END_NATIVE_EXCEPTION
 
@@ -408,15 +399,14 @@ JNIEnv *env,
 jclass clazz, 
 #endif
 JavaObject* Cl, bool publicOnly) {
-  JavaObjectClass* jcl = 0;
+
   ArrayObject* result = 0;
   llvm_gcroot(result, 0);
   llvm_gcroot(Cl, 0);
-  llvm_gcroot(jcl, 0);
 
   BEGIN_NATIVE_EXCEPTION(0)
 
-  result = JavaObjectClass::getDeclaredClasses(jcl = (JavaObjectClass*)Cl, publicOnly);
+  result = JavaObjectClass::getDeclaredClasses((JavaObjectClass*)Cl, publicOnly);
 
   END_NATIVE_EXCEPTION
 
@@ -444,11 +434,7 @@ JNIEnv *env,
 jclass clazz, 
 #endif
 JavaObject* Cl) {
-  // TODO implement me
-	//fprintf(stderr, "Java_java_lang_VMClass_getDeclaredAnnotations not implemented\n");
-  //abort();
 
-  ArrayObject* arrayRes = 0;
   JavaObject* res = 0;
   JavaObject* annon = 0;
   JavaObject* newHashMap = 0;
@@ -458,7 +444,6 @@ JavaObject* Cl) {
   llvm_gcroot(newHashMap, 0);
   llvm_gcroot(Cl, 0);
   llvm_gcroot(annotationClass, 0);
-  llvm_gcroot(arrayRes, 0);
 
   BEGIN_NATIVE_EXCEPTION(0)
 
@@ -469,42 +454,48 @@ JavaObject* Cl) {
   //JavaField* field = JavaObjectVMField::getInternalField(VMField);
   JavaAttribute* annotationsAtt =
     cl->lookupAttribute(JavaAttribute::annotationsAttribute);
-  //dprintf("JavaClass : %s\n", UTF8Buffer(field->name).cString());
   
-	JnjvmClassLoader* loader = cl->classLoader;
+  JnjvmClassLoader* loader = cl->classLoader;
 
   if (annotationsAtt) {
     Reader reader(annotationsAtt, cl->bytes);
     AnnotationReader AR(reader, cl);
     uint16 numAnnotations = reader.readU2();
     
-    UserClassArray* array = upcalls->annotationArrayClass;
-    arrayRes = (ArrayObject *)(res = array->doNew(numAnnotations, vm));
+    UserClassArray* array = upcalls->constructorArrayAnnotation;
+    res = array->doNew(numAnnotations, vm);
     for (uint16 i = 0; i < numAnnotations; ++i) {
-			uint16 typeIndex = reader.readU2();
-			const UTF8* annoType = cl->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);
-				
-			assert(AnnonClass && "Panic, imposible conditions");
-	
-			dprintf("Loaded class : %s \n", UTF8Buffer(AnnonClass->name).cString());
-			annotationClass = AnnonClass->getClassDelegatee(vm);
+		uint16 typeIndex = reader.readU2();
+		const UTF8* annoType = cl->ctpInfo->UTF8At(typeIndex);
+		
+		
+		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);
 			
-			annon = upcalls->createAnnotation->invokeJavaObjectStatic(vm, upcalls->newAnnotationHandler, &annotationClass, &newHashMap);
-			ArrayObject::setElement(arrayRes, annon, i);
-		} // end for
+		assert(AnnonClass && "Panic, imposible conditions");
+
+		dprintf("Loaded class : %s \n", UTF8Buffer(AnnonClass->name).cString());
+		annotationClass = AnnonClass->getClassDelegatee(vm);
+		
+		newHashMap = AR.createAnnotationMapValues(annotationClass);
 		
+		annon = upcalls->createAnnotation->invokeJavaObjectStatic(vm, upcalls->newAnnotationHandler, &annotationClass, &newHashMap);
+		ArrayObject::setElement((ArrayObject *)res, annon, i);
+	} // end for
+		
+  }
+  else {
+  	UserClassArray* array = upcalls->constructorArrayAnnotation;
+    res = array->doNew(0, vm);
   }
+  	
 
   END_NATIVE_EXCEPTION
   return (ArrayObject*)res;

Modified: vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMField.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMField.inc?rev=180428&r1=180427&r2=180428&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMField.inc (original)
+++ vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMField.inc Thu Apr 25 12:08:52 2013
@@ -74,29 +74,25 @@ JavaObjectVMField* VMField, JavaObjectCl
       AnnotationReader AR(reader, compilingClass);
       uint16 numAnnotations = reader.readU2();
 
-      for (uint16 i = 0; i < numAnnotations; ++i) {
-				uint16 typeIndex = reader.readU2();
-				const UTF8* annoType = compilingClass->ctpInfo->UTF8At(typeIndex);
-
-				// Remove the L and ; in the name annotation type (L.....;)
-				// for the comparison.
-				dprintf("Comparing with  : %s\n", UTF8Buffer(annoType).cString());
-				if (clazz->name->equals(annoType->elements+1, annoType->size-2)) {
-	  			newHashMap = AR.createAnnotationMapValues();
-	  			
-	  			
-	  			break;
-
-				} else {
-	  			AR.readAnnotationElementValues();
-				}
-  		} // end for
-
-  		if (newHashMap) {
-				dprintf("Annotation creation\n");
-				res = upcalls->createAnnotation->invokeJavaObjectStatic(vm, upcalls->newAnnotationHandler, &annotationClass, &newHashMap);
-  		}
-
+	  for (uint16 i = 0; i < numAnnotations; ++i) {
+		uint16 typeIndex = reader.readU2();
+		const UTF8* annoType = compilingClass->ctpInfo->UTF8At(typeIndex);
+	
+		// Remove the L and ; in the name annotation type (L.....;)
+		// for the comparison.
+		dprintf("Comparing with  : %s\n", UTF8Buffer(annoType).cString());
+		if (clazz->name->equals(annoType->elements+1, annoType->size-2)) {
+			newHashMap = AR.createAnnotationMapValues(annotationClass);
+			break;
+		} else {
+			AR.readAnnotationElementValues();
+		}
+	  } // end for
+
+	  if (newHashMap) {
+		dprintf("Annotation creation\n");
+		res = upcalls->createAnnotation->invokeJavaObjectStatic(vm, upcalls->newAnnotationHandler, &annotationClass, &newHashMap);
+	  }
     }
   } else {
     vm->nullPointerException();
@@ -112,7 +108,6 @@ JNIEXPORT JavaObject* JNICALL Java_java_
 JNIEnv *env, 
 #endif
 JavaObjectVMField* VMField) { 
-  ArrayObject* arrayRes = 0;
   JavaObject* res = 0;
   JavaObject* annon = 0;
   JavaObject* newHashMap = 0;
@@ -122,7 +117,6 @@ JavaObjectVMField* VMField) {
   llvm_gcroot(newHashMap, 0);
   llvm_gcroot(VMField, 0);
   llvm_gcroot(annotationClass, 0);
-  llvm_gcroot(arrayRes, 0);
 
   BEGIN_NATIVE_EXCEPTION(0)
 
@@ -143,16 +137,15 @@ JavaObjectVMField* VMField) {
     AnnotationReader AR(reader, compilingClass);
     uint16 numAnnotations = reader.readU2();
     
-    UserClassArray* array = upcalls->annotationArrayClass;
-    arrayRes = (ArrayObject *)(res = array->doNew(numAnnotations, vm));
+    UserClassArray* array = upcalls->constructorArrayAnnotation;
+    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);
 			
@@ -167,10 +160,16 @@ JavaObjectVMField* VMField) {
 			dprintf("Loaded class : %s \n", UTF8Buffer(AnnonClass->name).cString());
 			annotationClass = AnnonClass->getClassDelegatee(vm);
 			
+			newHashMap = AR.createAnnotationMapValues(annotationClass);
+			
 			annon = upcalls->createAnnotation->invokeJavaObjectStatic(vm, upcalls->newAnnotationHandler, &annotationClass, &newHashMap);
-			ArrayObject::setElement(arrayRes, annon, i);
+			ArrayObject::setElement((ArrayObject *)res, annon, i);
 		} // end for
   }
+  else {
+  	UserClassArray* array = upcalls->constructorArrayAnnotation;
+    res = array->doNew(0, vm);
+  }
 
   END_NATIVE_EXCEPTION
   return res;

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=180428&r1=180427&r2=180428&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMMethod.inc (original)
+++ vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMMethod.inc Thu Apr 25 12:08:52 2013
@@ -105,7 +105,7 @@ JavaObjectVMMethod* VMMeth, JavaObjectCl
 	// Remove the L and ; in the name annotation type (L.....;)
 	// for the comparison.
 	if (clazz->name->equals(annoType->elements+1, annoType->size-2)) {
-	  newHashMap = AR.createAnnotationMapValues();
+	  newHashMap = AR.createAnnotationMapValues(annotationClass);
 	  break;
 
 	} else {
@@ -133,7 +133,6 @@ JNIEXPORT JavaObject* JNICALL Java_java_
 JNIEnv *env, 
 #endif
 JavaObjectVMMethod* VMMethod) { 
-  ArrayObject* arrayRes = 0;
   JavaObject* res = 0;
   JavaObject* annon = 0;
   JavaObject* newHashMap = 0;
@@ -143,7 +142,6 @@ JavaObjectVMMethod* VMMethod) {
   llvm_gcroot(newHashMap, 0);
   llvm_gcroot(VMMethod, 0);
   llvm_gcroot(annotationClass, 0);
-  llvm_gcroot(arrayRes, 0);
 
   BEGIN_NATIVE_EXCEPTION(0)
 
@@ -164,12 +162,12 @@ JavaObjectVMMethod* VMMethod) {
     AnnotationReader AR(reader, compilingClass);
     uint16 numAnnotations = reader.readU2();
     
-    UserClassArray* array = upcalls->annotationArrayClass;
-    arrayRes = (ArrayObject *)(res = array->doNew(numAnnotations, vm));
+    UserClassArray* array = upcalls->constructorArrayAnnotation;
+    res = array->doNew(numAnnotations, vm);
     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());
@@ -185,10 +183,16 @@ JavaObjectVMMethod* VMMethod) {
 			dprintf("Loaded class : %s \n", UTF8Buffer(AnnonClass->name).cString());
 			annotationClass = AnnonClass->getClassDelegatee(vm);
 			
+			newHashMap = AR.createAnnotationMapValues(annotationClass);
+			
 			annon = upcalls->createAnnotation->invokeJavaObjectStatic(vm, upcalls->newAnnotationHandler, &annotationClass, &newHashMap);
-			ArrayObject::setElement(arrayRes, annon, i);
+			ArrayObject::setElement((ArrayObject *)res, annon, i);
 		} // end for
   }
+  else {
+  	UserClassArray* array = upcalls->constructorArrayAnnotation;
+    res = array->doNew(0, vm);
+  }
 
   END_NATIVE_EXCEPTION
   return res;





More information about the vmkit-commits mailing list