[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