]> gcc.gnu.org Git - gcc.git/commitdiff
jvmti.cc (_Jv_JVMTI_GetLineNumberTable): New function.
authorKeith Seitz <keiths@redhat.com>
Thu, 2 Nov 2006 16:59:04 +0000 (16:59 +0000)
committerKeith Seitz <kseitz@gcc.gnu.org>
Thu, 2 Nov 2006 16:59:04 +0000 (16:59 +0000)
        * jvmti.cc (_Jv_JVMTI_GetLineNumberTable): New function.
        (_Jv_JVMTI_Interface): Define GetLineNumberTable.

From-SVN: r118419

libjava/ChangeLog
libjava/jvmti.cc

index 8c3d985097a2f71f532add3c180b5bc5129acc13..e8348a0a9095e1197c40d94960374a4e704bb6e0 100644 (file)
@@ -1,3 +1,8 @@
+2006-11-02  Keith Seitz  <keiths@redhat.com>
+
+       * jvmti.cc (_Jv_JVMTI_GetLineNumberTable): New function.
+       (_Jv_JVMTI_Interface): Define GetLineNumberTable.
+
 2006-11-01  Keith Seitz  <keiths@redhat.com>
 
        * gnu/gcj/jvmti/Location.java: New file.
index 5569551c2a30573bf5f92ee23125af8410a01b22..8584c333d6d1c20afeed9a7e6f1c77fb766f7c53 100644 (file)
@@ -506,6 +506,54 @@ _Jv_JVMTI_GetMethodModifiers (MAYBE_UNUSED jvmtiEnv *env, jmethodID method,
   return JVMTI_ERROR_NONE;
 }
 
+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 @@ struct _Jv_jvmtiEnv _Jv_JVMTI_Interface =
   RESERVED,                    // reserved67
   UNIMPLEMENTED,               // GetMaxLocals
   UNIMPLEMENTED,               // GetArgumentsSize
-  UNIMPLEMENTED,               // GetLineNumberTable
+  _Jv_JVMTI_GetLineNumberTable,        // GetLineNumberTable
   UNIMPLEMENTED,               // GetMethodLocation
   UNIMPLEMENTED,               // GetLocalVariableTable
   RESERVED,                    // reserved73
This page took 0.085162 seconds and 5 git commands to generate.