diff src/share/vm/graal/graalCompilerToVM.cpp @ 7786:8bbbde9d0a52

extended ResolvedJavaMethod API by getLocalVariableTable
author Matthias Grimmer <grimmer@ssw.jku.at>
date Wed, 13 Feb 2013 13:34:05 +0100
parents 016e23829147
children 5aa05e6f9dee 225c984588ee
line wrap: on
line diff
--- a/src/share/vm/graal/graalCompilerToVM.cpp	Wed Feb 13 11:37:14 2013 +1000
+++ b/src/share/vm/graal/graalCompilerToVM.cpp	Wed Feb 13 13:34:05 2013 +0100
@@ -992,6 +992,38 @@
   return result;
 C2V_END
 
+C2V_VMENTRY(jobject, getLocalVariableTable, (JNIEnv *, jobject, jobject hotspot_method))
+  ResourceMark rm;
+
+  Method* method = getMethodFromHotSpotMethod(JNIHandles::resolve(hotspot_method));
+  if(!method->has_localvariable_table()) {
+    return NULL;
+  }
+  int localvariable_table_length = method->localvariable_table_length();
+
+  objArrayHandle local_array = oopFactory::new_objArray(SystemDictionary::LocalImpl_klass(), localvariable_table_length, CHECK_NULL);
+  LocalVariableTableElement* table = method->localvariable_table_start();
+  for (int i = 0; i < localvariable_table_length; i++) {
+    u2 start_bci = table[i].start_bci;
+    u4 end_bci = (u4)(start_bci + table[i].length);
+    u2 nameCPIdx = table[i].name_cp_index;
+    u2 typeCPIdx = table[i].descriptor_cp_index;
+    u2 slot = table[i].slot;
+
+    char* name = method->constants()->string_at_noresolve(nameCPIdx);
+    Handle nameHandle = java_lang_String::create_from_str(name, CHECK_NULL);
+
+    char* typeInfo = method->constants()->string_at_noresolve(typeCPIdx);
+    Handle typeHandle = java_lang_String::create_from_str(typeInfo, CHECK_NULL);
+
+    Handle holderHandle = GraalCompiler::createHotSpotResolvedObjectType(method, CHECK_0);
+    Handle local = VMToCompiler::createLocal(nameHandle, typeHandle, (int) start_bci, (int) end_bci, (int) slot, holderHandle, Thread::current());
+    local_array->obj_at_put(i, local());
+  }
+
+  return JNIHandles::make_local(local_array());
+C2V_END
+
 
 C2V_VMENTRY(jobject, getFileName, (JNIEnv *, jobject, jobject klass))
   ResourceMark rm;
@@ -1016,6 +1048,7 @@
 #define CONSTANT_POOL         "Lcom/oracle/graal/api/meta/ConstantPool;"
 #define CONSTANT              "Lcom/oracle/graal/api/meta/Constant;"
 #define KIND                  "Lcom/oracle/graal/api/meta/Kind;"
+#define LOCAL                  "Lcom/oracle/graal/api/meta/Local;"
 #define RUNTIME_CALL          "Lcom/oracle/graal/api/code/RuntimeCall;"
 #define EXCEPTION_HANDLERS    "[Lcom/oracle/graal/api/meta/ExceptionHandler;"
 #define REFLECT_METHOD        "Ljava/lang/reflect/Method;"
@@ -1077,6 +1110,7 @@
   {CC"getDeoptedLeafGraphIds",        CC"()[J",                                                         FN_PTR(getDeoptedLeafGraphIds)},
   {CC"decodePC",                      CC"(J)"STRING,                                                    FN_PTR(decodePC)},
   {CC"getLineNumberTable",            CC"("HS_RESOLVED_METHOD")[J",                                     FN_PTR(getLineNumberTable)},
+  {CC"getLocalVariableTable",         CC"("HS_RESOLVED_METHOD")["LOCAL,                                 FN_PTR(getLocalVariableTable)},
   {CC"getFileName",                   CC"("HS_RESOLVED_JAVA_TYPE")"STRING,                              FN_PTR(getFileName)},
 };