1 #include <jvmti.h>
2 #include <tijmp.h>
3 #include <tag_list.h>
4
5 extern jvmtiEnv* jvmti;
6
is_tijmp_class(jlong tag,tag_list * tl)7 jint is_tijmp_class (jlong tag, tag_list* tl) {
8 jint i;
9 for (i = 0; i < tl->next_pos; i++)
10 if (tag == tl->tags[i])
11 return 1;
12 return 0;
13 }
14
find_tijmp_classes(JNIEnv * env,tag_list * tijmp_classes)15 void find_tijmp_classes (JNIEnv* env, tag_list* tijmp_classes) {
16 jvmtiError err;
17 jint class_count;
18 jclass* classes;
19 jclass cls;
20 jint i, j;
21 jmethodID get_name;
22 jsize len;
23 jchar tijmp_chars[] = {'t', 'i', 'j', 'm', 'p', '.'};
24
25 cls = (*env)->FindClass (env, "java/lang/Class");
26 get_name = (*env)->GetMethodID (env, cls, "getName",
27 "()Ljava/lang/String;");
28 err = (*jvmti)->GetLoadedClasses (jvmti, &class_count, &classes);
29 for (i = 0; i < class_count; i++) {
30 jstring s = (*env)->CallObjectMethod (env, classes[i], get_name);
31 len = (*env)->GetStringLength (env, s);
32 if (len > 5) {
33 const jchar* chars = (*env)->GetStringCritical (env, s, NULL);
34 for (j = 0; j < 6; j++) {
35 if (chars[j] != tijmp_chars[j])
36 break;
37 }
38 (*env)->ReleaseStringCritical (env, s, chars);
39 if (j == 6) {
40 jlong tag;
41 err = (*jvmti)->GetTag (jvmti, classes[i], &tag);
42 add_tag (tijmp_classes, tag);
43 }
44 }
45 }
46 (*jvmti)->Deallocate (jvmti, (unsigned char*)classes);
47 }
48