[vmkit-commits] [vmkit] r180433 - Working in annotations with arrays of enumerative
Peter Senna Tschudin
peter.senna at gmail.com
Thu Apr 25 10:10:48 PDT 2013
Author: peter.senna
Date: Thu Apr 25 12:09:17 2013
New Revision: 180433
URL: http://llvm.org/viewvc/llvm-project?rev=180433&view=rev
Log:
Working in annotations with arrays of enumerative
(cherry picked from commit 87e2ec3e87e87d06bb59c07e6610f5b947e08232)
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=180433&r1=180432&r2=180433&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JavaClass.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/JavaClass.cpp Thu Apr 25 12:09:17 2013
@@ -1753,10 +1753,10 @@ 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;
+ JavaObject* clazzLoaded = 0;
llvm_gcroot(res, 0);
llvm_gcroot(tmp, 0);
llvm_gcroot(str, 0);
@@ -1821,38 +1821,26 @@ JavaObject* AnnotationReader::createElem
res = JavaString::internalToJava(s, JavaThread::get()->getJVM());
} else if (tag == 'e') {
- // Element_value Enumeration not implemented
const UTF8* n = cl->ctpInfo->UTF8At(reader.readU2());
const UTF8* m = cl->ctpInfo->UTF8At(reader.readU2());
- 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=");
const UTF8* m = cl->ctpInfo->UTF8At(reader.readU2());
@@ -1878,6 +1866,7 @@ JavaObject* AnnotationReader::createElem
if (numValues > 0)
res = createArrayByTag(numValues);
else {
+ // FIXME : Do something, I do not know the kind of array to create
fprintf(stderr, "Empty array not implemented %c type\n", tag);
abort();
}
@@ -1896,16 +1885,22 @@ JavaObject* AnnotationReader::createArra
JavaObject* res = 0;
JavaString* str = 0;
JavaObject* clazzObject = 0;
+ JavaObject* field = 0;
+ JavaObject* clazzLoaded = 0;
+ JavaObject* myEnum = 0;
llvm_gcroot(res, 0);
llvm_gcroot(str, 0);
llvm_gcroot(clazzObject, 0);
+ llvm_gcroot(clazzLoaded, 0);
+ llvm_gcroot(field, 0);
+ llvm_gcroot(myEnum, 0);
sint32 valS;
uint32 valU;
sint64 val64S;
double valD;
float valF;
- const UTF8* s = 0;
+ const UTF8* s = 0, *n = 0, * m = 0;
JnjvmClassLoader* JCL;
UserCommonClass* clLoaded;
@@ -1970,8 +1965,31 @@ JavaObject* AnnotationReader::createArra
ArrayObject::setElement((ArrayObject *)res, str, 0);
break;
case 'e':
- fprintf(stderr, "Annotation not supported for %c (enumerations) type\n", tag);
- abort();
+ JCL = this->cl->classLoader;
+ //printf("Haciendo un arreglo del tipo : %s \n", UTF8Buffer(lastKey).cString());
+ array = JCL->constructArray(JCL->asciizConstructUTF8("[LDays;"));
+ res = array->doNew(numValues, vm);
+ n = cl->ctpInfo->UTF8At(reader.readU2());
+ m = cl->ctpInfo->UTF8At(reader.readU2());
+
+ n = n->extract(JCL->hashUTF8, 1,n->size-1);
+ clLoaded = JCL->loadClassFromUserUTF8(n,true,false, NULL);
+ if (clLoaded != NULL && !clLoaded->isPrimitive()) {
+ if (clLoaded->asClass())
+ clLoaded->asClass()->initialiseClass(vm);
+ clazzLoaded = clLoaded->getClassDelegatee(vm);
+ str = JavaString::internalToJava(m, vm);
+ assert(clazzLoaded && "Class not found");
+ assert(str && "Null string");
+ field = upcalls->getFieldInClass->invokeJavaObjectVirtual(vm, upcalls->newClass, clazzLoaded, &str);
+ assert(field && "Field not found");
+ JavaObject* obj = 0;
+ myEnum = upcalls->getInField->invokeJavaObjectVirtual(vm, upcalls->newField, field, &obj);
+ ArrayObject::setElement((ArrayObject *)res, str, 0);
+ } else {
+ str = JavaString::internalToJava(n, vm);
+ vm->classNotFoundException(str);
+ }
break;
case 'c':
array = upcalls->classArrayClass;
@@ -1990,10 +2008,6 @@ JavaObject* AnnotationReader::createArra
}
ArrayObject::setElement((ArrayObject *)res, clazzObject, 0);
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();
@@ -2045,8 +2059,27 @@ JavaObject* AnnotationReader::createArra
ArrayObject::setElement((ArrayObject *)res, str, i);
break;
case 'e':
- fprintf(stderr, "Annotation not supported for %c (enumerations) type\n", tag);
- abort();
+ n = cl->ctpInfo->UTF8At(reader.readU2());
+ m = cl->ctpInfo->UTF8At(reader.readU2());
+ JCL = this->cl->classLoader;
+ n = n->extract(JCL->hashUTF8, 1,n->size-1);
+ clLoaded = JCL->loadClassFromUserUTF8(n,true,false, NULL);
+ if (clLoaded != NULL && !clLoaded->isPrimitive()) {
+ if (clLoaded->asClass())
+ clLoaded->asClass()->initialiseClass(vm);
+ clazzLoaded = clLoaded->getClassDelegatee(vm);
+ str = JavaString::internalToJava(m, vm);
+ assert(clazzLoaded && "Class not found");
+ assert(str && "Null string");
+ field = upcalls->getFieldInClass->invokeJavaObjectVirtual(vm, upcalls->newClass, clazzLoaded, &str);
+ assert(field && "Field not found");
+ JavaObject* obj = 0;
+ myEnum = upcalls->getInField->invokeJavaObjectVirtual(vm, upcalls->newField, field, &obj);
+ ArrayObject::setElement((ArrayObject *)res, str, i);
+ } else {
+ str = JavaString::internalToJava(n, vm);
+ vm->classNotFoundException(str);
+ }
break;
case 'c':
s = cl->ctpInfo->UTF8At(reader.readU2());
@@ -2063,10 +2096,6 @@ JavaObject* AnnotationReader::createArra
}
ArrayObject::setElement((ArrayObject *)res, clazzObject, i);
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();
Modified: vmkit/trunk/lib/j3/VMCore/JavaClass.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JavaClass.h?rev=180433&r1=180432&r2=180433&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JavaClass.h (original)
+++ vmkit/trunk/lib/j3/VMCore/JavaClass.h Thu Apr 25 12:09:17 2013
@@ -66,6 +66,7 @@ public:
Reader& reader;
Class* cl;
uint16 AnnotationNameIndex;
+ const UTF8* lastKey;
AnnotationReader(Reader& R, Class* C) : reader(R), cl(C),
AnnotationNameIndex(0) {}
More information about the vmkit-commits
mailing list