[vmkit-commits] [vmkit] r180432 - Now you can use enumerative values in your annotations

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


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

URL: http://llvm.org/viewvc/llvm-project?rev=180432&view=rev
Log:
Now you can use enumerative values in your annotations
(cherry picked from commit b048557c411c5838465702c8c95ad4d76a42c54f)

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

Modified: vmkit/trunk/lib/j3/ClassLib/GNUClasspath/JavaUpcalls.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/ClassLib/GNUClasspath/JavaUpcalls.cpp?rev=180432&r1=180431&r2=180432&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/ClassLib/GNUClasspath/JavaUpcalls.cpp (original)
+++ vmkit/trunk/lib/j3/ClassLib/GNUClasspath/JavaUpcalls.cpp Thu Apr 25 12:09:12 2013
@@ -84,6 +84,8 @@ JavaMethod* Classpath::initMethod;
 JavaMethod* Classpath::initVMMethod;
 JavaMethod* Classpath::initField;
 JavaMethod* Classpath::initVMField;
+JavaMethod* Classpath::getInField;
+JavaMethod* Classpath::getFieldInClass;
 Class*      Classpath::newField;
 Class*      Classpath::newVMField;
 Class*      Classpath::newMethod;
@@ -673,6 +675,7 @@ void Classpath::initialiseClasspath(Jnjv
   initVMMethod =
       UPCALL_METHOD(loader, "java/lang/reflect/VMMethod", "<init>",
                     "()V", ACC_VIRTUAL);
+
    // Ljava/lang/Class;Ljava/lang/String;I
   newMethod =
     UPCALL_CLASS(loader, "java/lang/reflect/Method");
@@ -694,6 +697,12 @@ void Classpath::initialiseClasspath(Jnjv
       UPCALL_METHOD(loader, "java/lang/reflect/VMField", "<init>",
                     "(Ljava/lang/Class;Ljava/lang/String;I)V", ACC_VIRTUAL);
 
+  getFieldInClass = UPCALL_METHOD(loader, "java/lang/Class", "getField",
+            "(Ljava/lang/String;)Ljava/lang/reflect/Field;", ACC_VIRTUAL);
+
+  getInField = UPCALL_METHOD(loader, "java/lang/reflect/Field", "get",
+          "(Ljava/lang/Object;)Ljava/lang/Object;", ACC_VIRTUAL);
+
   newField =
     UPCALL_CLASS(loader, "java/lang/reflect/Field");
 

Modified: vmkit/trunk/lib/j3/ClassLib/GNUClasspath/JavaUpcalls.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/ClassLib/GNUClasspath/JavaUpcalls.h?rev=180432&r1=180431&r2=180432&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/ClassLib/GNUClasspath/JavaUpcalls.h (original)
+++ vmkit/trunk/lib/j3/ClassLib/GNUClasspath/JavaUpcalls.h Thu Apr 25 12:09:12 2013
@@ -96,6 +96,8 @@ public:
   ISOLATE_STATIC JavaMethod* initVMMethod;
   ISOLATE_STATIC JavaMethod* initField;
   ISOLATE_STATIC JavaMethod* initVMField;
+  ISOLATE_STATIC JavaMethod* getInField;
+  ISOLATE_STATIC JavaMethod* getFieldInClass;
   ISOLATE_STATIC UserClassArray* methodArrayClass;
   ISOLATE_STATIC UserClassArray* fieldArrayClass;
   ISOLATE_STATIC UserClass*      newMethod;

Modified: vmkit/trunk/lib/j3/VMCore/JavaClass.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JavaClass.cpp?rev=180432&r1=180431&r2=180432&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JavaClass.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/JavaClass.cpp Thu Apr 25 12:09:12 2013
@@ -1753,11 +1753,15 @@ void AnnotationReader::readElementValue(
 JavaObject* AnnotationReader::createElementValue() {
   uint8 tag = reader.readU1();
   JavaObject* res = 0;
+  JavaObject* clazzLoaded = 0;
   JavaObject* tmp = 0;
   JavaString* str = 0;
+  JavaObject* field = 0;
   llvm_gcroot(res, 0);
   llvm_gcroot(tmp, 0);
   llvm_gcroot(str, 0);
+  llvm_gcroot(clazzLoaded, 0);
+  llvm_gcroot(field, 0);
 	
   Jnjvm* vm = JavaThread::get()->getJVM();
   Classpath* upcalls = vm->upcalls;
@@ -1819,11 +1823,35 @@ JavaObject* AnnotationReader::createElem
   } else if (tag == 'e') {
     // Element_value Enumeration not implemented
     const UTF8* n = cl->ctpInfo->UTF8At(reader.readU2());
-    ddprintf("%s", PrintBuffer(n).cString());
     const UTF8* m = cl->ctpInfo->UTF8At(reader.readU2());
-    ddprintf("%s", PrintBuffer(m).cString());
-    fprintf(stderr, "Annotation not supported for %c (enumerations) type\n", tag);
-    abort();
+    printf("I am here looking for enum %s and value %s\n", UTF8Buffer(n).cString(), UTF8Buffer(m).cString());
+    JnjvmClassLoader* JCL = this->cl->classLoader;
+    n = n->extract(JCL->hashUTF8, 1,n->size-1);
+    UserCommonClass* cl = JCL->loadClassFromUserUTF8(n,true,false, NULL);
+    if (cl != NULL && !cl->isPrimitive()) {
+    	printf("Ok, I found the class\n");
+    	if (cl->asClass())
+    		cl->asClass()->initialiseClass(vm);
+    	clazzLoaded = cl->getClassDelegatee(vm);
+    	str = JavaString::internalToJava(m, vm);
+    	assert(clazzLoaded && "Class not found");
+    	assert(str && "Null string");
+    	printf("Ok1\n");
+    	field = upcalls->getFieldInClass->invokeJavaObjectVirtual(vm, upcalls->newClass, clazzLoaded, &str);
+    	printf("Ok2\n");
+    	assert(field && "Field not found");
+    	JavaObject* obj = 0;
+    	printf("Ok3\n");
+    	res = upcalls->getInField->invokeJavaObjectVirtual(vm, upcalls->newField, field, &obj);
+    	printf("Ok4\n");
+    	assert(res && "Field value not found");
+    } else {
+    	str = JavaString::internalToJava(n, vm);
+    	vm->classNotFoundException(str);
+    }
+
+    //fprintf(stderr, "Annotation not supported for %c (enumerations) type\n", tag);
+    //abort();
 
   } else if (tag == 'c') {
     ddprintf("class=");
@@ -1836,9 +1864,8 @@ JavaObject* AnnotationReader::createElem
     UserCommonClass* cl = JCL->loadClassFromUserUTF8(m,true,false, NULL);
 
 	if (cl != NULL && !cl->isPrimitive()) {
-		if (cl->asClass()) {
+		if (cl->asClass())
 		  cl->asClass()->initialiseClass(vm);
-		}
 		res = cl->getClassDelegatee(vm);
 	} else {
 	  str = JavaString::internalToJava(m, vm);





More information about the vmkit-commits mailing list