diff --git a/libjava/ChangeLog b/libjava/ChangeLog index e8348a0a909..cdbf3da458a 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,7 @@ +2006-11-02 Keith Seitz + + * gnu/classpath/jdwp/natVMMethod.cc (getLineTable): Implement. + 2006-11-02 Keith Seitz * jvmti.cc (_Jv_JVMTI_GetLineNumberTable): New function. diff --git a/libjava/gnu/classpath/jdwp/natVMMethod.cc b/libjava/gnu/classpath/jdwp/natVMMethod.cc index eb1d6fda0c2..7dea4747731 100644 --- a/libjava/gnu/classpath/jdwp/natVMMethod.cc +++ b/libjava/gnu/classpath/jdwp/natVMMethod.cc @@ -10,8 +10,10 @@ details. */ #include #include +#include #include +#include #include #include @@ -33,10 +35,44 @@ gnu::classpath::jdwp::VMMethod::getModifiers () return 0; } -gnu::classpath::jdwp::util::LineTable* +gnu::classpath::jdwp::util::LineTable * gnu::classpath::jdwp::VMMethod::getLineTable () { - return NULL; + if (!_Jv_IsInterpretedClass (getDeclaringClass ())) + { + // this should not happen + ::java::lang::String *msg = JvNewStringLatin1 ("native class"); + throw new exception::JdwpInternalErrorException (msg); + } + + jmethodID desired_method = reinterpret_cast (_methodId); + + _Jv_MethodBase *theMethod + = _Jv_FindInterpreterMethod (getDeclaringClass (), desired_method); + + if (theMethod == NULL) + { + // this should not happen + ::java::lang::String *msg + = JvNewStringLatin1 ("could not find method in class"); + throw new exception::JdwpInternalErrorException (msg); + } + + if (::java::lang::reflect::Modifier::isNative (desired_method->accflags)) + { + jintArray lines = JvNewIntArray (0); + jlongArray indices = JvNewLongArray (0); + return new util::LineTable (-1, -1, lines, indices); + } + + // get the linetable + _Jv_InterpMethod *imeth = reinterpret_cast<_Jv_InterpMethod *> (theMethod); + jlong start; + jlong end; + jintArray lines; + jlongArray indices; + imeth->get_line_table (start, end, lines, indices); + return new util::LineTable (start, end, lines, indices); }