From c3eaf28fd1b4875d0d7aa8bb6f6a470bd013fb87 Mon Sep 17 00:00:00 2001 From: kseitz Date: Thu, 25 Jan 2007 18:04:01 +0000 Subject: [PATCH] * 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@121179 138bc75d-0d04-0410-961f-82ee72b054a4 --- libjava/ChangeLog | 8 ++ libjava/jvmti.cc | 44 +++++++- libjava/testsuite/libjava.jvmti/getmethodname.java | 10 ++ libjava/testsuite/libjava.jvmti/getmethodname.out | 59 +++++++++++ .../testsuite/libjava.jvmti/natgetmethodname.cc | 116 +++++++++++++++++++++ 5 files changed, 236 insertions(+), 1 deletion(-) create mode 100644 libjava/testsuite/libjava.jvmti/getmethodname.java create mode 100644 libjava/testsuite/libjava.jvmti/getmethodname.out create mode 100644 libjava/testsuite/libjava.jvmti/natgetmethodname.cc diff --git a/libjava/ChangeLog b/libjava/ChangeLog index 6e01312..6552705 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,11 @@ +2007-01-25 Keith Seitz + + * 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 * libjava/testsuite/libjava.jvmti/jvmti-interp.exp: New file. diff --git a/libjava/jvmti.cc b/libjava/jvmti.cc index 69cfda5..f732984 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 (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 (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 0000000..a0e00a9 --- /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 0000000..3f1a9ca --- /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 0000000..3d759d5 --- /dev/null +++ b/libjava/testsuite/libjava.jvmti/natgetmethodname.cc @@ -0,0 +1,116 @@ +#include + +#include +#include +#include + +#include + +#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 (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 (&env), JVMTI_VERSION_1_0); + + jvmtiError err; + err = env->GetMethodName (reinterpret_cast (NULL), + reinterpret_cast (NULL), + reinterpret_cast (NULL), + reinterpret_cast (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 (names[i])); + env->Deallocate (reinterpret_cast (solo_names[i])); + env->Deallocate (reinterpret_cast (signatures[i])); + env->Deallocate (reinterpret_cast (solo_signatures[i])); + env->Deallocate (reinterpret_cast (generics[i])); + env->Deallocate (reinterpret_cast (solo_generics[i])); + } +} -- 2.7.4