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