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.
#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>
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);
}