[vmkit-commits] [vmkit] r147050 - in /vmkit/trunk/lib/j3: ClassLib/OpenJDK/OpenJDK.inc VMCore/JavaClass.cpp VMCore/JavaClass.h VMCore/JnjvmClassLoader.cpp
Will Dietz
wdietz2 at illinois.edu
Wed Dec 21 04:16:37 PST 2011
Author: wdietz2
Date: Wed Dec 21 06:16:37 2011
New Revision: 147050
URL: http://llvm.org/viewvc/llvm-project?rev=147050&view=rev
Log:
Add support for Signature and EnclosingMethod attributes.
OpenJDK: Use these to impl JVM_GetClassSignature and JVM_GetEnclosingMethodInfo
Modified:
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/OpenJDK.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/ClassLib/OpenJDK/OpenJDK.inc?rev=147050&r1=147049&r2=147050&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/ClassLib/OpenJDK/OpenJDK.inc (original)
+++ vmkit/trunk/lib/j3/ClassLib/OpenJDK/OpenJDK.inc Wed Dec 21 06:16:37 2011
@@ -1661,7 +1661,37 @@
/* Generics support (JDK 1.5) */
JNIEXPORT jstring JNICALL
JVM_GetClassSignature(JNIEnv *env, jclass cls) {
- NYI();
+ JavaObjectClass * Cl = 0;
+ jstring sig = 0;
+ llvm_gcroot(Cl, 0);
+
+ BEGIN_JNI_EXCEPTION
+
+ 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));
+ }
+
+ RETURN_FROM_JNI(sig);
+
+ END_JNI_EXCEPTION
+
+ return 0;
}
/* Annotations support (JDK 1.5) */
@@ -2800,7 +2830,55 @@
*/
JNIEXPORT jobjectArray JNICALL
JVM_GetEnclosingMethodInfo(JNIEnv* env, jclass ofClass) {
- NYI();
+ JavaObjectClass * Cl = 0;
+ ArrayObject * arr = 0;
+ llvm_gcroot(Cl, 0);
+ llvm_gcroot(arr, 0);
+
+ BEGIN_JNI_EXCEPTION
+ Jnjvm * vm = th->getJVM();
+
+ Cl = ofClass ? *(JavaObjectClass**)ofClass : 0;
+ verifyNull(Cl);
+
+ CommonClass* CC =
+ UserCommonClass::resolvedImplClass(vm, Cl, false);
+ Class* cl = CC->asClass();
+
+ // Primitives arrays, interfaces...
+ if (!cl) RETURN_FROM_JNI(0);
+
+ Attribut* emAtt = cl->lookupAttribut(Attribut::enclosingMethodAttribut);
+
+ if (emAtt) {
+ Reader reader(emAtt, cl->bytes);
+ uint16 class_index = reader.readU2();
+ uint16 method_index = reader.readU2();
+
+ JavaConstantPool * cpl = cl->getConstantPool();
+ CommonClass * enclosingClass = cpl->loadClass(class_index, true);
+ assert(enclosingClass);
+
+ arr = (ArrayObject*)vm->upcalls->ArrayOfObject->doNew(3,vm);
+ ArrayObject::setElement(arr, enclosingClass->getClassDelegatee(vm), 0);
+
+ if (method_index) {
+ Signdef * sign = cl->getConstantPool()->resolveNameAndSign(method_index);
+ assert(sign);
+
+ const UTF8* methodName = cpl->UTF8At((cpl->ctpDef[method_index] >> 16) & 0xFFFF);
+ assert(methodName);
+
+ ArrayObject::setElement(arr, *cl->classLoader->UTF8ToStr(methodName), 1);
+ ArrayObject::setElement(arr, *cl->classLoader->UTF8ToStr(sign->keyName), 2);
+ }
+ }
+
+ RETURN_REF_FROM_JNI(arr, jobjectArray);
+
+ END_JNI_EXCEPTION
+
+ return 0;
}
/*
Modified: vmkit/trunk/lib/j3/VMCore/JavaClass.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JavaClass.cpp?rev=147050&r1=147049&r2=147050&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JavaClass.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/JavaClass.cpp Wed Dec 21 06:16:37 2011
@@ -36,6 +36,8 @@
const UTF8* Attribut::lineNumberTableAttribut = 0;
const UTF8* Attribut::innerClassesAttribut = 0;
const UTF8* Attribut::sourceFileAttribut = 0;
+const UTF8* Attribut::signatureAttribut = 0;
+const UTF8* Attribut::enclosingMethodAttribut = 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=147050&r1=147049&r2=147050&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JavaClass.h (original)
+++ vmkit/trunk/lib/j3/VMCore/JavaClass.h Wed Dec 21 06:16:37 2011
@@ -130,6 +130,16 @@
/// file.
///
static const UTF8* sourceFileAttribut;
+
+ /// signatureAttribut - The "Signature" attribut. This is used to record
+ /// generics information about a class or method.
+ ///
+ static const UTF8* signatureAttribut;
+
+ /// enclosingMEthodAttribut - The "EnclosingMethod" attribut. This is a class
+ /// attribut that identifies the method definining a local or anonymous class
+ ///
+ static const UTF8* enclosingMethodAttribut;
};
Modified: vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.cpp?rev=147050&r1=147049&r2=147050&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.cpp Wed Dec 21 06:16:37 2011
@@ -150,6 +150,8 @@
Attribut::lineNumberTableAttribut = asciizConstructUTF8("LineNumberTable");
Attribut::innerClassesAttribut = asciizConstructUTF8("InnerClasses");
Attribut::sourceFileAttribut = asciizConstructUTF8("SourceFile");
+ Attribut::signatureAttribut = asciizConstructUTF8("Signature");
+ Attribut::enclosingMethodAttribut = asciizConstructUTF8("EnclosingMethod");
JavaCompiler::InlinePragma =
asciizConstructUTF8("Lorg/vmmagic/pragma/Inline;");
More information about the vmkit-commits
mailing list