--- /dev/null
+/* AbsentInformationException.java -- information not present exception
+ Copyright (C) 2007 Free Software Foundation
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.classpath.jdwp.exception;
+
+import gnu.classpath.jdwp.JdwpConstants;
+
+/**
+ * An exception thrown when the requested information is not available.
+ *
+ * @author Kyle Galloway (kgallowa@redhat.com)
+ */
+public class AbsentInformationException
+ extends JdwpException
+{
+ public AbsentInformationException(String str)
+ {
+ super(JdwpConstants.Error.ABSENT_INFORMATION, str);
+ }
+}
#include "jvmti-int.h"
#include <gnu/classpath/jdwp/VMMethod.h>
+#include <gnu/classpath/jdwp/exception/AbsentInformationException.h>
+#include <gnu/classpath/jdwp/exception/InvalidMethodException.h>
#include <gnu/classpath/jdwp/exception/JdwpInternalErrorException.h>
#include <gnu/classpath/jdwp/util/LineTable.h>
#include <gnu/classpath/jdwp/util/VariableTable.h>
+using namespace java::lang;
+
+#define CHECK_INTERP_CLASS() \
+do \
+ { \
+ if (!_Jv_IsInterpretedClass (getDeclaringClass ())) \
+ { \
+ ::java::lang::String *msg = JvNewStringLatin1 ("native class"); \
+ throw new exception::JdwpInternalErrorException (msg); \
+ } \
+ } \
+while (0)
+
jstring
gnu::classpath::jdwp::VMMethod::getName ()
{
gnu::classpath::jdwp::util::LineTable *
gnu::classpath::jdwp::VMMethod::getLineTable ()
{
- if (!_Jv_IsInterpretedClass (getDeclaringClass ()))
- {
- // this should not happen
- ::java::lang::String *msg = JvNewStringLatin1 ("native class");
- throw new exception::JdwpInternalErrorException (msg);
- }
+ CHECK_INTERP_CLASS ();
jmethodID desired_method = reinterpret_cast<jmethodID> (_methodId);
gnu::classpath::jdwp::util::VariableTable*
gnu::classpath::jdwp::VMMethod::getVariableTable ()
{
- return NULL;
+ using namespace gnu::classpath::jdwp::util;
+
+ jvmtiEnv *env = _Jv_GetJDWP_JVMTIEnv ();
+
+ CHECK_INTERP_CLASS ();
+
+ jmethodID meth = reinterpret_cast<jmethodID> (_methodId);
+ jvmtiLocalVariableEntry *var_table;
+ jint num_slots, args_len;
+
+ jvmtiError jerr = env->GetLocalVariableTable (meth, &num_slots, &var_table);
+
+ if (jerr != JVMTI_ERROR_NONE)
+ goto error;
+
+ jerr = env->GetArgumentsSize (meth, &args_len);
+
+ if (jerr != JVMTI_ERROR_NONE)
+ {
+ error:
+ using namespace gnu::classpath::jdwp::exception;
+ char *error;
+ env->GetErrorName (jerr, &error);
+ String *msg = JvNewStringUTF (error);
+ env->Deallocate (reinterpret_cast<unsigned char *> (error));
+
+ if (jerr == JVMTI_ERROR_NATIVE_METHOD)
+ throw new AbsentInformationException (msg);
+ else if (jerr == JVMTI_ERROR_INVALID_METHODID)
+ throw new InvalidMethodException (_methodId);
+ else
+ throw new JdwpInternalErrorException (msg);
+ }
+
+ jlongArray start_pcs = JvNewLongArray (num_slots);
+ jlong *start_pcs_ptr = elements (start_pcs);
+ jintArray lengths = JvNewIntArray (num_slots);
+ jint *lengths_ptr = elements (lengths);
+ jintArray slots = JvNewIntArray (num_slots);
+ jint *slots_ptr = elements (slots);
+ JArray<String *> *names = reinterpret_cast<JArray<String *> *>
+ (JvNewObjectArray (num_slots,
+ &String::class$, NULL));
+ jstring *names_ptr = elements (names);
+ JArray<String *> *signatures = reinterpret_cast<JArray<String *> *>
+ (JvNewObjectArray (num_slots,
+ &String::class$, NULL));
+ jstring *signatures_ptr = elements (signatures);
+
+ // Get the information out of the JVMTI strucutre and Deallocate the strings.
+ for (int i = 0; i < num_slots; i++)
+ {
+ start_pcs_ptr[i] = var_table[i].start_location;
+ lengths_ptr[i] = var_table[i].length;
+ slots_ptr[i] = var_table[i].slot;
+ names_ptr[i] = JvNewStringUTF (var_table[i].name);
+ env->Deallocate (reinterpret_cast<unsigned char *>
+ (var_table[i].name));
+ signatures_ptr[i] = JvNewStringUTF (var_table[i].signature);
+ env->Deallocate (reinterpret_cast<unsigned char *>
+ (var_table[i].signature));
+ env->Deallocate (reinterpret_cast<unsigned char *>
+ (var_table[i].generic_signature));
+ }
+
+ // Now Deallocate the table since it's strings have already been freed.
+ env->Deallocate (reinterpret_cast<unsigned char *> (var_table));
+
+ // Create the new JDWP VariableTable to return with the now filled arrays.
+ VariableTable* jdwp_vtable = new VariableTable (args_len, num_slots,
+ start_pcs, names, signatures,
+ lengths, slots);
+
+ return jdwp_vtable;
}