aboutsummaryrefslogtreecommitdiff
path: root/libjava
diff options
context:
space:
mode:
authorKeith Seitz <keiths@redhat.com>2006-11-02 17:01:01 +0000
committerKeith Seitz <kseitz@gcc.gnu.org>2006-11-02 17:01:01 +0000
commit4cb1c1c3965ebfe93001af017164066506454ebd (patch)
treec873400782a835ca01b0875ee3b7622f21122be8 /libjava
parent081070150cf25a38e0b683af43244ed27723d1dc (diff)
downloadgcc-4cb1c1c3965ebfe93001af017164066506454ebd.zip
gcc-4cb1c1c3965ebfe93001af017164066506454ebd.tar.gz
gcc-4cb1c1c3965ebfe93001af017164066506454ebd.tar.bz2
* gnu/classpath/jdwp/natVMMethod.cc (getLineTable): Implement.
From-SVN: r118420
Diffstat (limited to 'libjava')
-rw-r--r--libjava/ChangeLog4
-rw-r--r--libjava/gnu/classpath/jdwp/natVMMethod.cc40
2 files changed, 42 insertions, 2 deletions
diff --git a/libjava/ChangeLog b/libjava/ChangeLog
index e8348a0..cdbf3da 100644
--- a/libjava/ChangeLog
+++ b/libjava/ChangeLog
@@ -1,5 +1,9 @@
2006-11-02 Keith Seitz <keiths@redhat.com>
+ * gnu/classpath/jdwp/natVMMethod.cc (getLineTable): Implement.
+
+2006-11-02 Keith Seitz <keiths@redhat.com>
+
* jvmti.cc (_Jv_JVMTI_GetLineNumberTable): New function.
(_Jv_JVMTI_Interface): Define GetLineNumberTable.
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);
}