This is the mail archive of the java-patches@gcc.gnu.org mailing list for the Java project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[RFA/JVMTI] GetMethodName


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]));
+    }
+}

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]