This is the mail archive of the
java-patches@gcc.gnu.org
mailing list for the Java project.
[RFA/JVMTI] GetLineNumberTable
- From: Keith Seitz <keiths at redhat dot com>
- To: Java Patch List <java-patches at gcc dot gnu dot org>
- Date: Wed, 01 Nov 2006 14:25:02 -0800
- Subject: [RFA/JVMTI] GetLineNumberTable
Hi,
This patch adds the JVMTI function GetLineNumberTable. The only
divergence from real JVMTI is how natively compiled classes are handled:
we simply treat their methods as if they were native methods in an
interpreted class.
Keith
ChangeLog
2006-11-01 Keith Seitz <keiths@redhat.com>
* jvmti.cc (_Jv_JVMTI_GetLineNumberTable): New function.
(_Jv_JVMTI_Interface): Define GetLineNumberTable.
Index: jvmti.cc
===================================================================
--- jvmti.cc (revision 118391)
+++ jvmti.cc (working copy)
@@ -507,6 +507,54 @@
}
static jvmtiError JNICALL
+_Jv_JVMTI_GetLineNumberTable (jvmtiEnv *env, jmethodID method,
+ jint *entry_count_ptr,
+ jvmtiLineNumberEntry **table_ptr)
+{
+ NULL_CHECK (entry_count_ptr);
+ NULL_CHECK (table_ptr);
+
+ jclass klass;
+ jvmtiError jerr = env->GetMethodDeclaringClass (method, &klass);
+ if (jerr != JVMTI_ERROR_NONE)
+ return jerr;
+
+ _Jv_MethodBase *base = _Jv_FindInterpreterMethod (klass, method);
+ if (base == NULL)
+ return JVMTI_ERROR_INVALID_METHODID;
+
+ if (java::lang::reflect::Modifier::isNative (method->accflags)
+ || !_Jv_IsInterpretedClass (klass))
+ return JVMTI_ERROR_NATIVE_METHOD;
+
+ _Jv_InterpMethod *imeth = reinterpret_cast<_Jv_InterpMethod *> (base);
+ jlong start, end;
+ jintArray lines = NULL;
+ jlongArray indices = NULL;
+ imeth->get_line_table (start, end, lines, indices);
+ if (lines == NULL)
+ return JVMTI_ERROR_ABSENT_INFORMATION;
+
+ jvmtiLineNumberEntry *table;
+ jsize len = lines->length * sizeof (jvmtiLineNumberEntry);
+ table = (jvmtiLineNumberEntry *) _Jv_MallocUnchecked (len);
+ if (table == NULL)
+ return JVMTI_ERROR_OUT_OF_MEMORY;
+
+ jint *line = elements (lines);
+ jlong *index = elements (indices);
+ for (int i = 0; i < lines->length; ++i)
+ {
+ table[i].start_location = index[i];
+ table[i].line_number = line[i];
+ }
+
+ *table_ptr = table;
+ *entry_count_ptr = lines->length;
+ return JVMTI_ERROR_NONE;
+}
+
+static jvmtiError JNICALL
_Jv_JVMTI_IsMethodNative (MAYBE_UNUSED jvmtiEnv *env, jmethodID method,
jboolean *result)
{
@@ -1380,7 +1428,7 @@
RESERVED, // reserved67
UNIMPLEMENTED, // GetMaxLocals
UNIMPLEMENTED, // GetArgumentsSize
- UNIMPLEMENTED, // GetLineNumberTable
+ _Jv_JVMTI_GetLineNumberTable, // GetLineNumberTable
UNIMPLEMENTED, // GetMethodLocation
UNIMPLEMENTED, // GetLocalVariableTable
RESERVED, // reserved73