[RFA/JVMTI] GetMethodName
Keith Seitz
keiths@redhat.com
Fri Jan 12 01:43:00 GMT 2007
Post-merge ping.
Keith
Keith Seitz wrote:
> Hi,
>
> The attached patch implements most of the JVMTI call GetMethodName,
> which has three uses. It can be used to fetch any of the method name,
> method signature, and/or generic signature. I have not implemented the
> last of these, since I believe there is no way to test this in the trunk
> right now. [Is that correct? My simple generic testcases don't build
> using trunk. Please correct me if I am mistaken.]
>
> Keith
>
> ChangeLog
> 2006-11-07 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.
>
>
> ------------------------------------------------------------------------
>
> Index: jvmti.cc
> ===================================================================
> --- jvmti.cc (revision 118419)
> +++ jvmti.cc (working copy)
> @@ -493,6 +493,48 @@
> }
>
> 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)
> {
> @@ -1422,7 +1464,7 @@
> 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
> Index: testsuite/libjava.jvmti/getmethodname.java
> ===================================================================
> --- testsuite/libjava.jvmti/getmethodname.java (revision 0)
> +++ testsuite/libjava.jvmti/getmethodname.java (revision 0)
> @@ -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 ();
> + }
> +}
> Index: testsuite/libjava.jvmti/getmethodname.out
> ===================================================================
> --- testsuite/libjava.jvmti/getmethodname.out (revision 0)
> +++ testsuite/libjava.jvmti/getmethodname.out (revision 0)
> @@ -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
> Index: testsuite/libjava.jvmti/natgetmethodname.cc
> ===================================================================
> --- testsuite/libjava.jvmti/natgetmethodname.cc (revision 0)
> +++ testsuite/libjava.jvmti/natgetmethodname.cc (revision 0)
> @@ -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]));
> + }
> +}
More information about the Java-patches
mailing list