summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libjava/ChangeLog8
-rw-r--r--libjava/jvmti.cc44
-rw-r--r--libjava/testsuite/libjava.jvmti/getmethodname.java10
-rw-r--r--libjava/testsuite/libjava.jvmti/getmethodname.out59
-rw-r--r--libjava/testsuite/libjava.jvmti/natgetmethodname.cc116
5 files changed, 236 insertions, 1 deletions
diff --git a/libjava/ChangeLog b/libjava/ChangeLog
index 6e013123548..655270591b5 100644
--- a/libjava/ChangeLog
+++ b/libjava/ChangeLog
@@ -1,3 +1,11 @@
+2007-01-25 Keith Seitz <keiths@redhat.com>
+
+ * jvmti.cc (_Jv_JVMTI_GetMethodName): New function.
+ (_Jv_JVMTI_Interface): Define GetMethodName.
+ * testsuite/libjava.jvmti/getmethodname.java: New file.
+ * testsuite/libjava.jvmti/natgetmethodname.cc: New file.
+ * testsuite/libjava.jvmti/getmethodname.out: New file.
+
2007-01-24 Kyle Galloway <kgallowa@redhat.com>
* libjava/testsuite/libjava.jvmti/jvmti-interp.exp: New file.
diff --git a/libjava/jvmti.cc b/libjava/jvmti.cc
index 69cfda5ae75..f7329841747 100644
--- a/libjava/jvmti.cc
+++ b/libjava/jvmti.cc
@@ -568,6 +568,48 @@ _Jv_JVMTI_IsFieldSynthetic (MAYBE_UNUSED jvmtiEnv *env, jclass klass,
}
static jvmtiError JNICALL
+_Jv_JVMTI_GetMethodName (MAYBE_UNUSED jvmtiEnv *env, jmethodID method,
+ char **name_ptr, char **signature_ptr,
+ char **generic_ptr)
+{
+ REQUIRE_PHASE (env, JVMTI_PHASE_START | JVMTI_PHASE_LIVE);
+
+ if (method == NULL)
+ return JVMTI_ERROR_INVALID_METHODID;
+
+ if (name_ptr != NULL)
+ {
+ int len = static_cast<int> (method->name->len ());
+ *name_ptr = (char *) _Jv_MallocUnchecked (len + 1);
+ if (*name_ptr == NULL)
+ return JVMTI_ERROR_OUT_OF_MEMORY;
+ strncpy (*name_ptr, method->name->chars (), len);
+ (*name_ptr)[len] = '\0';
+ }
+
+ if (signature_ptr != NULL)
+ {
+ int len = static_cast<int> (method->signature->len ());
+ *signature_ptr = (char *) _Jv_MallocUnchecked (len + 1);
+ if (*signature_ptr == NULL)
+ {
+ if (name_ptr != NULL)
+ _Jv_Free (*name_ptr);
+ return JVMTI_ERROR_OUT_OF_MEMORY;
+ }
+ strncpy (*signature_ptr, method->signature->chars (), len);
+ (*signature_ptr)[len] = '\0';
+ }
+
+ if (generic_ptr != NULL)
+ {
+ *generic_ptr = NULL;
+ }
+
+ return JVMTI_ERROR_NONE;
+}
+
+static jvmtiError JNICALL
_Jv_JVMTI_GetMethodModifiers (MAYBE_UNUSED jvmtiEnv *env, jmethodID method,
jint *result)
{
@@ -1497,7 +1539,7 @@ struct _Jv_jvmtiEnv _Jv_JVMTI_Interface =
UNIMPLEMENTED, // GetFieldDeclaringClass
_Jv_JVMTI_GetFieldModifiers, // GetFieldModifiers
_Jv_JVMTI_IsFieldSynthetic, // IsFieldSynthetic
- UNIMPLEMENTED, // GetMethodName
+ _Jv_JVMTI_GetMethodName, // GetMethodName
_Jv_JVMTI_GetMethodDeclaringClass, // GetMethodDeclaringClass
_Jv_JVMTI_GetMethodModifiers, // GetMethodModifers
RESERVED, // reserved67
diff --git a/libjava/testsuite/libjava.jvmti/getmethodname.java b/libjava/testsuite/libjava.jvmti/getmethodname.java
new file mode 100644
index 00000000000..a0e00a98c11
--- /dev/null
+++ b/libjava/testsuite/libjava.jvmti/getmethodname.java
@@ -0,0 +1,10 @@
+public class getmethodname
+{
+ public static native void do_getmethodname_tests ();
+
+ public static void main (String[] args)
+ {
+ System.out.println ("JVMTI GetMethodName tests");
+ do_getmethodname_tests ();
+ }
+}
diff --git a/libjava/testsuite/libjava.jvmti/getmethodname.out b/libjava/testsuite/libjava.jvmti/getmethodname.out
new file mode 100644
index 00000000000..3f1a9ca148b
--- /dev/null
+++ b/libjava/testsuite/libjava.jvmti/getmethodname.out
@@ -0,0 +1,59 @@
+JVMTI GetMethodName tests
+null jmethodID: invalid method ID
+GetClassMethods: none
+GetMethodName - name: none
+GetMethodName - signature: none
+GetMethodName - generic: none
+GetMethodName - name: none
+GetMethodName - signature: none
+GetMethodName - generic: none
+GetMethodName - name: none
+GetMethodName - signature: none
+GetMethodName - generic: none
+GetMethodName - name: none
+GetMethodName - signature: none
+GetMethodName - generic: none
+GetMethodName - name: none
+GetMethodName - signature: none
+GetMethodName - generic: none
+GetMethodName - name: none
+GetMethodName - signature: none
+GetMethodName - generic: none
+GetMethodName - name: none
+GetMethodName - signature: none
+GetMethodName - generic: none
+GetMethodName - name: none
+GetMethodName - signature: none
+GetMethodName - generic: none
+name=clone, signature=()Ljava.lang.Object;, generic=null
+names match
+signatures match
+generic not yet
+name=equals, signature=(Ljava.lang.Object;)Z, generic=null
+names match
+signatures match
+generic not yet
+name=finalize, signature=()V, generic=null
+names match
+signatures match
+generic not yet
+name=getClass, signature=()Ljava.lang.Class;, generic=null
+names match
+signatures match
+generic not yet
+name=hashCode, signature=()I, generic=null
+names match
+signatures match
+generic not yet
+name=notify, signature=()V, generic=null
+names match
+signatures match
+generic not yet
+name=notifyAll, signature=()V, generic=null
+names match
+signatures match
+generic not yet
+name=toString, signature=()Ljava.lang.String;, generic=null
+names match
+signatures match
+generic not yet
diff --git a/libjava/testsuite/libjava.jvmti/natgetmethodname.cc b/libjava/testsuite/libjava.jvmti/natgetmethodname.cc
new file mode 100644
index 00000000000..3d759d58dd4
--- /dev/null
+++ b/libjava/testsuite/libjava.jvmti/natgetmethodname.cc
@@ -0,0 +1,116 @@
+#include <gcj/cni.h>
+
+#include <jvm.h>
+#include <jvmti.h>
+#include <stdio.h>
+
+#include <java/lang/Object.h>
+
+#include "getmethodname.h"
+
+static void
+print_error (jvmtiEnv *env, const char *msg, jvmtiError err)
+{
+ char *error_msg;
+ env->GetErrorName (err, &error_msg);
+ printf ("%s: %s\n", msg, error_msg);
+ env->Deallocate (reinterpret_cast<unsigned char *> (error_msg));
+}
+
+#define NUM_METHODS 8
+static const char *function_names[] = { "clone",
+ "equals",
+ "finalize",
+ "getClass",
+ "hashCode",
+ "notify",
+ "notifyAll",
+ "toString" };
+static int
+function_index (const char *name)
+{
+ for (int i = 0; i < NUM_METHODS; ++i)
+ {
+ if (strcmp (function_names[i], name) == 0)
+ return i;
+ }
+
+ return -1;
+}
+
+void
+getmethodname::do_getmethodname_tests ()
+{
+ jvmtiEnv *env;
+ JavaVM *vm = _Jv_GetJavaVM ();
+ vm->GetEnv (reinterpret_cast<void **> (&env), JVMTI_VERSION_1_0);
+
+ jvmtiError err;
+ err = env->GetMethodName (reinterpret_cast<jmethodID> (NULL),
+ reinterpret_cast<char **> (NULL),
+ reinterpret_cast<char **> (NULL),
+ reinterpret_cast<char **> (NULL));
+ print_error (env, "null jmethodID", err);
+
+ jint count;
+ jmethodID *methods;
+ err = env->GetClassMethods (&java::lang::Object::class$, &count, &methods);
+ print_error (env, "GetClassMethods", err);
+
+ char *names[NUM_METHODS], *solo_names[NUM_METHODS];
+ char *signatures[NUM_METHODS], *solo_signatures[NUM_METHODS];
+ char *generics[NUM_METHODS], *solo_generics[NUM_METHODS];
+
+ for (jint i = 0; i < count; ++i)
+ {
+ char *name, *n;
+ char *signature, *s;
+ char *generic, *g;
+ err = env->GetMethodName (methods[i], &name, &signature, &generic);
+
+ int idx = -1;
+ if (err != JVMTI_ERROR_NONE)
+ {
+ print_error (env, "GetMethodName - all fields", err);
+ continue;
+ }
+
+ idx = function_index (name);
+ if (idx == -1)
+ continue;
+
+ names[idx] = name;
+ signatures[idx] = signature;
+ generics[idx] = generic;
+
+ err = env->GetMethodName (methods[i], &n, NULL, NULL);
+ print_error (env, "GetMethodName - name", err);
+ solo_names[idx] = n;
+
+ err = env->GetMethodName (methods[i], NULL, &s, NULL);
+ print_error (env, "GetMethodName - signature", err);
+ solo_signatures[idx] = s;
+
+ err = env->GetMethodName (methods[i], NULL, NULL, &g);
+ print_error (env, "GetMethodName - generic", err);
+ solo_generics[idx] = g;
+ }
+
+#define WRAP(X) ((X) == NULL ? "null" : (X))
+#define MATCH(X,Y) (strcmp ((X),(Y)) == 0 ? "match" : "do not match")
+ for (int i = 0; i < NUM_METHODS; ++i)
+ {
+ printf ("name=%s, signature=%s, generic=%s\n",
+ WRAP (names[i]), WRAP (signatures[i]), WRAP (generics[i]));
+ printf ("names %s\n", MATCH (solo_names[i], names[i]));
+ printf ("signatures %s\n", MATCH (solo_signatures[i], signatures[i]));
+ printf ("generic %s\n", "not yet");
+
+ env->Deallocate (reinterpret_cast<unsigned char *> (names[i]));
+ env->Deallocate (reinterpret_cast<unsigned char *> (solo_names[i]));
+ env->Deallocate (reinterpret_cast<unsigned char *> (signatures[i]));
+ env->Deallocate (reinterpret_cast<unsigned char *> (solo_signatures[i]));
+ env->Deallocate (reinterpret_cast<unsigned char *> (generics[i]));
+ env->Deallocate (reinterpret_cast<unsigned char *> (solo_generics[i]));
+ }
+}