This is the mail archive of the java-patches@gcc.gnu.org mailing list for the Java project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[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

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]