diff options
author | Keith Seitz <keiths@redhat.com> | 2006-11-02 17:01:01 +0000 |
---|---|---|
committer | Keith Seitz <kseitz@gcc.gnu.org> | 2006-11-02 17:01:01 +0000 |
commit | 4cb1c1c3965ebfe93001af017164066506454ebd (patch) | |
tree | c873400782a835ca01b0875ee3b7622f21122be8 /libjava/gnu/classpath/jdwp | |
parent | 081070150cf25a38e0b683af43244ed27723d1dc (diff) | |
download | gcc-4cb1c1c3965ebfe93001af017164066506454ebd.zip gcc-4cb1c1c3965ebfe93001af017164066506454ebd.tar.gz gcc-4cb1c1c3965ebfe93001af017164066506454ebd.tar.bz2 |
* gnu/classpath/jdwp/natVMMethod.cc (getLineTable): Implement.
From-SVN: r118420
Diffstat (limited to 'libjava/gnu/classpath/jdwp')
-rw-r--r-- | libjava/gnu/classpath/jdwp/natVMMethod.cc | 40 |
1 files changed, 38 insertions, 2 deletions
diff --git a/libjava/gnu/classpath/jdwp/natVMMethod.cc b/libjava/gnu/classpath/jdwp/natVMMethod.cc index eb1d6fd..7dea474 100644 --- a/libjava/gnu/classpath/jdwp/natVMMethod.cc +++ b/libjava/gnu/classpath/jdwp/natVMMethod.cc @@ -10,8 +10,10 @@ details. */ #include <config.h> #include <gcj/cni.h> +#include <java-interp.h> #include <gnu/classpath/jdwp/VMMethod.h> +#include <gnu/classpath/jdwp/exception/JdwpInternalErrorException.h> #include <gnu/classpath/jdwp/util/LineTable.h> #include <gnu/classpath/jdwp/util/VariableTable.h> @@ -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<jmethodID> (_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); } |