diff options
author | kseitz <kseitz@138bc75d-0d04-0410-961f-82ee72b054a4> | 2006-11-02 16:59:04 +0000 |
---|---|---|
committer | kseitz <kseitz@138bc75d-0d04-0410-961f-82ee72b054a4> | 2006-11-02 16:59:04 +0000 |
commit | c83167c404730d8f9b2a6b9963800ff9e3e62baf (patch) | |
tree | b0f51cade32bdfcdca41b43f5837b9ab6c12aa5c /libjava/jvmti.cc | |
parent | d92f994c5abc6c12b75857b4e8285f048808be87 (diff) | |
download | gcc-c83167c404730d8f9b2a6b9963800ff9e3e62baf.tar.gz |
* jvmti.cc (_Jv_JVMTI_GetLineNumberTable): New function.
(_Jv_JVMTI_Interface): Define GetLineNumberTable.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@118419 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libjava/jvmti.cc')
-rw-r--r-- | libjava/jvmti.cc | 50 |
1 files changed, 49 insertions, 1 deletions
diff --git a/libjava/jvmti.cc b/libjava/jvmti.cc index 5569551c2a3..8584c333d6d 100644 --- a/libjava/jvmti.cc +++ b/libjava/jvmti.cc @@ -507,6 +507,54 @@ _Jv_JVMTI_GetMethodModifiers (MAYBE_UNUSED jvmtiEnv *env, jmethodID method, } 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 |