[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