Mercurial > hg > truffle
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)}, };