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