summaryrefslogtreecommitdiff
path: root/libjava/testsuite/libjava.jvmti/natgetmethodname.cc
blob: 3d759d58dd48c094c3be14d17c138e6e06a69ac2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
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]));
    }
}