[vmkit-commits] [vmkit] r147380 - in /vmkit/trunk/lib/j3: ClassLib/OpenJDK/ClasspathReflect.cpp ClassLib/OpenJDK/ClasspathReflect.h ClassLib/OpenJDK/OpenJDK.inc VMCore/JavaClass.cpp VMCore/JavaClass.h VMCore/JnjvmClassLoader.cpp
Will Dietz
wdietz2 at illinois.edu
Fri Dec 30 12:40:16 PST 2011
Author: wdietz2
Date: Fri Dec 30 14:40:16 2011
New Revision: 147380
URL: http://llvm.org/viewvc/llvm-project?rev=147380&view=rev
Log:
Add support for annotation-related attributes in OpenJDK.
Populate signature fields in generated reflection objects also.
Modified:
vmkit/trunk/lib/j3/ClassLib/OpenJDK/ClasspathReflect.cpp
vmkit/trunk/lib/j3/ClassLib/OpenJDK/ClasspathReflect.h
vmkit/trunk/lib/j3/ClassLib/OpenJDK/OpenJDK.inc
vmkit/trunk/lib/j3/VMCore/JavaClass.cpp
vmkit/trunk/lib/j3/VMCore/JavaClass.h
vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.cpp
Modified: vmkit/trunk/lib/j3/ClassLib/OpenJDK/ClasspathReflect.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/ClassLib/OpenJDK/ClasspathReflect.cpp?rev=147380&r1=147379&r2=147380&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/ClassLib/OpenJDK/ClasspathReflect.cpp (original)
+++ vmkit/trunk/lib/j3/ClassLib/OpenJDK/ClasspathReflect.cpp Fri Dec 30 14:40:16 2011
@@ -10,11 +10,14 @@
#include "ClasspathReflect.h"
#include "JavaArray.h"
#include "JavaClass.h"
+#include "JavaConstantPool.h"
#include "JavaObject.h"
#include "JavaThread.h"
#include "JavaTypes.h"
#include "JavaUpcalls.h"
#include "Jnjvm.h"
+#include "Reader.h"
+
#include "Reflect.inc"
namespace j3 {
@@ -86,9 +89,13 @@
JavaObjectConstructor* ret = 0;
JavaObject* pArr = 0;
JavaObject* eArr = 0;
+ ArraySInt8* ann = 0;
+ ArraySInt8* pmAnn = 0;
llvm_gcroot(ret, 0);
llvm_gcroot(pArr, 0);
llvm_gcroot(eArr, 0);
+ llvm_gcroot(ann, 0);
+ llvm_gcroot(pmAnn, 0);
Jnjvm* vm = JavaThread::get()->getJVM();
JnjvmClassLoader * classLoader = cons->classDef->classLoader;
@@ -98,15 +105,20 @@
eArr = cons->getExceptionTypes(classLoader);
ret = (JavaObjectConstructor*)Cons->doNew(vm);
JavaObject* const* Cl = cons->classDef->getDelegateePtr();
+
+ JavaString ** sig = getSignature(cons);
+ ann = getAnnotations(cons);
+ pmAnn = getParamAnnotations(cons);
+
vm->upcalls->initConstructor->invokeIntSpecial(vm, Cons, ret,
Cl, /* declaringClass */
&pArr, /* parameterTypes */
&eArr, /* checkedExceptions */
cons->access, /* modifiers */
i, /* slot */
- NULL, /* String signature */
- NULL, /* annotations */
- NULL /* parameterAnnotations */
+ sig, /* String signature */
+ &ann, /* annotations */
+ &pmAnn /* parameterAnnotations */
);
return ret;
@@ -118,11 +130,17 @@
JavaObject* pArr = 0;
JavaObject* eArr = 0;
JavaObject* retTy = 0;
+ ArraySInt8* ann = 0;
+ ArraySInt8* pmAnn = 0;
+ ArraySInt8* defAnn = 0;
llvm_gcroot(ret, 0);
llvm_gcroot(str, 0);
llvm_gcroot(pArr, 0);
llvm_gcroot(eArr, 0);
llvm_gcroot(retTy, 0);
+ llvm_gcroot(ann, 0);
+ llvm_gcroot(pmAnn, 0);
+ llvm_gcroot(defAnn, 0);
// TODO: check parameter types
Jnjvm* vm = JavaThread::get()->getJVM();
@@ -134,6 +152,11 @@
pArr = meth->getParameterTypes(classLoader);
eArr = meth->getExceptionTypes(classLoader);
retTy = meth->getReturnType(classLoader);
+ JavaString ** sig = getSignature(meth);
+ ann = getAnnotations(meth);
+ pmAnn = getParamAnnotations(meth);
+ defAnn = getAnnotationDefault(meth);
+
JavaObject* const* Cl = meth->classDef->getClassDelegateePtr(vm);
vm->upcalls->initMethod->invokeIntSpecial(vm, Meth, ret,
Cl, /* declaring class */
@@ -143,10 +166,10 @@
&eArr, /* exceptions */
meth->access, /* modifiers */
i, /* slot */
- NULL, /* signature */
- NULL, /* annotations */
- NULL, /* parameter annotations */
- NULL); /* default annotations */
+ sig, /* signature */
+ &ann, /* annotations */
+ &pmAnn, /* parameter annotations */
+ &defAnn); /* default annotations */
return ret;
}
@@ -154,8 +177,10 @@
JavaObjectField* JavaObjectField::createFromInternalField(JavaField* field, int i) {
JavaObjectField* ret = 0;
JavaString* name = 0;
+ ArraySInt8* ann = 0;
llvm_gcroot(ret, 0);
llvm_gcroot(name, 0);
+ llvm_gcroot(ann, 0);
// TODO: check parameter types
Jnjvm* vm = JavaThread::get()->getJVM();
@@ -170,9 +195,8 @@
JavaObject* const* type = fieldCl->getClassDelegateePtr(vm);
JavaObject* const* Cl = field->classDef->getClassDelegateePtr(vm);
- // TODO:Implement these!
- JavaObject** sign = NULL;
- JavaObject** annArray = NULL;
+ JavaString** sig = getSignature(field);
+ ann = getAnnotations(field);
/* java.reflect.Field(
* Class declaringClass,
@@ -189,10 +213,106 @@
type,
field->access,
i,
- sign,
- annArray);
+ sig,
+ ann);
return ret;
}
+static inline JavaString** getSignatureString(Attribut* sigAtt, Class* cl) {
+ if (!sigAtt) return 0;
+
+ Reader reader(sigAtt, cl->bytes);
+ uint16 index = reader.readU2();
+
+ return cl->classLoader->UTF8ToStr(cl->getConstantPool()->UTF8At(index));
+
+}
+
+JavaString** JavaObjectClass::getSignature(Class *cl) {
+ Attribut* sigAtt = cl->lookupAttribut(Attribut::signatureAttribut);
+ return getSignatureString(sigAtt, cl);
+}
+
+JavaString** JavaObjectField::getSignature(JavaField* field) {
+ Attribut* sigAtt = field->lookupAttribut(Attribut::signatureAttribut);
+ return getSignatureString(sigAtt, field->classDef);
+}
+
+JavaString** JavaObjectMethod::getSignature(JavaMethod* meth) {
+ Attribut* sigAtt = meth->lookupAttribut(Attribut::signatureAttribut);
+ return getSignatureString(sigAtt, meth->classDef);
+}
+
+JavaString** JavaObjectConstructor::getSignature(JavaMethod* cons) {
+ Attribut* sigAtt = cons->lookupAttribut(Attribut::signatureAttribut);
+ return getSignatureString(sigAtt, cons->classDef);
+}
+
+static inline ArraySInt8* getAttrBytes(Attribut* annotationsAtt, Class* cl) {
+ ArraySInt8* ret = 0;
+ llvm_gcroot(ret, 0);
+
+ if (!annotationsAtt) return 0;
+
+ JavaThread* th = JavaThread::get();
+ Jnjvm* vm = th->getJVM();
+
+ uint32 len = annotationsAtt->nbb;
+ ret = (ArraySInt8*)vm->upcalls->ArrayOfByte->doNew(len, vm);
+
+ Reader reader(annotationsAtt, cl->bytes);
+ for(uint32 i = 0; i < len; ++i) {
+ ArraySInt8::setElement(ret, reader.readS1(), i);
+ }
+
+ return ret;
+}
+
+ArraySInt8* JavaObjectClass::getAnnotations(Class *cl) {
+ Attribut* attr =
+ cl->lookupAttribut(Attribut::annotationsAttribut);
+
+ return getAttrBytes(attr, cl);
+}
+
+ArraySInt8* JavaObjectField::getAnnotations(JavaField *field) {
+ Attribut* attr =
+ field->lookupAttribut(Attribut::annotationsAttribut);
+
+ return getAttrBytes(attr, field->classDef);
+}
+
+ArraySInt8* JavaObjectMethod::getAnnotations(JavaMethod *meth) {
+ Attribut* attr =
+ meth->lookupAttribut(Attribut::annotationsAttribut);
+
+ return getAttrBytes(attr, meth->classDef);
+}
+ArraySInt8* JavaObjectMethod::getParamAnnotations(JavaMethod *meth) {
+ Attribut* attr =
+ meth->lookupAttribut(Attribut::paramAnnotationsAttribut);
+
+ return getAttrBytes(attr, meth->classDef);
+}
+ArraySInt8* JavaObjectMethod::getAnnotationDefault(JavaMethod *meth) {
+ Attribut* attr =
+ meth->lookupAttribut(Attribut::annotationDefaultAttribut);
+
+ return getAttrBytes(attr, meth->classDef);
+}
+
+ArraySInt8* JavaObjectConstructor::getAnnotations(JavaMethod *cons) {
+ Attribut* attr =
+ cons->lookupAttribut(Attribut::annotationsAttribut);
+
+ return getAttrBytes(attr, cons->classDef);
+}
+ArraySInt8* JavaObjectConstructor::getParamAnnotations(JavaMethod *cons) {
+ Attribut* attr =
+ cons->lookupAttribut(Attribut::paramAnnotationsAttribut);
+
+ return getAttrBytes(attr, cons->classDef);
+}
+
} // end namespace j3
Modified: vmkit/trunk/lib/j3/ClassLib/OpenJDK/ClasspathReflect.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/ClassLib/OpenJDK/ClasspathReflect.h?rev=147380&r1=147379&r2=147380&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/ClassLib/OpenJDK/ClasspathReflect.h (original)
+++ vmkit/trunk/lib/j3/ClassLib/OpenJDK/ClasspathReflect.h Fri Dec 30 14:40:16 2011
@@ -12,6 +12,7 @@
#include "VmkitGC.h"
+#include "JavaArray.h"
#include "JavaClass.h"
#include "JavaObject.h"
#include "JavaThread.h"
@@ -97,7 +98,6 @@
}
}
- static ArrayObject* getDeclaredAnnotations(JavaObjectClass* Cl);
static ArrayObject* getDeclaredClasses(JavaObjectClass* Cl, bool publicOnly);
static ArrayObject* getDeclaredConstructors(JavaObjectClass* Cl, bool publicOnly);
static ArrayObject* getDeclaredFields(JavaObjectClass* Cl, bool publicOnly);
@@ -105,6 +105,8 @@
static ArrayObject* getInterfaces(JavaObjectClass* Cl);
static JavaObject* getDeclaringClass(JavaObjectClass* Cl);
static int getModifiers(JavaObjectClass* Cl);
+ static JavaString** getSignature(Class* cl);
+ static ArraySInt8* getAnnotations(Class* cl);
};
class JavaObjectField : public JavaObject {
@@ -157,6 +159,8 @@
}
static JavaObjectField* createFromInternalField(JavaField* field, int i);
+ static JavaString** getSignature(JavaField* field);
+ static ArraySInt8* getAnnotations(JavaField* field);
};
class JavaObjectMethod : public JavaObject {
@@ -211,6 +215,10 @@
}
static JavaObjectMethod* createFromInternalMethod(JavaMethod* meth, int i);
+ static JavaString** getSignature(JavaMethod* meth);
+ static ArraySInt8* getAnnotations(JavaMethod* meth);
+ static ArraySInt8* getParamAnnotations(JavaMethod* meth);
+ static ArraySInt8* getAnnotationDefault(JavaMethod* meth);
};
class JavaObjectConstructor : public JavaObject {
@@ -256,6 +264,9 @@
}
static JavaObjectConstructor* createFromInternalConstructor(JavaMethod* cons, int i);
+ static JavaString** getSignature(JavaMethod* cons);
+ static ArraySInt8* getAnnotations(JavaMethod* cons);
+ static ArraySInt8* getParamAnnotations(JavaMethod* cons);
};
class JavaObjectThrowable : public JavaObject {
Modified: vmkit/trunk/lib/j3/ClassLib/OpenJDK/OpenJDK.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/ClassLib/OpenJDK/OpenJDK.inc?rev=147380&r1=147379&r2=147380&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/ClassLib/OpenJDK/OpenJDK.inc (original)
+++ vmkit/trunk/lib/j3/ClassLib/OpenJDK/OpenJDK.inc Fri Dec 30 14:40:16 2011
@@ -1674,7 +1674,6 @@
JNIEXPORT jstring JNICALL
JVM_GetClassSignature(JNIEnv *env, jclass cls) {
JavaObjectClass * Cl = 0;
- jstring sig = 0;
llvm_gcroot(Cl, 0);
BEGIN_JNI_EXCEPTION
@@ -1682,24 +1681,11 @@
Cl = cls ? *(JavaObjectClass**)cls : 0;
verifyNull(Cl);
- Jnjvm* vm = th->getJVM();
- CommonClass* CC =
- UserCommonClass::resolvedImplClass(vm, Cl, false);
- Class* cl = CC->asClass();
-
- // Primitives, arrays, interfaces...
- if (!cl) RETURN_FROM_JNI(0);
-
- Attribut* sigAtt = cl->lookupAttribut(Attribut::signatureAttribut);
-
- if (sigAtt) {
- Reader reader(sigAtt, cl->bytes);
- uint16 index = reader.readU2();
-
- sig = (jstring)cl->classLoader->UTF8ToStr(cl->getConstantPool()->UTF8At(index));
- }
+ Class* cl = JavaObjectClass::getClass(Cl)->asClass();
+ if (!cl) return 0;
- RETURN_FROM_JNI(sig);
+ JavaString** sig = JavaObjectClass::getSignature(cl);
+ RETURN_FROM_JNI((jstring)sig);
END_JNI_EXCEPTION
@@ -1718,28 +1704,12 @@
Cl = cls ? *(JavaObjectClass**)cls : 0;
verifyNull(Cl);
-
- Jnjvm* vm = th->getJVM();
- CommonClass* CC = JavaObjectClass::getClass(Cl);
- assert(CC);
- Class* cl = CC->asClass();
+ Class * cl = JavaObjectClass::getClass(Cl)->asClass();
assert(cl);
- Attribut* annotationsAtt =
- cl->lookupAttribut(Attribut::annotationsAttribut);
-
- if (annotationsAtt) {
- uint32 len = annotationsAtt->nbb;
- ret = (ArraySInt8*)vm->upcalls->ArrayOfByte->doNew(len, vm);
-
- Reader reader(annotationsAtt, cl->bytes);
- for(uint32 i = 0; i < len; ++i) {
- ArraySInt8::setElement(ret, reader.readS1(), i);
- }
- RETURN_REF_FROM_JNI(ret, jbyteArray);
- }
+ ret = JavaObjectClass::getAnnotations(cl);
- RETURN_FROM_JNI(0);
+ RETURN_REF_FROM_JNI(ret, jbyteArray);
END_JNI_EXCEPTION
Modified: vmkit/trunk/lib/j3/VMCore/JavaClass.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JavaClass.cpp?rev=147380&r1=147379&r2=147380&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JavaClass.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/JavaClass.cpp Fri Dec 30 14:40:16 2011
@@ -38,6 +38,8 @@
const UTF8* Attribut::sourceFileAttribut = 0;
const UTF8* Attribut::signatureAttribut = 0;
const UTF8* Attribut::enclosingMethodAttribut = 0;
+const UTF8* Attribut::paramAnnotationsAttribut = 0;
+const UTF8* Attribut::annotationDefaultAttribut = 0;
Class* ClassArray::SuperArray;
Class** ClassArray::InterfacesArray;
Modified: vmkit/trunk/lib/j3/VMCore/JavaClass.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JavaClass.h?rev=147380&r1=147379&r2=147380&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JavaClass.h (original)
+++ vmkit/trunk/lib/j3/VMCore/JavaClass.h Fri Dec 30 14:40:16 2011
@@ -140,7 +140,14 @@
/// attribut that identifies the method definining a local or anonymous class
///
static const UTF8* enclosingMethodAttribut;
-
+
+ /// paramAnnotationsAttribut - Annotations for parameters attribut
+ ///
+ static const UTF8* paramAnnotationsAttribut;
+
+ /// annotationDefaultAttribut - The "AnnotationDefault" attribut
+ ///
+ static const UTF8* annotationDefaultAttribut;
};
/// TaskClassMirror - The isolate specific class information: the initialization
Modified: vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.cpp?rev=147380&r1=147379&r2=147380&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.cpp Fri Dec 30 14:40:16 2011
@@ -152,6 +152,8 @@
Attribut::sourceFileAttribut = asciizConstructUTF8("SourceFile");
Attribut::signatureAttribut = asciizConstructUTF8("Signature");
Attribut::enclosingMethodAttribut = asciizConstructUTF8("EnclosingMethod");
+ Attribut::paramAnnotationsAttribut = asciizConstructUTF8("RuntimeVisibleParameterAnnotations");
+ Attribut::annotationDefaultAttribut = asciizConstructUTF8("AnnotationDefault");
JavaCompiler::InlinePragma =
asciizConstructUTF8("Lorg/vmmagic/pragma/Inline;");
More information about the vmkit-commits
mailing list