[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