File: | jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c |
Warning: | line 56, column 10 Dereference of null pointer (loaded from variable 'pobj') |
Press '?' to see keyboard shortcuts
Keyboard shortcuts:
1 | /* | |||
2 | * Copyright (c) 1998, 2021, Oracle and/or its affiliates. All rights reserved. | |||
3 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |||
4 | * | |||
5 | * This code is free software; you can redistribute it and/or modify it | |||
6 | * under the terms of the GNU General Public License version 2 only, as | |||
7 | * published by the Free Software Foundation. Oracle designates this | |||
8 | * particular file as subject to the "Classpath" exception as provided | |||
9 | * by Oracle in the LICENSE file that accompanied this code. | |||
10 | * | |||
11 | * This code is distributed in the hope that it will be useful, but WITHOUT | |||
12 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |||
13 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |||
14 | * version 2 for more details (a copy is included in the LICENSE file that | |||
15 | * accompanied this code). | |||
16 | * | |||
17 | * You should have received a copy of the GNU General Public License version | |||
18 | * 2 along with this work; if not, write to the Free Software Foundation, | |||
19 | * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |||
20 | * | |||
21 | * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |||
22 | * or visit www.oracle.com if you need additional information or have any | |||
23 | * questions. | |||
24 | */ | |||
25 | ||||
26 | #include <ctype.h> | |||
27 | ||||
28 | #include "util.h" | |||
29 | #include "utf_util.h" | |||
30 | #include "transport.h" | |||
31 | #include "eventHandler.h" | |||
32 | #include "threadControl.h" | |||
33 | #include "outStream.h" | |||
34 | #include "inStream.h" | |||
35 | #include "invoker.h" | |||
36 | #include "signature.h" | |||
37 | ||||
38 | ||||
39 | /* Global data area */ | |||
40 | BackendGlobalData *gdata = NULL((void*)0); | |||
41 | ||||
42 | /* Forward declarations */ | |||
43 | static jboolean isInterface(jclass clazz); | |||
44 | static jboolean isArrayClass(jclass clazz); | |||
45 | static char * getPropertyUTF8(JNIEnv *env, char *propertyName); | |||
46 | ||||
47 | /* Save an object reference for use later (create a NewGlobalRef) */ | |||
48 | void | |||
49 | saveGlobalRef(JNIEnv *env, jobject obj, jobject *pobj) | |||
50 | { | |||
51 | jobject newobj; | |||
52 | ||||
53 | if ( pobj == NULL((void*)0) ) { | |||
54 | EXIT_ERROR(AGENT_ERROR_ILLEGAL_ARGUMENT,"saveGlobalRef pobj"){ print_message(stderr, "JDWP exit error ", "\n", "%s(%d): %s [%s:%d]" , jvmtiErrorText((jvmtiError)((jvmtiError)(JVMTI_ERROR_MAX+64 +22))), ((jvmtiError)(JVMTI_ERROR_MAX+64+22)), ("saveGlobalRef pobj" ==((void*)0)?"":"saveGlobalRef pobj"), "/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" , 54); debugInit_exit((jvmtiError)((jvmtiError)(JVMTI_ERROR_MAX +64+22)), "saveGlobalRef pobj"); }; | |||
55 | } | |||
56 | if ( *pobj != NULL((void*)0) ) { | |||
| ||||
57 | EXIT_ERROR(AGENT_ERROR_ILLEGAL_ARGUMENT,"saveGlobalRef *pobj"){ print_message(stderr, "JDWP exit error ", "\n", "%s(%d): %s [%s:%d]" , jvmtiErrorText((jvmtiError)((jvmtiError)(JVMTI_ERROR_MAX+64 +22))), ((jvmtiError)(JVMTI_ERROR_MAX+64+22)), ("saveGlobalRef *pobj" ==((void*)0)?"":"saveGlobalRef *pobj"), "/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" , 57); debugInit_exit((jvmtiError)((jvmtiError)(JVMTI_ERROR_MAX +64+22)), "saveGlobalRef *pobj"); }; | |||
58 | } | |||
59 | if ( env == NULL((void*)0) ) { | |||
60 | EXIT_ERROR(AGENT_ERROR_ILLEGAL_ARGUMENT,"saveGlobalRef env"){ print_message(stderr, "JDWP exit error ", "\n", "%s(%d): %s [%s:%d]" , jvmtiErrorText((jvmtiError)((jvmtiError)(JVMTI_ERROR_MAX+64 +22))), ((jvmtiError)(JVMTI_ERROR_MAX+64+22)), ("saveGlobalRef env" ==((void*)0)?"":"saveGlobalRef env"), "/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" , 60); debugInit_exit((jvmtiError)((jvmtiError)(JVMTI_ERROR_MAX +64+22)), "saveGlobalRef env"); }; | |||
61 | } | |||
62 | if ( obj == NULL((void*)0) ) { | |||
63 | EXIT_ERROR(AGENT_ERROR_ILLEGAL_ARGUMENT,"saveGlobalRef obj"){ print_message(stderr, "JDWP exit error ", "\n", "%s(%d): %s [%s:%d]" , jvmtiErrorText((jvmtiError)((jvmtiError)(JVMTI_ERROR_MAX+64 +22))), ((jvmtiError)(JVMTI_ERROR_MAX+64+22)), ("saveGlobalRef obj" ==((void*)0)?"":"saveGlobalRef obj"), "/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" , 63); debugInit_exit((jvmtiError)((jvmtiError)(JVMTI_ERROR_MAX +64+22)), "saveGlobalRef obj"); }; | |||
64 | } | |||
65 | newobj = JNI_FUNC_PTR(env,NewGlobalRef)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,65), log_message_end ("%s()","NewGlobalRef")):((void)0)), (env ))))->NewGlobalRef))(env, obj); | |||
66 | if ( newobj == NULL((void*)0) ) { | |||
67 | EXIT_ERROR(AGENT_ERROR_NULL_POINTER,"NewGlobalRef"){ print_message(stderr, "JDWP exit error ", "\n", "%s(%d): %s [%s:%d]" , jvmtiErrorText((jvmtiError)((jvmtiError)(JVMTI_ERROR_MAX+64 +21))), ((jvmtiError)(JVMTI_ERROR_MAX+64+21)), ("NewGlobalRef" ==((void*)0)?"":"NewGlobalRef"), "/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" , 67); debugInit_exit((jvmtiError)((jvmtiError)(JVMTI_ERROR_MAX +64+21)), "NewGlobalRef"); }; | |||
68 | } | |||
69 | *pobj = newobj; | |||
70 | } | |||
71 | ||||
72 | /* Toss a previously saved object reference */ | |||
73 | void | |||
74 | tossGlobalRef(JNIEnv *env, jobject *pobj) | |||
75 | { | |||
76 | jobject obj; | |||
77 | ||||
78 | if ( pobj == NULL((void*)0) ) { | |||
79 | EXIT_ERROR(AGENT_ERROR_ILLEGAL_ARGUMENT,"tossGlobalRef pobj"){ print_message(stderr, "JDWP exit error ", "\n", "%s(%d): %s [%s:%d]" , jvmtiErrorText((jvmtiError)((jvmtiError)(JVMTI_ERROR_MAX+64 +22))), ((jvmtiError)(JVMTI_ERROR_MAX+64+22)), ("tossGlobalRef pobj" ==((void*)0)?"":"tossGlobalRef pobj"), "/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" , 79); debugInit_exit((jvmtiError)((jvmtiError)(JVMTI_ERROR_MAX +64+22)), "tossGlobalRef pobj"); }; | |||
80 | } | |||
81 | obj = *pobj; | |||
82 | if ( env == NULL((void*)0) ) { | |||
83 | EXIT_ERROR(AGENT_ERROR_ILLEGAL_ARGUMENT,"tossGlobalRef env"){ print_message(stderr, "JDWP exit error ", "\n", "%s(%d): %s [%s:%d]" , jvmtiErrorText((jvmtiError)((jvmtiError)(JVMTI_ERROR_MAX+64 +22))), ((jvmtiError)(JVMTI_ERROR_MAX+64+22)), ("tossGlobalRef env" ==((void*)0)?"":"tossGlobalRef env"), "/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" , 83); debugInit_exit((jvmtiError)((jvmtiError)(JVMTI_ERROR_MAX +64+22)), "tossGlobalRef env"); }; | |||
84 | } | |||
85 | if ( obj == NULL((void*)0) ) { | |||
86 | EXIT_ERROR(AGENT_ERROR_NULL_POINTER,"tossGlobalRef obj"){ print_message(stderr, "JDWP exit error ", "\n", "%s(%d): %s [%s:%d]" , jvmtiErrorText((jvmtiError)((jvmtiError)(JVMTI_ERROR_MAX+64 +21))), ((jvmtiError)(JVMTI_ERROR_MAX+64+21)), ("tossGlobalRef obj" ==((void*)0)?"":"tossGlobalRef obj"), "/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" , 86); debugInit_exit((jvmtiError)((jvmtiError)(JVMTI_ERROR_MAX +64+21)), "tossGlobalRef obj"); }; | |||
87 | } | |||
88 | JNI_FUNC_PTR(env,DeleteGlobalRef)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,88), log_message_end ("%s()","DeleteGlobalRef")):((void)0)), (env))))->DeleteGlobalRef))(env, obj); | |||
89 | *pobj = NULL((void*)0); | |||
90 | } | |||
91 | ||||
92 | jclass | |||
93 | findClass(JNIEnv *env, const char * name) | |||
94 | { | |||
95 | jclass x; | |||
96 | ||||
97 | if ( env
| |||
98 | EXIT_ERROR(AGENT_ERROR_ILLEGAL_ARGUMENT,"findClass env"){ print_message(stderr, "JDWP exit error ", "\n", "%s(%d): %s [%s:%d]" , jvmtiErrorText((jvmtiError)((jvmtiError)(JVMTI_ERROR_MAX+64 +22))), ((jvmtiError)(JVMTI_ERROR_MAX+64+22)), ("findClass env" ==((void*)0)?"":"findClass env"), "/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" , 98); debugInit_exit((jvmtiError)((jvmtiError)(JVMTI_ERROR_MAX +64+22)), "findClass env"); }; | |||
99 | } | |||
100 | if ( name
| |||
101 | EXIT_ERROR(AGENT_ERROR_ILLEGAL_ARGUMENT,"findClass name"){ print_message(stderr, "JDWP exit error ", "\n", "%s(%d): %s [%s:%d]" , jvmtiErrorText((jvmtiError)((jvmtiError)(JVMTI_ERROR_MAX+64 +22))), ((jvmtiError)(JVMTI_ERROR_MAX+64+22)), ("findClass name" ==((void*)0)?"":"findClass name"), "/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" , 101); debugInit_exit((jvmtiError)((jvmtiError)(JVMTI_ERROR_MAX +64+22)), "findClass name"); }; | |||
102 | } | |||
103 | x = JNI_FUNC_PTR(env,FindClass)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,103), log_message_end ("%s()","FindClass")):((void)0)), (env ))))->FindClass))(env, name); | |||
104 | if (x == NULL((void*)0)) { | |||
105 | ERROR_MESSAGE(("JDWP Can't find class %s", name))( ((gdata->log_flags & (0x00000080))?(log_message_begin ("ERROR","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,105), log_message_end ("JDWP Can't find class %s", name)):(( void)0)), error_message ("JDWP Can't find class %s", name) ); | |||
106 | EXIT_ERROR(AGENT_ERROR_NULL_POINTER,NULL){ print_message(stderr, "JDWP exit error ", "\n", "%s(%d): %s [%s:%d]" , jvmtiErrorText((jvmtiError)((jvmtiError)(JVMTI_ERROR_MAX+64 +21))), ((jvmtiError)(JVMTI_ERROR_MAX+64+21)), (((void*)0)==( (void*)0)?"":((void*)0)), "/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" , 106); debugInit_exit((jvmtiError)((jvmtiError)(JVMTI_ERROR_MAX +64+21)), ((void*)0)); }; | |||
107 | } | |||
108 | if ( JNI_FUNC_PTR(env,ExceptionOccurred)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,108), log_message_end ("%s()","ExceptionOccurred")):((void)0 )), (env))))->ExceptionOccurred))(env) ) { | |||
109 | ERROR_MESSAGE(("JDWP Exception occurred finding class %s", name))( ((gdata->log_flags & (0x00000080))?(log_message_begin ("ERROR","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,109), log_message_end ("JDWP Exception occurred finding class %s" , name)):((void)0)), error_message ("JDWP Exception occurred finding class %s" , name) ); | |||
110 | EXIT_ERROR(AGENT_ERROR_NULL_POINTER,NULL){ print_message(stderr, "JDWP exit error ", "\n", "%s(%d): %s [%s:%d]" , jvmtiErrorText((jvmtiError)((jvmtiError)(JVMTI_ERROR_MAX+64 +21))), ((jvmtiError)(JVMTI_ERROR_MAX+64+21)), (((void*)0)==( (void*)0)?"":((void*)0)), "/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" , 110); debugInit_exit((jvmtiError)((jvmtiError)(JVMTI_ERROR_MAX +64+21)), ((void*)0)); }; | |||
111 | } | |||
112 | return x; | |||
113 | } | |||
114 | ||||
115 | jmethodID | |||
116 | getMethod(JNIEnv *env, jclass clazz, const char * name, const char *signature) | |||
117 | { | |||
118 | jmethodID method; | |||
119 | ||||
120 | if ( env == NULL((void*)0) ) { | |||
121 | EXIT_ERROR(AGENT_ERROR_ILLEGAL_ARGUMENT,"getMethod env"){ print_message(stderr, "JDWP exit error ", "\n", "%s(%d): %s [%s:%d]" , jvmtiErrorText((jvmtiError)((jvmtiError)(JVMTI_ERROR_MAX+64 +22))), ((jvmtiError)(JVMTI_ERROR_MAX+64+22)), ("getMethod env" ==((void*)0)?"":"getMethod env"), "/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" , 121); debugInit_exit((jvmtiError)((jvmtiError)(JVMTI_ERROR_MAX +64+22)), "getMethod env"); }; | |||
122 | } | |||
123 | if ( clazz == NULL((void*)0) ) { | |||
124 | EXIT_ERROR(AGENT_ERROR_ILLEGAL_ARGUMENT,"getMethod clazz"){ print_message(stderr, "JDWP exit error ", "\n", "%s(%d): %s [%s:%d]" , jvmtiErrorText((jvmtiError)((jvmtiError)(JVMTI_ERROR_MAX+64 +22))), ((jvmtiError)(JVMTI_ERROR_MAX+64+22)), ("getMethod clazz" ==((void*)0)?"":"getMethod clazz"), "/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" , 124); debugInit_exit((jvmtiError)((jvmtiError)(JVMTI_ERROR_MAX +64+22)), "getMethod clazz"); }; | |||
125 | } | |||
126 | if ( name == NULL((void*)0) || name[0] == 0 ) { | |||
127 | EXIT_ERROR(AGENT_ERROR_ILLEGAL_ARGUMENT,"getMethod name"){ print_message(stderr, "JDWP exit error ", "\n", "%s(%d): %s [%s:%d]" , jvmtiErrorText((jvmtiError)((jvmtiError)(JVMTI_ERROR_MAX+64 +22))), ((jvmtiError)(JVMTI_ERROR_MAX+64+22)), ("getMethod name" ==((void*)0)?"":"getMethod name"), "/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" , 127); debugInit_exit((jvmtiError)((jvmtiError)(JVMTI_ERROR_MAX +64+22)), "getMethod name"); }; | |||
128 | } | |||
129 | if ( signature == NULL((void*)0) || signature[0] == 0 ) { | |||
130 | EXIT_ERROR(AGENT_ERROR_ILLEGAL_ARGUMENT,"getMethod signature"){ print_message(stderr, "JDWP exit error ", "\n", "%s(%d): %s [%s:%d]" , jvmtiErrorText((jvmtiError)((jvmtiError)(JVMTI_ERROR_MAX+64 +22))), ((jvmtiError)(JVMTI_ERROR_MAX+64+22)), ("getMethod signature" ==((void*)0)?"":"getMethod signature"), "/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" , 130); debugInit_exit((jvmtiError)((jvmtiError)(JVMTI_ERROR_MAX +64+22)), "getMethod signature"); }; | |||
131 | } | |||
132 | method = JNI_FUNC_PTR(env,GetMethodID)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,132), log_message_end ("%s()","GetMethodID")):((void)0)), (env ))))->GetMethodID))(env, clazz, name, signature); | |||
133 | if (method == NULL((void*)0)) { | |||
134 | ERROR_MESSAGE(("JDWP Can't find method %s with signature %s",( ((gdata->log_flags & (0x00000080))?(log_message_begin ("ERROR","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,135), log_message_end ("JDWP Can't find method %s with signature %s" , name, signature)):((void)0)), error_message ("JDWP Can't find method %s with signature %s" , name, signature) ) | |||
135 | name, signature))( ((gdata->log_flags & (0x00000080))?(log_message_begin ("ERROR","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,135), log_message_end ("JDWP Can't find method %s with signature %s" , name, signature)):((void)0)), error_message ("JDWP Can't find method %s with signature %s" , name, signature) ); | |||
136 | EXIT_ERROR(AGENT_ERROR_NULL_POINTER,NULL){ print_message(stderr, "JDWP exit error ", "\n", "%s(%d): %s [%s:%d]" , jvmtiErrorText((jvmtiError)((jvmtiError)(JVMTI_ERROR_MAX+64 +21))), ((jvmtiError)(JVMTI_ERROR_MAX+64+21)), (((void*)0)==( (void*)0)?"":((void*)0)), "/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" , 136); debugInit_exit((jvmtiError)((jvmtiError)(JVMTI_ERROR_MAX +64+21)), ((void*)0)); }; | |||
137 | } | |||
138 | if ( JNI_FUNC_PTR(env,ExceptionOccurred)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,138), log_message_end ("%s()","ExceptionOccurred")):((void)0 )), (env))))->ExceptionOccurred))(env) ) { | |||
139 | ERROR_MESSAGE(("JDWP Exception occurred finding method %s with signature %s",( ((gdata->log_flags & (0x00000080))?(log_message_begin ("ERROR","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,140), log_message_end ("JDWP Exception occurred finding method %s with signature %s" , name, signature)):((void)0)), error_message ("JDWP Exception occurred finding method %s with signature %s" , name, signature) ) | |||
140 | name, signature))( ((gdata->log_flags & (0x00000080))?(log_message_begin ("ERROR","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,140), log_message_end ("JDWP Exception occurred finding method %s with signature %s" , name, signature)):((void)0)), error_message ("JDWP Exception occurred finding method %s with signature %s" , name, signature) ); | |||
141 | EXIT_ERROR(AGENT_ERROR_NULL_POINTER,NULL){ print_message(stderr, "JDWP exit error ", "\n", "%s(%d): %s [%s:%d]" , jvmtiErrorText((jvmtiError)((jvmtiError)(JVMTI_ERROR_MAX+64 +21))), ((jvmtiError)(JVMTI_ERROR_MAX+64+21)), (((void*)0)==( (void*)0)?"":((void*)0)), "/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" , 141); debugInit_exit((jvmtiError)((jvmtiError)(JVMTI_ERROR_MAX +64+21)), ((void*)0)); }; | |||
142 | } | |||
143 | return method; | |||
144 | } | |||
145 | ||||
146 | static jmethodID | |||
147 | getStaticMethod(JNIEnv *env, jclass clazz, const char * name, const char *signature) | |||
148 | { | |||
149 | jmethodID method; | |||
150 | ||||
151 | if ( env == NULL((void*)0) ) { | |||
152 | EXIT_ERROR(AGENT_ERROR_ILLEGAL_ARGUMENT,"getStaticMethod env"){ print_message(stderr, "JDWP exit error ", "\n", "%s(%d): %s [%s:%d]" , jvmtiErrorText((jvmtiError)((jvmtiError)(JVMTI_ERROR_MAX+64 +22))), ((jvmtiError)(JVMTI_ERROR_MAX+64+22)), ("getStaticMethod env" ==((void*)0)?"":"getStaticMethod env"), "/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" , 152); debugInit_exit((jvmtiError)((jvmtiError)(JVMTI_ERROR_MAX +64+22)), "getStaticMethod env"); }; | |||
153 | } | |||
154 | if ( clazz == NULL((void*)0) ) { | |||
155 | EXIT_ERROR(AGENT_ERROR_ILLEGAL_ARGUMENT,"getStaticMethod clazz"){ print_message(stderr, "JDWP exit error ", "\n", "%s(%d): %s [%s:%d]" , jvmtiErrorText((jvmtiError)((jvmtiError)(JVMTI_ERROR_MAX+64 +22))), ((jvmtiError)(JVMTI_ERROR_MAX+64+22)), ("getStaticMethod clazz" ==((void*)0)?"":"getStaticMethod clazz"), "/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" , 155); debugInit_exit((jvmtiError)((jvmtiError)(JVMTI_ERROR_MAX +64+22)), "getStaticMethod clazz"); }; | |||
156 | } | |||
157 | if ( name == NULL((void*)0) || name[0] == 0 ) { | |||
158 | EXIT_ERROR(AGENT_ERROR_ILLEGAL_ARGUMENT,"getStaticMethod name"){ print_message(stderr, "JDWP exit error ", "\n", "%s(%d): %s [%s:%d]" , jvmtiErrorText((jvmtiError)((jvmtiError)(JVMTI_ERROR_MAX+64 +22))), ((jvmtiError)(JVMTI_ERROR_MAX+64+22)), ("getStaticMethod name" ==((void*)0)?"":"getStaticMethod name"), "/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" , 158); debugInit_exit((jvmtiError)((jvmtiError)(JVMTI_ERROR_MAX +64+22)), "getStaticMethod name"); }; | |||
159 | } | |||
160 | if ( signature == NULL((void*)0) || signature[0] == 0 ) { | |||
161 | EXIT_ERROR(AGENT_ERROR_ILLEGAL_ARGUMENT,"getStaticMethod signature"){ print_message(stderr, "JDWP exit error ", "\n", "%s(%d): %s [%s:%d]" , jvmtiErrorText((jvmtiError)((jvmtiError)(JVMTI_ERROR_MAX+64 +22))), ((jvmtiError)(JVMTI_ERROR_MAX+64+22)), ("getStaticMethod signature" ==((void*)0)?"":"getStaticMethod signature"), "/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" , 161); debugInit_exit((jvmtiError)((jvmtiError)(JVMTI_ERROR_MAX +64+22)), "getStaticMethod signature"); }; | |||
162 | } | |||
163 | method = JNI_FUNC_PTR(env,GetStaticMethodID)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,163), log_message_end ("%s()","GetStaticMethodID")):((void)0 )), (env))))->GetStaticMethodID))(env, clazz, name, signature); | |||
164 | if (method == NULL((void*)0)) { | |||
165 | ERROR_MESSAGE(("JDWP Can't find method %s with signature %s",( ((gdata->log_flags & (0x00000080))?(log_message_begin ("ERROR","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,166), log_message_end ("JDWP Can't find method %s with signature %s" , name, signature)):((void)0)), error_message ("JDWP Can't find method %s with signature %s" , name, signature) ) | |||
166 | name, signature))( ((gdata->log_flags & (0x00000080))?(log_message_begin ("ERROR","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,166), log_message_end ("JDWP Can't find method %s with signature %s" , name, signature)):((void)0)), error_message ("JDWP Can't find method %s with signature %s" , name, signature) ); | |||
167 | EXIT_ERROR(AGENT_ERROR_NULL_POINTER,NULL){ print_message(stderr, "JDWP exit error ", "\n", "%s(%d): %s [%s:%d]" , jvmtiErrorText((jvmtiError)((jvmtiError)(JVMTI_ERROR_MAX+64 +21))), ((jvmtiError)(JVMTI_ERROR_MAX+64+21)), (((void*)0)==( (void*)0)?"":((void*)0)), "/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" , 167); debugInit_exit((jvmtiError)((jvmtiError)(JVMTI_ERROR_MAX +64+21)), ((void*)0)); }; | |||
168 | } | |||
169 | if ( JNI_FUNC_PTR(env,ExceptionOccurred)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,169), log_message_end ("%s()","ExceptionOccurred")):((void)0 )), (env))))->ExceptionOccurred))(env) ) { | |||
170 | ERROR_MESSAGE(("JDWP Exception occurred finding method %s with signature %s",( ((gdata->log_flags & (0x00000080))?(log_message_begin ("ERROR","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,171), log_message_end ("JDWP Exception occurred finding method %s with signature %s" , name, signature)):((void)0)), error_message ("JDWP Exception occurred finding method %s with signature %s" , name, signature) ) | |||
171 | name, signature))( ((gdata->log_flags & (0x00000080))?(log_message_begin ("ERROR","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,171), log_message_end ("JDWP Exception occurred finding method %s with signature %s" , name, signature)):((void)0)), error_message ("JDWP Exception occurred finding method %s with signature %s" , name, signature) ); | |||
172 | EXIT_ERROR(AGENT_ERROR_NULL_POINTER,NULL){ print_message(stderr, "JDWP exit error ", "\n", "%s(%d): %s [%s:%d]" , jvmtiErrorText((jvmtiError)((jvmtiError)(JVMTI_ERROR_MAX+64 +21))), ((jvmtiError)(JVMTI_ERROR_MAX+64+21)), (((void*)0)==( (void*)0)?"":((void*)0)), "/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" , 172); debugInit_exit((jvmtiError)((jvmtiError)(JVMTI_ERROR_MAX +64+21)), ((void*)0)); }; | |||
173 | } | |||
174 | return method; | |||
175 | } | |||
176 | ||||
177 | ||||
178 | ||||
179 | void | |||
180 | util_initialize(JNIEnv *env) | |||
181 | { | |||
182 | WITH_LOCAL_REFS(env, 6)createLocalRefSpace(env, 6); { { | |||
183 | ||||
184 | jvmtiError error; | |||
185 | jclass localClassClass; | |||
186 | jclass localThreadClass; | |||
187 | jclass localThreadGroupClass; | |||
188 | jclass localClassLoaderClass; | |||
189 | jclass localStringClass; | |||
190 | jclass localSystemClass; | |||
191 | jclass localPropertiesClass; | |||
192 | jclass localVMSupportClass; | |||
193 | jobject localAgentProperties; | |||
194 | jmethodID getAgentProperties; | |||
195 | jint groupCount; | |||
196 | jthreadGroup *groups; | |||
197 | jthreadGroup localSystemThreadGroup; | |||
198 | ||||
199 | /* Find some standard classes */ | |||
200 | ||||
201 | localClassClass = findClass(env,"java/lang/Class"); | |||
202 | localThreadClass = findClass(env,"java/lang/Thread"); | |||
203 | localThreadGroupClass = findClass(env,"java/lang/ThreadGroup"); | |||
204 | localClassLoaderClass = findClass(env,"java/lang/ClassLoader"); | |||
205 | localStringClass = findClass(env,"java/lang/String"); | |||
206 | localSystemClass = findClass(env,"java/lang/System"); | |||
207 | localPropertiesClass = findClass(env,"java/util/Properties"); | |||
| ||||
208 | ||||
209 | /* Save references */ | |||
210 | ||||
211 | saveGlobalRef(env, localClassClass, &(gdata->classClass)); | |||
212 | saveGlobalRef(env, localThreadClass, &(gdata->threadClass)); | |||
213 | saveGlobalRef(env, localThreadGroupClass, &(gdata->threadGroupClass)); | |||
214 | saveGlobalRef(env, localClassLoaderClass, &(gdata->classLoaderClass)); | |||
215 | saveGlobalRef(env, localStringClass, &(gdata->stringClass)); | |||
216 | saveGlobalRef(env, localSystemClass, &(gdata->systemClass)); | |||
217 | ||||
218 | /* Find some standard methods */ | |||
219 | ||||
220 | gdata->threadConstructor = | |||
221 | getMethod(env, gdata->threadClass, | |||
222 | "<init>", "(Ljava/lang/ThreadGroup;Ljava/lang/String;)V"); | |||
223 | gdata->threadSetDaemon = | |||
224 | getMethod(env, gdata->threadClass, "setDaemon", "(Z)V"); | |||
225 | gdata->threadResume = | |||
226 | getMethod(env, gdata->threadClass, "resume", "()V"); | |||
227 | gdata->systemGetProperty = | |||
228 | getStaticMethod(env, gdata->systemClass, | |||
229 | "getProperty", "(Ljava/lang/String;)Ljava/lang/String;"); | |||
230 | gdata->setProperty = | |||
231 | getMethod(env, localPropertiesClass, | |||
232 | "setProperty", "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/Object;"); | |||
233 | ||||
234 | /* Find the system thread group */ | |||
235 | ||||
236 | groups = NULL((void*)0); | |||
237 | groupCount = 0; | |||
238 | error = JVMTI_FUNC_PTR(gdata->jvmti,GetTopThreadGroups)(*((*((((gdata->log_flags & (0x00000004))?(log_message_begin ("JVMTI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,238), log_message_end ("%s()","GetTopThreadGroups")):((void) 0)),(gdata->jvmti))))->GetTopThreadGroups)) | |||
239 | (gdata->jvmti, &groupCount, &groups); | |||
240 | if (error != JVMTI_ERROR_NONE ) { | |||
241 | EXIT_ERROR(error, "Can't get system thread group"){ print_message(stderr, "JDWP exit error ", "\n", "%s(%d): %s [%s:%d]" , jvmtiErrorText((jvmtiError)error), error, ("Can't get system thread group" ==((void*)0)?"":"Can't get system thread group"), "/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" , 241); debugInit_exit((jvmtiError)error, "Can't get system thread group" ); }; | |||
242 | } | |||
243 | if ( groupCount == 0 ) { | |||
244 | EXIT_ERROR(AGENT_ERROR_NULL_POINTER, "Can't get system thread group"){ print_message(stderr, "JDWP exit error ", "\n", "%s(%d): %s [%s:%d]" , jvmtiErrorText((jvmtiError)((jvmtiError)(JVMTI_ERROR_MAX+64 +21))), ((jvmtiError)(JVMTI_ERROR_MAX+64+21)), ("Can't get system thread group" ==((void*)0)?"":"Can't get system thread group"), "/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" , 244); debugInit_exit((jvmtiError)((jvmtiError)(JVMTI_ERROR_MAX +64+21)), "Can't get system thread group"); }; | |||
245 | } | |||
246 | localSystemThreadGroup = groups[0]; | |||
247 | saveGlobalRef(env, localSystemThreadGroup, &(gdata->systemThreadGroup)); | |||
248 | ||||
249 | /* Get some basic Java property values we will need at some point */ | |||
250 | gdata->property_java_version | |||
251 | = getPropertyUTF8(env, "java.version"); | |||
252 | gdata->property_java_vm_name | |||
253 | = getPropertyUTF8(env, "java.vm.name"); | |||
254 | gdata->property_java_vm_info | |||
255 | = getPropertyUTF8(env, "java.vm.info"); | |||
256 | gdata->property_java_class_path | |||
257 | = getPropertyUTF8(env, "java.class.path"); | |||
258 | gdata->property_sun_boot_library_path | |||
259 | = getPropertyUTF8(env, "sun.boot.library.path"); | |||
260 | gdata->property_path_separator | |||
261 | = getPropertyUTF8(env, "path.separator"); | |||
262 | gdata->property_user_dir | |||
263 | = getPropertyUTF8(env, "user.dir"); | |||
264 | ||||
265 | /* Get agent properties: invoke VMSupport.getAgentProperties */ | |||
266 | localVMSupportClass = JNI_FUNC_PTR(env,FindClass)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,266), log_message_end ("%s()","FindClass")):((void)0)), (env ))))->FindClass)) | |||
267 | (env, "jdk/internal/vm/VMSupport"); | |||
268 | if (localVMSupportClass == NULL((void*)0)) { | |||
269 | gdata->agent_properties = NULL((void*)0); | |||
270 | if (JNI_FUNC_PTR(env,ExceptionOccurred)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,270), log_message_end ("%s()","ExceptionOccurred")):((void)0 )), (env))))->ExceptionOccurred))(env)) { | |||
271 | JNI_FUNC_PTR(env,ExceptionClear)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,271), log_message_end ("%s()","ExceptionClear")):((void)0)), (env))))->ExceptionClear))(env); | |||
272 | } | |||
273 | } else { | |||
274 | getAgentProperties = | |||
275 | getStaticMethod(env, localVMSupportClass, | |||
276 | "getAgentProperties", "()Ljava/util/Properties;"); | |||
277 | localAgentProperties = | |||
278 | JNI_FUNC_PTR(env,CallStaticObjectMethod)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,278), log_message_end ("%s()","CallStaticObjectMethod")):((void )0)), (env))))->CallStaticObjectMethod)) | |||
279 | (env, localVMSupportClass, getAgentProperties); | |||
280 | saveGlobalRef(env, localAgentProperties, &(gdata->agent_properties)); | |||
281 | if (JNI_FUNC_PTR(env,ExceptionOccurred)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,281), log_message_end ("%s()","ExceptionOccurred")):((void)0 )), (env))))->ExceptionOccurred))(env)) { | |||
282 | JNI_FUNC_PTR(env,ExceptionClear)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,282), log_message_end ("%s()","ExceptionClear")):((void)0)), (env))))->ExceptionClear))(env); | |||
283 | EXIT_ERROR(AGENT_ERROR_INTERNAL,{ print_message(stderr, "JDWP exit error ", "\n", "%s(%d): %s [%s:%d]" , jvmtiErrorText((jvmtiError)((jvmtiError)(JVMTI_ERROR_MAX+64 +1))), ((jvmtiError)(JVMTI_ERROR_MAX+64+1)), ("Exception occurred calling VMSupport.getAgentProperties" ==((void*)0)?"":"Exception occurred calling VMSupport.getAgentProperties" ), "/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" , 284); debugInit_exit((jvmtiError)((jvmtiError)(JVMTI_ERROR_MAX +64+1)), "Exception occurred calling VMSupport.getAgentProperties" ); } | |||
284 | "Exception occurred calling VMSupport.getAgentProperties"){ print_message(stderr, "JDWP exit error ", "\n", "%s(%d): %s [%s:%d]" , jvmtiErrorText((jvmtiError)((jvmtiError)(JVMTI_ERROR_MAX+64 +1))), ((jvmtiError)(JVMTI_ERROR_MAX+64+1)), ("Exception occurred calling VMSupport.getAgentProperties" ==((void*)0)?"":"Exception occurred calling VMSupport.getAgentProperties" ), "/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" , 284); debugInit_exit((jvmtiError)((jvmtiError)(JVMTI_ERROR_MAX +64+1)), "Exception occurred calling VMSupport.getAgentProperties" ); }; | |||
285 | } | |||
286 | } | |||
287 | ||||
288 | } END_WITH_LOCAL_REFS(env)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,288), log_message_end ("%s()","PopLocalFrame")):((void)0)), ( env))))->PopLocalFrame))(env, ((void*)0)); }; | |||
289 | ||||
290 | } | |||
291 | ||||
292 | void | |||
293 | util_reset(void) | |||
294 | { | |||
295 | } | |||
296 | ||||
297 | jboolean | |||
298 | isObjectTag(jbyte tag) { | |||
299 | return (tag == JDWP_TAG(OBJECT)76) || | |||
300 | (tag == JDWP_TAG(STRING)115) || | |||
301 | (tag == JDWP_TAG(THREAD)116) || | |||
302 | (tag == JDWP_TAG(THREAD_GROUP)103) || | |||
303 | (tag == JDWP_TAG(CLASS_LOADER)108) || | |||
304 | (tag == JDWP_TAG(CLASS_OBJECT)99) || | |||
305 | (tag == JDWP_TAG(ARRAY)91); | |||
306 | } | |||
307 | ||||
308 | jbyte | |||
309 | specificTypeKey(JNIEnv *env, jobject object) | |||
310 | { | |||
311 | if (object == NULL((void*)0)) { | |||
312 | return JDWP_TAG(OBJECT)76; | |||
313 | } else if (JNI_FUNC_PTR(env,IsInstanceOf)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,313), log_message_end ("%s()","IsInstanceOf")):((void)0)), ( env))))->IsInstanceOf))(env, object, gdata->stringClass)) { | |||
314 | return JDWP_TAG(STRING)115; | |||
315 | } else if (JNI_FUNC_PTR(env,IsInstanceOf)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,315), log_message_end ("%s()","IsInstanceOf")):((void)0)), ( env))))->IsInstanceOf))(env, object, gdata->threadClass)) { | |||
316 | return JDWP_TAG(THREAD)116; | |||
317 | } else if (JNI_FUNC_PTR(env,IsInstanceOf)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,317), log_message_end ("%s()","IsInstanceOf")):((void)0)), ( env))))->IsInstanceOf))(env, object, gdata->threadGroupClass)) { | |||
318 | return JDWP_TAG(THREAD_GROUP)103; | |||
319 | } else if (JNI_FUNC_PTR(env,IsInstanceOf)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,319), log_message_end ("%s()","IsInstanceOf")):((void)0)), ( env))))->IsInstanceOf))(env, object, gdata->classLoaderClass)) { | |||
320 | return JDWP_TAG(CLASS_LOADER)108; | |||
321 | } else if (JNI_FUNC_PTR(env,IsInstanceOf)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,321), log_message_end ("%s()","IsInstanceOf")):((void)0)), ( env))))->IsInstanceOf))(env, object, gdata->classClass)) { | |||
322 | return JDWP_TAG(CLASS_OBJECT)99; | |||
323 | } else { | |||
324 | jboolean classIsArray; | |||
325 | ||||
326 | WITH_LOCAL_REFS(env, 1)createLocalRefSpace(env, 1); { { | |||
327 | jclass clazz; | |||
328 | clazz = JNI_FUNC_PTR(env,GetObjectClass)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,328), log_message_end ("%s()","GetObjectClass")):((void)0)), (env))))->GetObjectClass))(env, object); | |||
329 | classIsArray = isArrayClass(clazz); | |||
330 | } END_WITH_LOCAL_REFS(env)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,330), log_message_end ("%s()","PopLocalFrame")):((void)0)), ( env))))->PopLocalFrame))(env, ((void*)0)); }; | |||
331 | ||||
332 | return (classIsArray ? JDWP_TAG(ARRAY)91 : JDWP_TAG(OBJECT)76); | |||
333 | } | |||
334 | } | |||
335 | ||||
336 | static void | |||
337 | writeFieldValue(JNIEnv *env, PacketOutputStream *out, jobject object, | |||
338 | jfieldID field) | |||
339 | { | |||
340 | jclass clazz; | |||
341 | char *signature = NULL((void*)0); | |||
342 | jvmtiError error; | |||
343 | jbyte typeKey; | |||
344 | ||||
345 | clazz = JNI_FUNC_PTR(env,GetObjectClass)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,345), log_message_end ("%s()","GetObjectClass")):((void)0)), (env))))->GetObjectClass))(env, object); | |||
346 | error = fieldSignature(clazz, field, NULL((void*)0), &signature, NULL((void*)0)); | |||
347 | if (error != JVMTI_ERROR_NONE) { | |||
348 | outStream_setError(out, map2jdwpError(error)); | |||
349 | return; | |||
350 | } | |||
351 | typeKey = jdwpTag(signature); | |||
352 | jvmtiDeallocate(signature); | |||
353 | ||||
354 | if (isReferenceTag(typeKey)) { | |||
355 | ||||
356 | jobject value = JNI_FUNC_PTR(env,GetObjectField)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,356), log_message_end ("%s()","GetObjectField")):((void)0)), (env))))->GetObjectField))(env, object, field); | |||
357 | (void)outStream_writeByte(out, specificTypeKey(env, value)); | |||
358 | (void)outStream_writeObjectRef(env, out, value); | |||
359 | return; | |||
360 | ||||
361 | } | |||
362 | ||||
363 | /* | |||
364 | * For primitive types, the type key is bounced back as is. | |||
365 | */ | |||
366 | ||||
367 | (void)outStream_writeByte(out, typeKey); | |||
368 | ||||
369 | switch (typeKey) { | |||
370 | case JDWP_TAG(BYTE)66: | |||
371 | (void)outStream_writeByte(out, | |||
372 | JNI_FUNC_PTR(env,GetByteField)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,372), log_message_end ("%s()","GetByteField")):((void)0)), ( env))))->GetByteField))(env, object, field)); | |||
373 | break; | |||
374 | ||||
375 | case JDWP_TAG(CHAR)67: | |||
376 | (void)outStream_writeChar(out, | |||
377 | JNI_FUNC_PTR(env,GetCharField)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,377), log_message_end ("%s()","GetCharField")):((void)0)), ( env))))->GetCharField))(env, object, field)); | |||
378 | break; | |||
379 | ||||
380 | case JDWP_TAG(FLOAT)70: | |||
381 | (void)outStream_writeFloat(out, | |||
382 | JNI_FUNC_PTR(env,GetFloatField)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,382), log_message_end ("%s()","GetFloatField")):((void)0)), ( env))))->GetFloatField))(env, object, field)); | |||
383 | break; | |||
384 | ||||
385 | case JDWP_TAG(DOUBLE)68: | |||
386 | (void)outStream_writeDouble(out, | |||
387 | JNI_FUNC_PTR(env,GetDoubleField)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,387), log_message_end ("%s()","GetDoubleField")):((void)0)), (env))))->GetDoubleField))(env, object, field)); | |||
388 | break; | |||
389 | ||||
390 | case JDWP_TAG(INT)73: | |||
391 | (void)outStream_writeInt(out, | |||
392 | JNI_FUNC_PTR(env,GetIntField)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,392), log_message_end ("%s()","GetIntField")):((void)0)), (env ))))->GetIntField))(env, object, field)); | |||
393 | break; | |||
394 | ||||
395 | case JDWP_TAG(LONG)74: | |||
396 | (void)outStream_writeLong(out, | |||
397 | JNI_FUNC_PTR(env,GetLongField)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,397), log_message_end ("%s()","GetLongField")):((void)0)), ( env))))->GetLongField))(env, object, field)); | |||
398 | break; | |||
399 | ||||
400 | case JDWP_TAG(SHORT)83: | |||
401 | (void)outStream_writeShort(out, | |||
402 | JNI_FUNC_PTR(env,GetShortField)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,402), log_message_end ("%s()","GetShortField")):((void)0)), ( env))))->GetShortField))(env, object, field)); | |||
403 | break; | |||
404 | ||||
405 | case JDWP_TAG(BOOLEAN)90: | |||
406 | (void)outStream_writeBoolean(out, | |||
407 | JNI_FUNC_PTR(env,GetBooleanField)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,407), log_message_end ("%s()","GetBooleanField")):((void)0)) , (env))))->GetBooleanField))(env, object, field)); | |||
408 | break; | |||
409 | } | |||
410 | } | |||
411 | ||||
412 | static void | |||
413 | writeStaticFieldValue(JNIEnv *env, PacketOutputStream *out, jclass clazz, | |||
414 | jfieldID field) | |||
415 | { | |||
416 | jvmtiError error; | |||
417 | char *signature = NULL((void*)0); | |||
418 | jbyte typeKey; | |||
419 | ||||
420 | error = fieldSignature(clazz, field, NULL((void*)0), &signature, NULL((void*)0)); | |||
421 | if (error != JVMTI_ERROR_NONE) { | |||
422 | outStream_setError(out, map2jdwpError(error)); | |||
423 | return; | |||
424 | } | |||
425 | typeKey = jdwpTag(signature); | |||
426 | jvmtiDeallocate(signature); | |||
427 | ||||
428 | ||||
429 | if (isReferenceTag(typeKey)) { | |||
430 | ||||
431 | jobject value = JNI_FUNC_PTR(env,GetStaticObjectField)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,431), log_message_end ("%s()","GetStaticObjectField")):((void )0)), (env))))->GetStaticObjectField))(env, clazz, field); | |||
432 | (void)outStream_writeByte(out, specificTypeKey(env, value)); | |||
433 | (void)outStream_writeObjectRef(env, out, value); | |||
434 | ||||
435 | return; | |||
436 | } | |||
437 | ||||
438 | /* | |||
439 | * For primitive types, the type key is bounced back as is. | |||
440 | */ | |||
441 | (void)outStream_writeByte(out, typeKey); | |||
442 | switch (typeKey) { | |||
443 | case JDWP_TAG(BYTE)66: | |||
444 | (void)outStream_writeByte(out, | |||
445 | JNI_FUNC_PTR(env,GetStaticByteField)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,445), log_message_end ("%s()","GetStaticByteField")):((void) 0)), (env))))->GetStaticByteField))(env, clazz, field)); | |||
446 | break; | |||
447 | ||||
448 | case JDWP_TAG(CHAR)67: | |||
449 | (void)outStream_writeChar(out, | |||
450 | JNI_FUNC_PTR(env,GetStaticCharField)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,450), log_message_end ("%s()","GetStaticCharField")):((void) 0)), (env))))->GetStaticCharField))(env, clazz, field)); | |||
451 | break; | |||
452 | ||||
453 | case JDWP_TAG(FLOAT)70: | |||
454 | (void)outStream_writeFloat(out, | |||
455 | JNI_FUNC_PTR(env,GetStaticFloatField)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,455), log_message_end ("%s()","GetStaticFloatField")):((void )0)), (env))))->GetStaticFloatField))(env, clazz, field)); | |||
456 | break; | |||
457 | ||||
458 | case JDWP_TAG(DOUBLE)68: | |||
459 | (void)outStream_writeDouble(out, | |||
460 | JNI_FUNC_PTR(env,GetStaticDoubleField)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,460), log_message_end ("%s()","GetStaticDoubleField")):((void )0)), (env))))->GetStaticDoubleField))(env, clazz, field)); | |||
461 | break; | |||
462 | ||||
463 | case JDWP_TAG(INT)73: | |||
464 | (void)outStream_writeInt(out, | |||
465 | JNI_FUNC_PTR(env,GetStaticIntField)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,465), log_message_end ("%s()","GetStaticIntField")):((void)0 )), (env))))->GetStaticIntField))(env, clazz, field)); | |||
466 | break; | |||
467 | ||||
468 | case JDWP_TAG(LONG)74: | |||
469 | (void)outStream_writeLong(out, | |||
470 | JNI_FUNC_PTR(env,GetStaticLongField)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,470), log_message_end ("%s()","GetStaticLongField")):((void) 0)), (env))))->GetStaticLongField))(env, clazz, field)); | |||
471 | break; | |||
472 | ||||
473 | case JDWP_TAG(SHORT)83: | |||
474 | (void)outStream_writeShort(out, | |||
475 | JNI_FUNC_PTR(env,GetStaticShortField)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,475), log_message_end ("%s()","GetStaticShortField")):((void )0)), (env))))->GetStaticShortField))(env, clazz, field)); | |||
476 | break; | |||
477 | ||||
478 | case JDWP_TAG(BOOLEAN)90: | |||
479 | (void)outStream_writeBoolean(out, | |||
480 | JNI_FUNC_PTR(env,GetStaticBooleanField)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,480), log_message_end ("%s()","GetStaticBooleanField")):((void )0)), (env))))->GetStaticBooleanField))(env, clazz, field)); | |||
481 | break; | |||
482 | } | |||
483 | } | |||
484 | ||||
485 | void | |||
486 | sharedGetFieldValues(PacketInputStream *in, PacketOutputStream *out, | |||
487 | jboolean isStatic) | |||
488 | { | |||
489 | JNIEnv *env = getEnv(); | |||
490 | jint length; | |||
491 | jobject object; | |||
492 | jclass clazz; | |||
493 | ||||
494 | object = NULL((void*)0); | |||
495 | clazz = NULL((void*)0); | |||
496 | ||||
497 | if (isStatic) { | |||
498 | clazz = inStream_readClassRef(env, in); | |||
499 | } else { | |||
500 | object = inStream_readObjectRef(env, in); | |||
501 | } | |||
502 | ||||
503 | length = inStream_readInt(in); | |||
504 | if (inStream_error(in)) { | |||
505 | return; | |||
506 | } | |||
507 | ||||
508 | WITH_LOCAL_REFS(env, length + 1)createLocalRefSpace(env, length + 1); { { /* +1 for class with instance fields */ | |||
509 | ||||
510 | int i; | |||
511 | ||||
512 | (void)outStream_writeInt(out, length); | |||
513 | for (i = 0; (i < length) && !outStream_error(out); i++) { | |||
514 | jfieldID field = inStream_readFieldID(in); | |||
515 | ||||
516 | if (isStatic) { | |||
517 | writeStaticFieldValue(env, out, clazz, field); | |||
518 | } else { | |||
519 | writeFieldValue(env, out, object, field); | |||
520 | } | |||
521 | } | |||
522 | ||||
523 | } END_WITH_LOCAL_REFS(env)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,523), log_message_end ("%s()","PopLocalFrame")):((void)0)), ( env))))->PopLocalFrame))(env, ((void*)0)); }; | |||
524 | } | |||
525 | ||||
526 | jboolean | |||
527 | sharedInvoke(PacketInputStream *in, PacketOutputStream *out) | |||
528 | { | |||
529 | jvalue *arguments = NULL((void*)0); | |||
530 | jint options; | |||
531 | jvmtiError error; | |||
532 | jbyte invokeType; | |||
533 | jclass clazz; | |||
534 | jmethodID method; | |||
535 | jint argumentCount; | |||
536 | jobject instance; | |||
537 | jthread thread; | |||
538 | JNIEnv *env; | |||
539 | ||||
540 | /* | |||
541 | * Instance methods start with the instance, thread and class, | |||
542 | * and statics and constructors start with the class and then the | |||
543 | * thread. | |||
544 | */ | |||
545 | env = getEnv(); | |||
546 | if (inStream_command(in) == JDWP_COMMAND(ObjectReference, InvokeMethod)6) { | |||
547 | instance = inStream_readObjectRef(env, in); | |||
548 | thread = inStream_readThreadRef(env, in); | |||
549 | clazz = inStream_readClassRef(env, in); | |||
550 | } else { /* static method or constructor */ | |||
551 | instance = NULL((void*)0); | |||
552 | clazz = inStream_readClassRef(env, in); | |||
553 | thread = inStream_readThreadRef(env, in); | |||
554 | } | |||
555 | ||||
556 | /* | |||
557 | * ... and the rest of the packet is identical for all commands | |||
558 | */ | |||
559 | method = inStream_readMethodID(in); | |||
560 | argumentCount = inStream_readInt(in); | |||
561 | if (inStream_error(in)) { | |||
562 | return JNI_TRUE1; | |||
563 | } | |||
564 | ||||
565 | /* If count == 0, don't try and allocate 0 bytes, you'll get NULL */ | |||
566 | if ( argumentCount > 0 ) { | |||
567 | int i; | |||
568 | /*LINTED*/ | |||
569 | arguments = jvmtiAllocate(argumentCount * (jint)sizeof(*arguments)); | |||
570 | if (arguments == NULL((void*)0)) { | |||
571 | outStream_setError(out, JDWP_ERROR(OUT_OF_MEMORY)110); | |||
572 | return JNI_TRUE1; | |||
573 | } | |||
574 | for (i = 0; (i < argumentCount) && !inStream_error(in); i++) { | |||
575 | arguments[i] = inStream_readValue(in); | |||
576 | } | |||
577 | if (inStream_error(in)) { | |||
578 | return JNI_TRUE1; | |||
579 | } | |||
580 | } | |||
581 | ||||
582 | options = inStream_readInt(in); | |||
583 | if (inStream_error(in)) { | |||
584 | if ( arguments != NULL((void*)0) ) { | |||
585 | jvmtiDeallocate(arguments); | |||
586 | } | |||
587 | return JNI_TRUE1; | |||
588 | } | |||
589 | ||||
590 | if (inStream_command(in) == JDWP_COMMAND(ClassType, NewInstance)4) { | |||
591 | invokeType = INVOKE_CONSTRUCTOR1; | |||
592 | } else if (inStream_command(in) == JDWP_COMMAND(ClassType, InvokeMethod)3) { | |||
593 | invokeType = INVOKE_STATIC2; | |||
594 | } else if (inStream_command(in) == JDWP_COMMAND(InterfaceType, InvokeMethod)1) { | |||
595 | invokeType = INVOKE_STATIC2; | |||
596 | } else if (inStream_command(in) == JDWP_COMMAND(ObjectReference, InvokeMethod)6) { | |||
597 | invokeType = INVOKE_INSTANCE3; | |||
598 | } else { | |||
599 | outStream_setError(out, JDWP_ERROR(INTERNAL)113); | |||
600 | if ( arguments != NULL((void*)0) ) { | |||
601 | jvmtiDeallocate(arguments); | |||
602 | } | |||
603 | return JNI_TRUE1; | |||
604 | } | |||
605 | ||||
606 | /* | |||
607 | * Request the invoke. If there are no errors in the request, | |||
608 | * the interrupting thread will actually do the invoke and a | |||
609 | * reply will be generated subsequently, so we don't reply here. | |||
610 | */ | |||
611 | error = invoker_requestInvoke(invokeType, (jbyte)options, inStream_id(in), | |||
612 | thread, clazz, method, | |||
613 | instance, arguments, argumentCount); | |||
614 | if (error != JVMTI_ERROR_NONE) { | |||
615 | outStream_setError(out, map2jdwpError(error)); | |||
616 | if ( arguments != NULL((void*)0) ) { | |||
617 | jvmtiDeallocate(arguments); | |||
618 | } | |||
619 | return JNI_TRUE1; | |||
620 | } | |||
621 | ||||
622 | return JNI_FALSE0; /* Don't reply */ | |||
623 | } | |||
624 | ||||
625 | jint | |||
626 | uniqueID(void) | |||
627 | { | |||
628 | static jint currentID = 0; | |||
629 | return currentID++; | |||
630 | } | |||
631 | ||||
632 | int | |||
633 | filterDebugThreads(jthread *threads, int count) | |||
634 | { | |||
635 | int i; | |||
636 | int current; | |||
637 | ||||
638 | /* Squish out all of the debugger-spawned threads */ | |||
639 | for (i = 0, current = 0; i < count; i++) { | |||
640 | jthread thread = threads[i]; | |||
641 | if (!threadControl_isDebugThread(thread)) { | |||
642 | if (i > current) { | |||
643 | threads[current] = thread; | |||
644 | } | |||
645 | current++; | |||
646 | } | |||
647 | } | |||
648 | return current; | |||
649 | } | |||
650 | ||||
651 | jbyte | |||
652 | referenceTypeTag(jclass clazz) | |||
653 | { | |||
654 | jbyte tag; | |||
655 | ||||
656 | if (isInterface(clazz)) { | |||
657 | tag = JDWP_TYPE_TAG(INTERFACE)2; | |||
658 | } else if (isArrayClass(clazz)) { | |||
659 | tag = JDWP_TYPE_TAG(ARRAY)3; | |||
660 | } else { | |||
661 | tag = JDWP_TYPE_TAG(CLASS)1; | |||
662 | } | |||
663 | ||||
664 | return tag; | |||
665 | } | |||
666 | ||||
667 | /** | |||
668 | * Get field modifiers | |||
669 | */ | |||
670 | jvmtiError | |||
671 | fieldModifiers(jclass clazz, jfieldID field, jint *pmodifiers) | |||
672 | { | |||
673 | jvmtiError error; | |||
674 | ||||
675 | *pmodifiers = 0; | |||
676 | error = JVMTI_FUNC_PTR(gdata->jvmti,GetFieldModifiers)(*((*((((gdata->log_flags & (0x00000004))?(log_message_begin ("JVMTI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,676), log_message_end ("%s()","GetFieldModifiers")):((void)0 )),(gdata->jvmti))))->GetFieldModifiers)) | |||
677 | (gdata->jvmti, clazz, field, pmodifiers); | |||
678 | return error; | |||
679 | } | |||
680 | ||||
681 | /** | |||
682 | * Get method modifiers | |||
683 | */ | |||
684 | jvmtiError | |||
685 | methodModifiers(jmethodID method, jint *pmodifiers) | |||
686 | { | |||
687 | jvmtiError error; | |||
688 | ||||
689 | *pmodifiers = 0; | |||
690 | error = JVMTI_FUNC_PTR(gdata->jvmti,GetMethodModifiers)(*((*((((gdata->log_flags & (0x00000004))?(log_message_begin ("JVMTI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,690), log_message_end ("%s()","GetMethodModifiers")):((void) 0)),(gdata->jvmti))))->GetMethodModifiers)) | |||
691 | (gdata->jvmti, method, pmodifiers); | |||
692 | return error; | |||
693 | } | |||
694 | ||||
695 | /* Returns a local ref to the declaring class for a method, or NULL. */ | |||
696 | jvmtiError | |||
697 | methodClass(jmethodID method, jclass *pclazz) | |||
698 | { | |||
699 | jvmtiError error; | |||
700 | ||||
701 | *pclazz = NULL((void*)0); | |||
702 | error = JVMTI_FUNC_PTR(gdata->jvmti,GetMethodDeclaringClass)(*((*((((gdata->log_flags & (0x00000004))?(log_message_begin ("JVMTI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,702), log_message_end ("%s()","GetMethodDeclaringClass")):(( void)0)),(gdata->jvmti))))->GetMethodDeclaringClass)) | |||
703 | (gdata->jvmti, method, pclazz); | |||
704 | return error; | |||
705 | } | |||
706 | ||||
707 | /* Returns the start and end locations of the specified method. */ | |||
708 | jvmtiError | |||
709 | methodLocation(jmethodID method, jlocation *ploc1, jlocation *ploc2) | |||
710 | { | |||
711 | jvmtiError error; | |||
712 | ||||
713 | error = JVMTI_FUNC_PTR(gdata->jvmti,GetMethodLocation)(*((*((((gdata->log_flags & (0x00000004))?(log_message_begin ("JVMTI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,713), log_message_end ("%s()","GetMethodLocation")):((void)0 )),(gdata->jvmti))))->GetMethodLocation)) | |||
714 | (gdata->jvmti, method, ploc1, ploc2); | |||
715 | return error; | |||
716 | } | |||
717 | ||||
718 | /** | |||
719 | * Get method signature | |||
720 | */ | |||
721 | jvmtiError | |||
722 | methodSignature(jmethodID method, | |||
723 | char **pname, char **psignature, char **pgeneric_signature) | |||
724 | { | |||
725 | jvmtiError error; | |||
726 | char *name = NULL((void*)0); | |||
727 | char *signature = NULL((void*)0); | |||
728 | char *generic_signature = NULL((void*)0); | |||
729 | ||||
730 | error = JVMTI_FUNC_PTR(gdata->jvmti,GetMethodName)(*((*((((gdata->log_flags & (0x00000004))?(log_message_begin ("JVMTI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,730), log_message_end ("%s()","GetMethodName")):((void)0)),( gdata->jvmti))))->GetMethodName)) | |||
731 | (gdata->jvmti, method, &name, &signature, &generic_signature); | |||
732 | ||||
733 | if ( pname != NULL((void*)0) ) { | |||
734 | *pname = name; | |||
735 | } else if ( name != NULL((void*)0) ) { | |||
736 | jvmtiDeallocate(name); | |||
737 | } | |||
738 | if ( psignature != NULL((void*)0) ) { | |||
739 | *psignature = signature; | |||
740 | } else if ( signature != NULL((void*)0) ) { | |||
741 | jvmtiDeallocate(signature); | |||
742 | } | |||
743 | if ( pgeneric_signature != NULL((void*)0) ) { | |||
744 | *pgeneric_signature = generic_signature; | |||
745 | } else if ( generic_signature != NULL((void*)0) ) { | |||
746 | jvmtiDeallocate(generic_signature); | |||
747 | } | |||
748 | return error; | |||
749 | } | |||
750 | ||||
751 | /* | |||
752 | * Get the return type key of the method | |||
753 | * V or B C D F I J S Z L [ | |||
754 | */ | |||
755 | jvmtiError | |||
756 | methodReturnType(jmethodID method, char *typeKey) | |||
757 | { | |||
758 | char *signature; | |||
759 | jvmtiError error; | |||
760 | ||||
761 | signature = NULL((void*)0); | |||
762 | error = methodSignature(method, NULL((void*)0), &signature, NULL((void*)0)); | |||
763 | if (error == JVMTI_ERROR_NONE) { | |||
764 | if (signature == NULL((void*)0) ) { | |||
765 | error = AGENT_ERROR_INVALID_TAG((jvmtiError)(JVMTI_ERROR_MAX+64+9)); | |||
766 | } else { | |||
767 | char * xx; | |||
768 | ||||
769 | xx = strchr(signature, ')'); | |||
770 | if (xx == NULL((void*)0) || *(xx + 1) == 0) { | |||
771 | error = AGENT_ERROR_INVALID_TAG((jvmtiError)(JVMTI_ERROR_MAX+64+9)); | |||
772 | } else { | |||
773 | *typeKey = *(xx + 1); | |||
774 | } | |||
775 | jvmtiDeallocate(signature); | |||
776 | } | |||
777 | } | |||
778 | return error; | |||
779 | } | |||
780 | ||||
781 | ||||
782 | /** | |||
783 | * Return class loader for a class (must be inside a WITH_LOCAL_REFS) | |||
784 | */ | |||
785 | jvmtiError | |||
786 | classLoader(jclass clazz, jobject *pclazz) | |||
787 | { | |||
788 | jvmtiError error; | |||
789 | ||||
790 | *pclazz = NULL((void*)0); | |||
791 | error = JVMTI_FUNC_PTR(gdata->jvmti,GetClassLoader)(*((*((((gdata->log_flags & (0x00000004))?(log_message_begin ("JVMTI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,791), log_message_end ("%s()","GetClassLoader")):((void)0)), (gdata->jvmti))))->GetClassLoader)) | |||
792 | (gdata->jvmti, clazz, pclazz); | |||
793 | return error; | |||
794 | } | |||
795 | ||||
796 | /** | |||
797 | * Get field signature | |||
798 | */ | |||
799 | jvmtiError | |||
800 | fieldSignature(jclass clazz, jfieldID field, | |||
801 | char **pname, char **psignature, char **pgeneric_signature) | |||
802 | { | |||
803 | jvmtiError error; | |||
804 | char *name = NULL((void*)0); | |||
805 | char *signature = NULL((void*)0); | |||
806 | char *generic_signature = NULL((void*)0); | |||
807 | ||||
808 | error = JVMTI_FUNC_PTR(gdata->jvmti,GetFieldName)(*((*((((gdata->log_flags & (0x00000004))?(log_message_begin ("JVMTI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,808), log_message_end ("%s()","GetFieldName")):((void)0)),(gdata ->jvmti))))->GetFieldName)) | |||
809 | (gdata->jvmti, clazz, field, &name, &signature, &generic_signature); | |||
810 | ||||
811 | if ( pname != NULL((void*)0) ) { | |||
812 | *pname = name; | |||
813 | } else if ( name != NULL((void*)0) ) { | |||
814 | jvmtiDeallocate(name); | |||
815 | } | |||
816 | if ( psignature != NULL((void*)0) ) { | |||
817 | *psignature = signature; | |||
818 | } else if ( signature != NULL((void*)0) ) { | |||
819 | jvmtiDeallocate(signature); | |||
820 | } | |||
821 | if ( pgeneric_signature != NULL((void*)0) ) { | |||
822 | *pgeneric_signature = generic_signature; | |||
823 | } else if ( generic_signature != NULL((void*)0) ) { | |||
824 | jvmtiDeallocate(generic_signature); | |||
825 | } | |||
826 | return error; | |||
827 | } | |||
828 | ||||
829 | JNIEnv * | |||
830 | getEnv(void) | |||
831 | { | |||
832 | JNIEnv *env = NULL((void*)0); | |||
833 | jint rc; | |||
834 | ||||
835 | rc = FUNC_PTR(gdata->jvm,GetEnv)(*((*(gdata->jvm))->GetEnv)) | |||
836 | (gdata->jvm, (void **)&env, JNI_VERSION_1_20x00010002); | |||
837 | if (rc != JNI_OK0) { | |||
838 | ERROR_MESSAGE(("JDWP Unable to get JNI 1.2 environment, jvm->GetEnv() return code = %d",( ((gdata->log_flags & (0x00000080))?(log_message_begin ("ERROR","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,839), log_message_end ("JDWP Unable to get JNI 1.2 environment, jvm->GetEnv() return code = %d" , rc)):((void)0)), error_message ("JDWP Unable to get JNI 1.2 environment, jvm->GetEnv() return code = %d" , rc) ) | |||
839 | rc))( ((gdata->log_flags & (0x00000080))?(log_message_begin ("ERROR","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,839), log_message_end ("JDWP Unable to get JNI 1.2 environment, jvm->GetEnv() return code = %d" , rc)):((void)0)), error_message ("JDWP Unable to get JNI 1.2 environment, jvm->GetEnv() return code = %d" , rc) ); | |||
840 | EXIT_ERROR(AGENT_ERROR_NO_JNI_ENV,NULL){ print_message(stderr, "JDWP exit error ", "\n", "%s(%d): %s [%s:%d]" , jvmtiErrorText((jvmtiError)((jvmtiError)(JVMTI_ERROR_MAX+64 +3))), ((jvmtiError)(JVMTI_ERROR_MAX+64+3)), (((void*)0)==((void *)0)?"":((void*)0)), "/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" , 840); debugInit_exit((jvmtiError)((jvmtiError)(JVMTI_ERROR_MAX +64+3)), ((void*)0)); }; | |||
841 | } | |||
842 | return env; | |||
843 | } | |||
844 | ||||
845 | jvmtiError | |||
846 | spawnNewThread(jvmtiStartFunction func, void *arg, char *name) | |||
847 | { | |||
848 | JNIEnv *env = getEnv(); | |||
849 | jvmtiError error; | |||
850 | ||||
851 | LOG_MISC(("Spawning new thread: %s", name))((gdata->log_flags & (0x00000008)) ?(log_message_begin ("MISC","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,851), log_message_end ("Spawning new thread: %s", name)):((void )0)); | |||
852 | ||||
853 | WITH_LOCAL_REFS(env, 3)createLocalRefSpace(env, 3); { { | |||
854 | ||||
855 | jthread thread; | |||
856 | jstring nameString; | |||
857 | ||||
858 | nameString = JNI_FUNC_PTR(env,NewStringUTF)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,858), log_message_end ("%s()","NewStringUTF")):((void)0)), ( env))))->NewStringUTF))(env, name); | |||
859 | if (JNI_FUNC_PTR(env,ExceptionOccurred)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,859), log_message_end ("%s()","ExceptionOccurred")):((void)0 )), (env))))->ExceptionOccurred))(env)) { | |||
860 | JNI_FUNC_PTR(env,ExceptionClear)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,860), log_message_end ("%s()","ExceptionClear")):((void)0)), (env))))->ExceptionClear))(env); | |||
861 | error = AGENT_ERROR_OUT_OF_MEMORY((jvmtiError)(JVMTI_ERROR_MAX+64+8)); | |||
862 | goto err; | |||
863 | } | |||
864 | ||||
865 | thread = JNI_FUNC_PTR(env,NewObject)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,865), log_message_end ("%s()","NewObject")):((void)0)), (env ))))->NewObject)) | |||
866 | (env, gdata->threadClass, gdata->threadConstructor, | |||
867 | gdata->systemThreadGroup, nameString); | |||
868 | if (JNI_FUNC_PTR(env,ExceptionOccurred)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,868), log_message_end ("%s()","ExceptionOccurred")):((void)0 )), (env))))->ExceptionOccurred))(env)) { | |||
869 | JNI_FUNC_PTR(env,ExceptionClear)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,869), log_message_end ("%s()","ExceptionClear")):((void)0)), (env))))->ExceptionClear))(env); | |||
870 | error = AGENT_ERROR_OUT_OF_MEMORY((jvmtiError)(JVMTI_ERROR_MAX+64+8)); | |||
871 | goto err; | |||
872 | } | |||
873 | ||||
874 | /* | |||
875 | * Make the debugger thread a daemon | |||
876 | */ | |||
877 | JNI_FUNC_PTR(env,CallVoidMethod)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,877), log_message_end ("%s()","CallVoidMethod")):((void)0)), (env))))->CallVoidMethod)) | |||
878 | (env, thread, gdata->threadSetDaemon, JNI_TRUE1); | |||
879 | if (JNI_FUNC_PTR(env,ExceptionOccurred)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,879), log_message_end ("%s()","ExceptionOccurred")):((void)0 )), (env))))->ExceptionOccurred))(env)) { | |||
880 | JNI_FUNC_PTR(env,ExceptionClear)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,880), log_message_end ("%s()","ExceptionClear")):((void)0)), (env))))->ExceptionClear))(env); | |||
881 | error = AGENT_ERROR_JNI_EXCEPTION((jvmtiError)(JVMTI_ERROR_MAX+64+4)); | |||
882 | goto err; | |||
883 | } | |||
884 | ||||
885 | error = threadControl_addDebugThread(thread); | |||
886 | if (error == JVMTI_ERROR_NONE) { | |||
887 | /* | |||
888 | * Debugger threads need cycles in all sorts of strange | |||
889 | * situations (e.g. infinite cpu-bound loops), so give the | |||
890 | * thread a high priority. Note that if the VM has an application | |||
891 | * thread running at the max priority, there is still a chance | |||
892 | * that debugger threads will be starved. (There needs to be | |||
893 | * a way to give debugger threads a priority higher than any | |||
894 | * application thread). | |||
895 | */ | |||
896 | error = JVMTI_FUNC_PTR(gdata->jvmti,RunAgentThread)(*((*((((gdata->log_flags & (0x00000004))?(log_message_begin ("JVMTI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,896), log_message_end ("%s()","RunAgentThread")):((void)0)), (gdata->jvmti))))->RunAgentThread)) | |||
897 | (gdata->jvmti, thread, func, arg, | |||
898 | JVMTI_THREAD_MAX_PRIORITY); | |||
899 | } | |||
900 | ||||
901 | err: ; | |||
902 | ||||
903 | } END_WITH_LOCAL_REFS(env)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,903), log_message_end ("%s()","PopLocalFrame")):((void)0)), ( env))))->PopLocalFrame))(env, ((void*)0)); }; | |||
904 | ||||
905 | return error; | |||
906 | } | |||
907 | ||||
908 | jvmtiError | |||
909 | jvmtiGetCapabilities(jvmtiCapabilities *caps) | |||
910 | { | |||
911 | if ( gdata->vmDead ) { | |||
912 | return AGENT_ERROR_VM_DEAD((jvmtiError)(JVMTI_ERROR_MAX+64+2)); | |||
913 | } | |||
914 | if (!gdata->haveCachedJvmtiCapabilities) { | |||
915 | jvmtiError error; | |||
916 | ||||
917 | error = JVMTI_FUNC_PTR(gdata->jvmti,GetCapabilities)(*((*((((gdata->log_flags & (0x00000004))?(log_message_begin ("JVMTI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,917), log_message_end ("%s()","GetCapabilities")):((void)0)) ,(gdata->jvmti))))->GetCapabilities)) | |||
918 | (gdata->jvmti, &(gdata->cachedJvmtiCapabilities)); | |||
919 | if (error != JVMTI_ERROR_NONE) { | |||
920 | return error; | |||
921 | } | |||
922 | gdata->haveCachedJvmtiCapabilities = JNI_TRUE1; | |||
923 | } | |||
924 | ||||
925 | *caps = gdata->cachedJvmtiCapabilities; | |||
926 | ||||
927 | return JVMTI_ERROR_NONE; | |||
928 | } | |||
929 | ||||
930 | static jint | |||
931 | jvmtiVersion(void) | |||
932 | { | |||
933 | if (gdata->cachedJvmtiVersion == 0) { | |||
934 | jvmtiError error; | |||
935 | error = JVMTI_FUNC_PTR(gdata->jvmti,GetVersionNumber)(*((*((((gdata->log_flags & (0x00000004))?(log_message_begin ("JVMTI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,935), log_message_end ("%s()","GetVersionNumber")):((void)0) ),(gdata->jvmti))))->GetVersionNumber)) | |||
936 | (gdata->jvmti, &(gdata->cachedJvmtiVersion)); | |||
937 | if (error != JVMTI_ERROR_NONE) { | |||
938 | EXIT_ERROR(error, "on getting the JVMTI version number"){ print_message(stderr, "JDWP exit error ", "\n", "%s(%d): %s [%s:%d]" , jvmtiErrorText((jvmtiError)error), error, ("on getting the JVMTI version number" ==((void*)0)?"":"on getting the JVMTI version number"), "/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" , 938); debugInit_exit((jvmtiError)error, "on getting the JVMTI version number" ); }; | |||
939 | } | |||
940 | } | |||
941 | return gdata->cachedJvmtiVersion; | |||
942 | } | |||
943 | ||||
944 | jint | |||
945 | jvmtiMajorVersion(void) | |||
946 | { | |||
947 | return (jvmtiVersion() & JVMTI_VERSION_MASK_MAJOR) | |||
948 | >> JVMTI_VERSION_SHIFT_MAJOR; | |||
949 | } | |||
950 | ||||
951 | jint | |||
952 | jvmtiMinorVersion(void) | |||
953 | { | |||
954 | return (jvmtiVersion() & JVMTI_VERSION_MASK_MINOR) | |||
955 | >> JVMTI_VERSION_SHIFT_MINOR; | |||
956 | } | |||
957 | ||||
958 | jint | |||
959 | jvmtiMicroVersion(void) | |||
960 | { | |||
961 | return (jvmtiVersion() & JVMTI_VERSION_MASK_MICRO) | |||
962 | >> JVMTI_VERSION_SHIFT_MICRO; | |||
963 | } | |||
964 | ||||
965 | jvmtiError | |||
966 | getSourceDebugExtension(jclass clazz, char **extensionPtr) | |||
967 | { | |||
968 | return JVMTI_FUNC_PTR(gdata->jvmti,GetSourceDebugExtension)(*((*((((gdata->log_flags & (0x00000004))?(log_message_begin ("JVMTI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,968), log_message_end ("%s()","GetSourceDebugExtension")):(( void)0)),(gdata->jvmti))))->GetSourceDebugExtension)) | |||
969 | (gdata->jvmti, clazz, extensionPtr); | |||
970 | } | |||
971 | ||||
972 | ||||
973 | static void | |||
974 | handleInterrupt(void) | |||
975 | { | |||
976 | /* | |||
977 | * An interrupt is handled: | |||
978 | * | |||
979 | * 1) for running application threads by deferring the interrupt | |||
980 | * until the current event handler has concluded. | |||
981 | * | |||
982 | * 2) for debugger threads by ignoring the interrupt; this is the | |||
983 | * most robust solution since debugger threads don't use interrupts | |||
984 | * to signal any condition. | |||
985 | * | |||
986 | * 3) for application threads that have not started or already | |||
987 | * ended by ignoring the interrupt. In the former case, the application | |||
988 | * is relying on timing to determine whether or not the thread sees | |||
989 | * the interrupt; in the latter case, the interrupt is meaningless. | |||
990 | */ | |||
991 | jthread thread = threadControl_currentThread(); | |||
992 | if ((thread != NULL((void*)0)) && (!threadControl_isDebugThread(thread))) { | |||
993 | threadControl_setPendingInterrupt(thread); | |||
994 | } | |||
995 | } | |||
996 | ||||
997 | static jvmtiError | |||
998 | ignore_vm_death(jvmtiError error) | |||
999 | { | |||
1000 | if (error == JVMTI_ERROR_WRONG_PHASE) { | |||
1001 | LOG_MISC(("VM_DEAD, in debugMonitor*()?"))((gdata->log_flags & (0x00000008)) ?(log_message_begin ("MISC","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,1001), log_message_end ("VM_DEAD, in debugMonitor*()?")):((void )0)); | |||
1002 | return JVMTI_ERROR_NONE; /* JVMTI does this, not JVMDI? */ | |||
1003 | } | |||
1004 | return error; | |||
1005 | } | |||
1006 | ||||
1007 | void | |||
1008 | debugMonitorEnter(jrawMonitorID monitor) | |||
1009 | { | |||
1010 | jvmtiError error; | |||
1011 | error = JVMTI_FUNC_PTR(gdata->jvmti,RawMonitorEnter)(*((*((((gdata->log_flags & (0x00000004))?(log_message_begin ("JVMTI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,1011), log_message_end ("%s()","RawMonitorEnter")):((void)0) ),(gdata->jvmti))))->RawMonitorEnter)) | |||
1012 | (gdata->jvmti, monitor); | |||
1013 | error = ignore_vm_death(error); | |||
1014 | if (error != JVMTI_ERROR_NONE) { | |||
1015 | EXIT_ERROR(error, "on raw monitor enter"){ print_message(stderr, "JDWP exit error ", "\n", "%s(%d): %s [%s:%d]" , jvmtiErrorText((jvmtiError)error), error, ("on raw monitor enter" ==((void*)0)?"":"on raw monitor enter"), "/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" , 1015); debugInit_exit((jvmtiError)error, "on raw monitor enter" ); }; | |||
1016 | } | |||
1017 | } | |||
1018 | ||||
1019 | void | |||
1020 | debugMonitorExit(jrawMonitorID monitor) | |||
1021 | { | |||
1022 | jvmtiError error; | |||
1023 | ||||
1024 | error = JVMTI_FUNC_PTR(gdata->jvmti,RawMonitorExit)(*((*((((gdata->log_flags & (0x00000004))?(log_message_begin ("JVMTI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,1024), log_message_end ("%s()","RawMonitorExit")):((void)0)) ,(gdata->jvmti))))->RawMonitorExit)) | |||
1025 | (gdata->jvmti, monitor); | |||
1026 | error = ignore_vm_death(error); | |||
1027 | if (error != JVMTI_ERROR_NONE) { | |||
1028 | EXIT_ERROR(error, "on raw monitor exit"){ print_message(stderr, "JDWP exit error ", "\n", "%s(%d): %s [%s:%d]" , jvmtiErrorText((jvmtiError)error), error, ("on raw monitor exit" ==((void*)0)?"":"on raw monitor exit"), "/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" , 1028); debugInit_exit((jvmtiError)error, "on raw monitor exit" ); }; | |||
1029 | } | |||
1030 | } | |||
1031 | ||||
1032 | void | |||
1033 | debugMonitorWait(jrawMonitorID monitor) | |||
1034 | { | |||
1035 | jvmtiError error; | |||
1036 | error = JVMTI_FUNC_PTR(gdata->jvmti,RawMonitorWait)(*((*((((gdata->log_flags & (0x00000004))?(log_message_begin ("JVMTI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,1036), log_message_end ("%s()","RawMonitorWait")):((void)0)) ,(gdata->jvmti))))->RawMonitorWait)) | |||
1037 | (gdata->jvmti, monitor, ((jlong)(-1))); | |||
1038 | ||||
1039 | /* | |||
1040 | * According to the JLS (17.8), here we have | |||
1041 | * either : | |||
1042 | * a- been notified | |||
1043 | * b- gotten a suprious wakeup | |||
1044 | * c- been interrupted | |||
1045 | * If both a and c have happened, the VM must choose | |||
1046 | * which way to return - a or c. If it chooses c | |||
1047 | * then the notify is gone - either to some other | |||
1048 | * thread that is also waiting, or it is dropped | |||
1049 | * on the floor. | |||
1050 | * | |||
1051 | * a is what we expect. b won't hurt us any - | |||
1052 | * callers should be programmed to handle | |||
1053 | * spurious wakeups. In case of c, | |||
1054 | * then the interrupt has been cleared, but | |||
1055 | * we don't want to consume it. It came from | |||
1056 | * user code and is intended for user code, not us. | |||
1057 | * So, we will remember that the interrupt has | |||
1058 | * occurred and re-activate it when this thread | |||
1059 | * goes back into user code. | |||
1060 | * That being said, what do we do here? Since | |||
1061 | * we could have been notified too, here we will | |||
1062 | * just pretend that we have been. It won't hurt | |||
1063 | * anything to return in the same way as if | |||
1064 | * we were notified since callers have to be able to | |||
1065 | * handle spurious wakeups anyway. | |||
1066 | */ | |||
1067 | if (error == JVMTI_ERROR_INTERRUPT) { | |||
1068 | handleInterrupt(); | |||
1069 | error = JVMTI_ERROR_NONE; | |||
1070 | } | |||
1071 | error = ignore_vm_death(error); | |||
1072 | if (error != JVMTI_ERROR_NONE) { | |||
1073 | EXIT_ERROR(error, "on raw monitor wait"){ print_message(stderr, "JDWP exit error ", "\n", "%s(%d): %s [%s:%d]" , jvmtiErrorText((jvmtiError)error), error, ("on raw monitor wait" ==((void*)0)?"":"on raw monitor wait"), "/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" , 1073); debugInit_exit((jvmtiError)error, "on raw monitor wait" ); }; | |||
1074 | } | |||
1075 | } | |||
1076 | ||||
1077 | void | |||
1078 | debugMonitorTimedWait(jrawMonitorID monitor, jlong millis) | |||
1079 | { | |||
1080 | jvmtiError error; | |||
1081 | error = JVMTI_FUNC_PTR(gdata->jvmti,RawMonitorWait)(*((*((((gdata->log_flags & (0x00000004))?(log_message_begin ("JVMTI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,1081), log_message_end ("%s()","RawMonitorWait")):((void)0)) ,(gdata->jvmti))))->RawMonitorWait)) | |||
1082 | (gdata->jvmti, monitor, millis); | |||
1083 | if (error == JVMTI_ERROR_INTERRUPT) { | |||
1084 | /* See comment above */ | |||
1085 | handleInterrupt(); | |||
1086 | error = JVMTI_ERROR_NONE; | |||
1087 | } | |||
1088 | error = ignore_vm_death(error); | |||
1089 | if (error != JVMTI_ERROR_NONE) { | |||
1090 | EXIT_ERROR(error, "on raw monitor timed wait"){ print_message(stderr, "JDWP exit error ", "\n", "%s(%d): %s [%s:%d]" , jvmtiErrorText((jvmtiError)error), error, ("on raw monitor timed wait" ==((void*)0)?"":"on raw monitor timed wait"), "/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" , 1090); debugInit_exit((jvmtiError)error, "on raw monitor timed wait" ); }; | |||
1091 | } | |||
1092 | } | |||
1093 | ||||
1094 | void | |||
1095 | debugMonitorNotify(jrawMonitorID monitor) | |||
1096 | { | |||
1097 | jvmtiError error; | |||
1098 | ||||
1099 | error = JVMTI_FUNC_PTR(gdata->jvmti,RawMonitorNotify)(*((*((((gdata->log_flags & (0x00000004))?(log_message_begin ("JVMTI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,1099), log_message_end ("%s()","RawMonitorNotify")):((void)0 )),(gdata->jvmti))))->RawMonitorNotify)) | |||
1100 | (gdata->jvmti, monitor); | |||
1101 | error = ignore_vm_death(error); | |||
1102 | if (error != JVMTI_ERROR_NONE) { | |||
1103 | EXIT_ERROR(error, "on raw monitor notify"){ print_message(stderr, "JDWP exit error ", "\n", "%s(%d): %s [%s:%d]" , jvmtiErrorText((jvmtiError)error), error, ("on raw monitor notify" ==((void*)0)?"":"on raw monitor notify"), "/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" , 1103); debugInit_exit((jvmtiError)error, "on raw monitor notify" ); }; | |||
1104 | } | |||
1105 | } | |||
1106 | ||||
1107 | void | |||
1108 | debugMonitorNotifyAll(jrawMonitorID monitor) | |||
1109 | { | |||
1110 | jvmtiError error; | |||
1111 | ||||
1112 | error = JVMTI_FUNC_PTR(gdata->jvmti,RawMonitorNotifyAll)(*((*((((gdata->log_flags & (0x00000004))?(log_message_begin ("JVMTI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,1112), log_message_end ("%s()","RawMonitorNotifyAll")):((void )0)),(gdata->jvmti))))->RawMonitorNotifyAll)) | |||
1113 | (gdata->jvmti, monitor); | |||
1114 | error = ignore_vm_death(error); | |||
1115 | if (error != JVMTI_ERROR_NONE) { | |||
1116 | EXIT_ERROR(error, "on raw monitor notify all"){ print_message(stderr, "JDWP exit error ", "\n", "%s(%d): %s [%s:%d]" , jvmtiErrorText((jvmtiError)error), error, ("on raw monitor notify all" ==((void*)0)?"":"on raw monitor notify all"), "/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" , 1116); debugInit_exit((jvmtiError)error, "on raw monitor notify all" ); }; | |||
1117 | } | |||
1118 | } | |||
1119 | ||||
1120 | jrawMonitorID | |||
1121 | debugMonitorCreate(char *name) | |||
1122 | { | |||
1123 | jrawMonitorID monitor; | |||
1124 | jvmtiError error; | |||
1125 | ||||
1126 | error = JVMTI_FUNC_PTR(gdata->jvmti,CreateRawMonitor)(*((*((((gdata->log_flags & (0x00000004))?(log_message_begin ("JVMTI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,1126), log_message_end ("%s()","CreateRawMonitor")):((void)0 )),(gdata->jvmti))))->CreateRawMonitor)) | |||
1127 | (gdata->jvmti, name, &monitor); | |||
1128 | if (error != JVMTI_ERROR_NONE) { | |||
1129 | EXIT_ERROR(error, "on creation of a raw monitor"){ print_message(stderr, "JDWP exit error ", "\n", "%s(%d): %s [%s:%d]" , jvmtiErrorText((jvmtiError)error), error, ("on creation of a raw monitor" ==((void*)0)?"":"on creation of a raw monitor"), "/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" , 1129); debugInit_exit((jvmtiError)error, "on creation of a raw monitor" ); }; | |||
1130 | } | |||
1131 | return monitor; | |||
1132 | } | |||
1133 | ||||
1134 | void | |||
1135 | debugMonitorDestroy(jrawMonitorID monitor) | |||
1136 | { | |||
1137 | jvmtiError error; | |||
1138 | ||||
1139 | error = JVMTI_FUNC_PTR(gdata->jvmti,DestroyRawMonitor)(*((*((((gdata->log_flags & (0x00000004))?(log_message_begin ("JVMTI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,1139), log_message_end ("%s()","DestroyRawMonitor")):((void) 0)),(gdata->jvmti))))->DestroyRawMonitor)) | |||
1140 | (gdata->jvmti, monitor); | |||
1141 | error = ignore_vm_death(error); | |||
1142 | if (error != JVMTI_ERROR_NONE) { | |||
1143 | EXIT_ERROR(error, "on destruction of raw monitor"){ print_message(stderr, "JDWP exit error ", "\n", "%s(%d): %s [%s:%d]" , jvmtiErrorText((jvmtiError)error), error, ("on destruction of raw monitor" ==((void*)0)?"":"on destruction of raw monitor"), "/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" , 1143); debugInit_exit((jvmtiError)error, "on destruction of raw monitor" ); }; | |||
1144 | } | |||
1145 | } | |||
1146 | ||||
1147 | /** | |||
1148 | * Return array of all threads (must be inside a WITH_LOCAL_REFS) | |||
1149 | */ | |||
1150 | jthread * | |||
1151 | allThreads(jint *count) | |||
1152 | { | |||
1153 | jthread *threads; | |||
1154 | jvmtiError error; | |||
1155 | ||||
1156 | *count = 0; | |||
1157 | threads = NULL((void*)0); | |||
1158 | error = JVMTI_FUNC_PTR(gdata->jvmti,GetAllThreads)(*((*((((gdata->log_flags & (0x00000004))?(log_message_begin ("JVMTI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,1158), log_message_end ("%s()","GetAllThreads")):((void)0)), (gdata->jvmti))))->GetAllThreads)) | |||
1159 | (gdata->jvmti, count, &threads); | |||
1160 | if (error == AGENT_ERROR_OUT_OF_MEMORY((jvmtiError)(JVMTI_ERROR_MAX+64+8))) { | |||
1161 | return NULL((void*)0); /* Let caller deal with no memory? */ | |||
1162 | } | |||
1163 | if (error != JVMTI_ERROR_NONE) { | |||
1164 | EXIT_ERROR(error, "getting all threads"){ print_message(stderr, "JDWP exit error ", "\n", "%s(%d): %s [%s:%d]" , jvmtiErrorText((jvmtiError)error), error, ("getting all threads" ==((void*)0)?"":"getting all threads"), "/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" , 1164); debugInit_exit((jvmtiError)error, "getting all threads" ); }; | |||
1165 | } | |||
1166 | return threads; | |||
1167 | } | |||
1168 | ||||
1169 | /** | |||
1170 | * Fill the passed in structure with thread group info. | |||
1171 | * name field is JVMTI allocated. parent is global ref. | |||
1172 | */ | |||
1173 | void | |||
1174 | threadGroupInfo(jthreadGroup group, jvmtiThreadGroupInfo *info) | |||
1175 | { | |||
1176 | jvmtiError error; | |||
1177 | ||||
1178 | error = JVMTI_FUNC_PTR(gdata->jvmti,GetThreadGroupInfo)(*((*((((gdata->log_flags & (0x00000004))?(log_message_begin ("JVMTI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,1178), log_message_end ("%s()","GetThreadGroupInfo")):((void )0)),(gdata->jvmti))))->GetThreadGroupInfo)) | |||
1179 | (gdata->jvmti, group, info); | |||
1180 | if (error != JVMTI_ERROR_NONE) { | |||
1181 | EXIT_ERROR(error, "on getting thread group info"){ print_message(stderr, "JDWP exit error ", "\n", "%s(%d): %s [%s:%d]" , jvmtiErrorText((jvmtiError)error), error, ("on getting thread group info" ==((void*)0)?"":"on getting thread group info"), "/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" , 1181); debugInit_exit((jvmtiError)error, "on getting thread group info" ); }; | |||
1182 | } | |||
1183 | } | |||
1184 | ||||
1185 | /** | |||
1186 | * Return class signature string | |||
1187 | */ | |||
1188 | jvmtiError | |||
1189 | classSignature(jclass clazz, char **psignature, char **pgeneric_signature) | |||
1190 | { | |||
1191 | jvmtiError error; | |||
1192 | char *signature = NULL((void*)0); | |||
1193 | ||||
1194 | /* | |||
1195 | * pgeneric_signature can be NULL, and GetClassSignature | |||
1196 | * accepts NULL. | |||
1197 | */ | |||
1198 | error = JVMTI_FUNC_PTR(gdata->jvmti,GetClassSignature)(*((*((((gdata->log_flags & (0x00000004))?(log_message_begin ("JVMTI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,1198), log_message_end ("%s()","GetClassSignature")):((void) 0)),(gdata->jvmti))))->GetClassSignature)) | |||
1199 | (gdata->jvmti, clazz, &signature, pgeneric_signature); | |||
1200 | ||||
1201 | if ( psignature != NULL((void*)0) ) { | |||
1202 | *psignature = signature; | |||
1203 | } else if ( signature != NULL((void*)0) ) { | |||
1204 | jvmtiDeallocate(signature); | |||
1205 | } | |||
1206 | return error; | |||
1207 | } | |||
1208 | ||||
1209 | /* Get class name (not signature) */ | |||
1210 | char * | |||
1211 | getClassname(jclass clazz) | |||
1212 | { | |||
1213 | char *classname; | |||
1214 | ||||
1215 | classname = NULL((void*)0); | |||
1216 | if ( clazz != NULL((void*)0) ) { | |||
1217 | if (classSignature(clazz, &classname, NULL((void*)0)) != JVMTI_ERROR_NONE) { | |||
1218 | classname = NULL((void*)0); | |||
1219 | } else { | |||
1220 | /* Convert in place */ | |||
1221 | convertSignatureToClassname(classname); | |||
1222 | } | |||
1223 | } | |||
1224 | return classname; /* Caller must free this memory */ | |||
1225 | } | |||
1226 | ||||
1227 | void | |||
1228 | writeGenericSignature(PacketOutputStream *out, char *genericSignature) | |||
1229 | { | |||
1230 | if (genericSignature == NULL((void*)0)) { | |||
1231 | (void)outStream_writeString(out, ""); | |||
1232 | } else { | |||
1233 | (void)outStream_writeString(out, genericSignature); | |||
1234 | } | |||
1235 | } | |||
1236 | ||||
1237 | jint | |||
1238 | classStatus(jclass clazz) | |||
1239 | { | |||
1240 | jint status; | |||
1241 | jvmtiError error; | |||
1242 | ||||
1243 | error = JVMTI_FUNC_PTR(gdata->jvmti,GetClassStatus)(*((*((((gdata->log_flags & (0x00000004))?(log_message_begin ("JVMTI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,1243), log_message_end ("%s()","GetClassStatus")):((void)0)) ,(gdata->jvmti))))->GetClassStatus)) | |||
1244 | (gdata->jvmti, clazz, &status); | |||
1245 | if (error != JVMTI_ERROR_NONE) { | |||
1246 | EXIT_ERROR(error, "on getting class status"){ print_message(stderr, "JDWP exit error ", "\n", "%s(%d): %s [%s:%d]" , jvmtiErrorText((jvmtiError)error), error, ("on getting class status" ==((void*)0)?"":"on getting class status"), "/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" , 1246); debugInit_exit((jvmtiError)error, "on getting class status" ); }; | |||
1247 | } | |||
1248 | return status; | |||
1249 | } | |||
1250 | ||||
1251 | static jboolean | |||
1252 | isArrayClass(jclass clazz) | |||
1253 | { | |||
1254 | jboolean isArray = JNI_FALSE0; | |||
1255 | jvmtiError error; | |||
1256 | ||||
1257 | error = JVMTI_FUNC_PTR(gdata->jvmti,IsArrayClass)(*((*((((gdata->log_flags & (0x00000004))?(log_message_begin ("JVMTI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,1257), log_message_end ("%s()","IsArrayClass")):((void)0)),( gdata->jvmti))))->IsArrayClass)) | |||
1258 | (gdata->jvmti, clazz, &isArray); | |||
1259 | if (error != JVMTI_ERROR_NONE) { | |||
1260 | EXIT_ERROR(error, "on checking for an array class"){ print_message(stderr, "JDWP exit error ", "\n", "%s(%d): %s [%s:%d]" , jvmtiErrorText((jvmtiError)error), error, ("on checking for an array class" ==((void*)0)?"":"on checking for an array class"), "/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" , 1260); debugInit_exit((jvmtiError)error, "on checking for an array class" ); }; | |||
1261 | } | |||
1262 | return isArray; | |||
1263 | } | |||
1264 | ||||
1265 | static jboolean | |||
1266 | isInterface(jclass clazz) | |||
1267 | { | |||
1268 | jboolean isInterface = JNI_FALSE0; | |||
1269 | jvmtiError error; | |||
1270 | ||||
1271 | error = JVMTI_FUNC_PTR(gdata->jvmti,IsInterface)(*((*((((gdata->log_flags & (0x00000004))?(log_message_begin ("JVMTI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,1271), log_message_end ("%s()","IsInterface")):((void)0)),(gdata ->jvmti))))->IsInterface)) | |||
1272 | (gdata->jvmti, clazz, &isInterface); | |||
1273 | if (error != JVMTI_ERROR_NONE) { | |||
1274 | EXIT_ERROR(error, "on checking for an interface"){ print_message(stderr, "JDWP exit error ", "\n", "%s(%d): %s [%s:%d]" , jvmtiErrorText((jvmtiError)error), error, ("on checking for an interface" ==((void*)0)?"":"on checking for an interface"), "/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" , 1274); debugInit_exit((jvmtiError)error, "on checking for an interface" ); }; | |||
1275 | } | |||
1276 | return isInterface; | |||
1277 | } | |||
1278 | ||||
1279 | jvmtiError | |||
1280 | isFieldSynthetic(jclass clazz, jfieldID field, jboolean *psynthetic) | |||
1281 | { | |||
1282 | jvmtiError error; | |||
1283 | ||||
1284 | error = JVMTI_FUNC_PTR(gdata->jvmti,IsFieldSynthetic)(*((*((((gdata->log_flags & (0x00000004))?(log_message_begin ("JVMTI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,1284), log_message_end ("%s()","IsFieldSynthetic")):((void)0 )),(gdata->jvmti))))->IsFieldSynthetic)) | |||
1285 | (gdata->jvmti, clazz, field, psynthetic); | |||
1286 | if ( error == JVMTI_ERROR_MUST_POSSESS_CAPABILITY ) { | |||
1287 | /* If the query is not supported, we assume it is not synthetic. */ | |||
1288 | *psynthetic = JNI_FALSE0; | |||
1289 | return JVMTI_ERROR_NONE; | |||
1290 | } | |||
1291 | return error; | |||
1292 | } | |||
1293 | ||||
1294 | jvmtiError | |||
1295 | isMethodSynthetic(jmethodID method, jboolean *psynthetic) | |||
1296 | { | |||
1297 | jvmtiError error; | |||
1298 | ||||
1299 | error = JVMTI_FUNC_PTR(gdata->jvmti,IsMethodSynthetic)(*((*((((gdata->log_flags & (0x00000004))?(log_message_begin ("JVMTI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,1299), log_message_end ("%s()","IsMethodSynthetic")):((void) 0)),(gdata->jvmti))))->IsMethodSynthetic)) | |||
1300 | (gdata->jvmti, method, psynthetic); | |||
1301 | if ( error == JVMTI_ERROR_MUST_POSSESS_CAPABILITY ) { | |||
1302 | /* If the query is not supported, we assume it is not synthetic. */ | |||
1303 | *psynthetic = JNI_FALSE0; | |||
1304 | return JVMTI_ERROR_NONE; | |||
1305 | } | |||
1306 | return error; | |||
1307 | } | |||
1308 | ||||
1309 | jboolean | |||
1310 | isMethodNative(jmethodID method) | |||
1311 | { | |||
1312 | jboolean isNative = JNI_FALSE0; | |||
1313 | jvmtiError error; | |||
1314 | ||||
1315 | error = JVMTI_FUNC_PTR(gdata->jvmti,IsMethodNative)(*((*((((gdata->log_flags & (0x00000004))?(log_message_begin ("JVMTI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,1315), log_message_end ("%s()","IsMethodNative")):((void)0)) ,(gdata->jvmti))))->IsMethodNative)) | |||
1316 | (gdata->jvmti, method, &isNative); | |||
1317 | if (error != JVMTI_ERROR_NONE) { | |||
1318 | EXIT_ERROR(error, "on checking for a native interface"){ print_message(stderr, "JDWP exit error ", "\n", "%s(%d): %s [%s:%d]" , jvmtiErrorText((jvmtiError)error), error, ("on checking for a native interface" ==((void*)0)?"":"on checking for a native interface"), "/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" , 1318); debugInit_exit((jvmtiError)error, "on checking for a native interface" ); }; | |||
1319 | } | |||
1320 | return isNative; | |||
1321 | } | |||
1322 | ||||
1323 | jboolean | |||
1324 | isSameObject(JNIEnv *env, jobject o1, jobject o2) | |||
1325 | { | |||
1326 | if ( o1==o2 ) { | |||
1327 | return JNI_TRUE1; | |||
1328 | } | |||
1329 | return FUNC_PTR(env,IsSameObject)(*((*(env))->IsSameObject))(env, o1, o2); | |||
1330 | } | |||
1331 | ||||
1332 | jint | |||
1333 | objectHashCode(jobject object) | |||
1334 | { | |||
1335 | jint hashCode = 0; | |||
1336 | jvmtiError error; | |||
1337 | ||||
1338 | if ( object!=NULL((void*)0) ) { | |||
1339 | error = JVMTI_FUNC_PTR(gdata->jvmti,GetObjectHashCode)(*((*((((gdata->log_flags & (0x00000004))?(log_message_begin ("JVMTI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,1339), log_message_end ("%s()","GetObjectHashCode")):((void) 0)),(gdata->jvmti))))->GetObjectHashCode)) | |||
1340 | (gdata->jvmti, object, &hashCode); | |||
1341 | if (error != JVMTI_ERROR_NONE) { | |||
1342 | EXIT_ERROR(error, "on getting an object hash code"){ print_message(stderr, "JDWP exit error ", "\n", "%s(%d): %s [%s:%d]" , jvmtiErrorText((jvmtiError)error), error, ("on getting an object hash code" ==((void*)0)?"":"on getting an object hash code"), "/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" , 1342); debugInit_exit((jvmtiError)error, "on getting an object hash code" ); }; | |||
1343 | } | |||
1344 | } | |||
1345 | return hashCode; | |||
1346 | } | |||
1347 | ||||
1348 | /* Get all implemented interfaces (must be inside a WITH_LOCAL_REFS) */ | |||
1349 | jvmtiError | |||
1350 | allInterfaces(jclass clazz, jclass **ppinterfaces, jint *pcount) | |||
1351 | { | |||
1352 | jvmtiError error; | |||
1353 | ||||
1354 | *pcount = 0; | |||
1355 | *ppinterfaces = NULL((void*)0); | |||
1356 | error = JVMTI_FUNC_PTR(gdata->jvmti,GetImplementedInterfaces)(*((*((((gdata->log_flags & (0x00000004))?(log_message_begin ("JVMTI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,1356), log_message_end ("%s()","GetImplementedInterfaces")): ((void)0)),(gdata->jvmti))))->GetImplementedInterfaces) ) | |||
1357 | (gdata->jvmti, clazz, pcount, ppinterfaces); | |||
1358 | return error; | |||
1359 | } | |||
1360 | ||||
1361 | /* Get all loaded classes (must be inside a WITH_LOCAL_REFS) */ | |||
1362 | jvmtiError | |||
1363 | allLoadedClasses(jclass **ppclasses, jint *pcount) | |||
1364 | { | |||
1365 | jvmtiError error; | |||
1366 | ||||
1367 | *pcount = 0; | |||
1368 | *ppclasses = NULL((void*)0); | |||
1369 | error = JVMTI_FUNC_PTR(gdata->jvmti,GetLoadedClasses)(*((*((((gdata->log_flags & (0x00000004))?(log_message_begin ("JVMTI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,1369), log_message_end ("%s()","GetLoadedClasses")):((void)0 )),(gdata->jvmti))))->GetLoadedClasses)) | |||
1370 | (gdata->jvmti, pcount, ppclasses); | |||
1371 | return error; | |||
1372 | } | |||
1373 | ||||
1374 | /* Get all loaded classes for a loader (must be inside a WITH_LOCAL_REFS) */ | |||
1375 | jvmtiError | |||
1376 | allClassLoaderClasses(jobject loader, jclass **ppclasses, jint *pcount) | |||
1377 | { | |||
1378 | jvmtiError error; | |||
1379 | ||||
1380 | *pcount = 0; | |||
1381 | *ppclasses = NULL((void*)0); | |||
1382 | error = JVMTI_FUNC_PTR(gdata->jvmti,GetClassLoaderClasses)(*((*((((gdata->log_flags & (0x00000004))?(log_message_begin ("JVMTI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,1382), log_message_end ("%s()","GetClassLoaderClasses")):((void )0)),(gdata->jvmti))))->GetClassLoaderClasses)) | |||
1383 | (gdata->jvmti, loader, pcount, ppclasses); | |||
1384 | return error; | |||
1385 | } | |||
1386 | ||||
1387 | static jboolean | |||
1388 | is_a_nested_class(char *outer_sig, int outer_sig_len, char *sig, int sep) | |||
1389 | { | |||
1390 | char *inner; | |||
1391 | ||||
1392 | /* Assumed outer class signature is "LOUTERCLASSNAME;" | |||
1393 | * inner class signature is "LOUTERCLASSNAME$INNERNAME;" | |||
1394 | * | |||
1395 | * INNERNAME can take the form: | |||
1396 | * [0-9][1-9]* anonymous class somewhere in the file | |||
1397 | * [0-9][1-9]*NAME local class somewhere in the OUTER class | |||
1398 | * NAME nested class in OUTER | |||
1399 | * | |||
1400 | * If NAME itself contains a $ (sep) then classname is further nested | |||
1401 | * inside another class. | |||
1402 | * | |||
1403 | */ | |||
1404 | ||||
1405 | /* Check prefix first */ | |||
1406 | if ( strncmp(sig, outer_sig, outer_sig_len-1) != 0 ) { | |||
1407 | return JNI_FALSE0; | |||
1408 | } | |||
1409 | ||||
1410 | /* Prefix must be followed by a $ (sep) */ | |||
1411 | if ( sig[outer_sig_len-1] != sep ) { | |||
1412 | return JNI_FALSE0; /* No sep follows the match, must not be nested. */ | |||
1413 | } | |||
1414 | ||||
1415 | /* Walk past any digits, if we reach the end, must be pure anonymous */ | |||
1416 | inner = sig + outer_sig_len; | |||
1417 | #if 1 /* We want to return local classes */ | |||
1418 | while ( *inner && isdigit(*inner)((*__ctype_b_loc ())[(int) ((*inner))] & (unsigned short int ) _ISdigit) ) { | |||
1419 | inner++; | |||
1420 | } | |||
1421 | /* But anonymous class names can't be trusted. */ | |||
1422 | if ( *inner == ';' ) { | |||
1423 | return JNI_FALSE0; /* A pure anonymous class */ | |||
1424 | } | |||
1425 | #else | |||
1426 | if ( *inner && isdigit(*inner)((*__ctype_b_loc ())[(int) ((*inner))] & (unsigned short int ) _ISdigit) ) { | |||
1427 | return JNI_FALSE0; /* A pure anonymous or local class */ | |||
1428 | } | |||
1429 | #endif | |||
1430 | ||||
1431 | /* Nested deeper? */ | |||
1432 | if ( strchr(inner, sep) != NULL((void*)0) ) { | |||
1433 | return JNI_FALSE0; /* Nested deeper than we want? */ | |||
1434 | } | |||
1435 | return JNI_TRUE1; | |||
1436 | } | |||
1437 | ||||
1438 | /* Get all nested classes for a class (must be inside a WITH_LOCAL_REFS) */ | |||
1439 | jvmtiError | |||
1440 | allNestedClasses(jclass parent_clazz, jclass **ppnested, jint *pcount) | |||
1441 | { | |||
1442 | jvmtiError error; | |||
1443 | jobject parent_loader; | |||
1444 | jclass *classes; | |||
1445 | char *signature; | |||
1446 | size_t len; | |||
1447 | jint count; | |||
1448 | jint ncount; | |||
1449 | int i; | |||
1450 | ||||
1451 | *ppnested = NULL((void*)0); | |||
1452 | *pcount = 0; | |||
1453 | ||||
1454 | parent_loader = NULL((void*)0); | |||
1455 | classes = NULL((void*)0); | |||
1456 | signature = NULL((void*)0); | |||
1457 | count = 0; | |||
1458 | ncount = 0; | |||
1459 | ||||
1460 | error = classLoader(parent_clazz, &parent_loader); | |||
1461 | if (error != JVMTI_ERROR_NONE) { | |||
1462 | return error; | |||
1463 | } | |||
1464 | error = classSignature(parent_clazz, &signature, NULL((void*)0)); | |||
1465 | if (error != JVMTI_ERROR_NONE) { | |||
1466 | return error; | |||
1467 | } | |||
1468 | len = strlen(signature); | |||
1469 | ||||
1470 | error = allClassLoaderClasses(parent_loader, &classes, &count); | |||
1471 | if ( error != JVMTI_ERROR_NONE ) { | |||
1472 | jvmtiDeallocate(signature); | |||
1473 | return error; | |||
1474 | } | |||
1475 | ||||
1476 | for (i=0; i<count; i++) { | |||
1477 | jclass clazz; | |||
1478 | char *candidate_signature; | |||
1479 | ||||
1480 | clazz = classes[i]; | |||
1481 | candidate_signature = NULL((void*)0); | |||
1482 | error = classSignature(clazz, &candidate_signature, NULL((void*)0)); | |||
1483 | if (error != JVMTI_ERROR_NONE) { | |||
1484 | break; | |||
1485 | } | |||
1486 | ||||
1487 | if ( is_a_nested_class(signature, (int)len, candidate_signature, '$') || | |||
1488 | is_a_nested_class(signature, (int)len, candidate_signature, '#') ) { | |||
1489 | /* Float nested classes to top */ | |||
1490 | classes[i] = classes[ncount]; | |||
1491 | classes[ncount++] = clazz; | |||
1492 | } | |||
1493 | jvmtiDeallocate(candidate_signature); | |||
1494 | } | |||
1495 | ||||
1496 | jvmtiDeallocate(signature); | |||
1497 | ||||
1498 | if ( count != 0 && ncount == 0 ) { | |||
1499 | jvmtiDeallocate(classes); | |||
1500 | classes = NULL((void*)0); | |||
1501 | } | |||
1502 | ||||
1503 | *ppnested = classes; | |||
1504 | *pcount = ncount; | |||
1505 | return error; | |||
1506 | } | |||
1507 | ||||
1508 | void | |||
1509 | createLocalRefSpace(JNIEnv *env, jint capacity) | |||
1510 | { | |||
1511 | /* | |||
1512 | * Save current exception since it might get overwritten by | |||
1513 | * the calls below. Note we must depend on space in the existing | |||
1514 | * frame because asking for a new frame may generate an exception. | |||
1515 | */ | |||
1516 | jobject throwable = JNI_FUNC_PTR(env,ExceptionOccurred)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,1516), log_message_end ("%s()","ExceptionOccurred")):((void) 0)), (env))))->ExceptionOccurred))(env); | |||
1517 | ||||
1518 | /* | |||
1519 | * Use the current frame if necessary; otherwise create a new one | |||
1520 | */ | |||
1521 | if (JNI_FUNC_PTR(env,PushLocalFrame)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,1521), log_message_end ("%s()","PushLocalFrame")):((void)0)) , (env))))->PushLocalFrame))(env, capacity) < 0) { | |||
1522 | EXIT_ERROR(AGENT_ERROR_OUT_OF_MEMORY,"PushLocalFrame: Unable to push JNI frame"){ print_message(stderr, "JDWP exit error ", "\n", "%s(%d): %s [%s:%d]" , jvmtiErrorText((jvmtiError)((jvmtiError)(JVMTI_ERROR_MAX+64 +8))), ((jvmtiError)(JVMTI_ERROR_MAX+64+8)), ("PushLocalFrame: Unable to push JNI frame" ==((void*)0)?"":"PushLocalFrame: Unable to push JNI frame"), "/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" , 1522); debugInit_exit((jvmtiError)((jvmtiError)(JVMTI_ERROR_MAX +64+8)), "PushLocalFrame: Unable to push JNI frame"); }; | |||
1523 | } | |||
1524 | ||||
1525 | /* | |||
1526 | * TO DO: This could be more efficient if it used EnsureLocalCapacity, | |||
1527 | * but that would not work if two functions on the call stack | |||
1528 | * use this function. We would need to either track reserved | |||
1529 | * references on a per-thread basis or come up with a convention | |||
1530 | * that would prevent two functions from depending on this function | |||
1531 | * at the same time. | |||
1532 | */ | |||
1533 | ||||
1534 | /* | |||
1535 | * Restore exception state from before call | |||
1536 | */ | |||
1537 | if (throwable != NULL((void*)0)) { | |||
1538 | JNI_FUNC_PTR(env,Throw)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,1538), log_message_end ("%s()","Throw")):((void)0)), (env))) )->Throw))(env, throwable); | |||
1539 | } else { | |||
1540 | JNI_FUNC_PTR(env,ExceptionClear)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,1540), log_message_end ("%s()","ExceptionClear")):((void)0)) , (env))))->ExceptionClear))(env); | |||
1541 | } | |||
1542 | } | |||
1543 | ||||
1544 | jboolean | |||
1545 | isClass(jobject object) | |||
1546 | { | |||
1547 | JNIEnv *env = getEnv(); | |||
1548 | return JNI_FUNC_PTR(env,IsInstanceOf)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,1548), log_message_end ("%s()","IsInstanceOf")):((void)0)), ( env))))->IsInstanceOf))(env, object, gdata->classClass); | |||
1549 | } | |||
1550 | ||||
1551 | jboolean | |||
1552 | isThread(jobject object) | |||
1553 | { | |||
1554 | JNIEnv *env = getEnv(); | |||
1555 | return JNI_FUNC_PTR(env,IsInstanceOf)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,1555), log_message_end ("%s()","IsInstanceOf")):((void)0)), ( env))))->IsInstanceOf))(env, object, gdata->threadClass); | |||
1556 | } | |||
1557 | ||||
1558 | jboolean | |||
1559 | isThreadGroup(jobject object) | |||
1560 | { | |||
1561 | JNIEnv *env = getEnv(); | |||
1562 | return JNI_FUNC_PTR(env,IsInstanceOf)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,1562), log_message_end ("%s()","IsInstanceOf")):((void)0)), ( env))))->IsInstanceOf))(env, object, gdata->threadGroupClass); | |||
1563 | } | |||
1564 | ||||
1565 | jboolean | |||
1566 | isString(jobject object) | |||
1567 | { | |||
1568 | JNIEnv *env = getEnv(); | |||
1569 | return JNI_FUNC_PTR(env,IsInstanceOf)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,1569), log_message_end ("%s()","IsInstanceOf")):((void)0)), ( env))))->IsInstanceOf))(env, object, gdata->stringClass); | |||
1570 | } | |||
1571 | ||||
1572 | jboolean | |||
1573 | isClassLoader(jobject object) | |||
1574 | { | |||
1575 | JNIEnv *env = getEnv(); | |||
1576 | return JNI_FUNC_PTR(env,IsInstanceOf)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,1576), log_message_end ("%s()","IsInstanceOf")):((void)0)), ( env))))->IsInstanceOf))(env, object, gdata->classLoaderClass); | |||
1577 | } | |||
1578 | ||||
1579 | jboolean | |||
1580 | isArray(jobject object) | |||
1581 | { | |||
1582 | JNIEnv *env = getEnv(); | |||
1583 | jboolean is; | |||
1584 | ||||
1585 | WITH_LOCAL_REFS(env, 1)createLocalRefSpace(env, 1); { { | |||
1586 | jclass clazz; | |||
1587 | clazz = JNI_FUNC_PTR(env,GetObjectClass)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,1587), log_message_end ("%s()","GetObjectClass")):((void)0)) , (env))))->GetObjectClass))(env, object); | |||
1588 | is = isArrayClass(clazz); | |||
1589 | } END_WITH_LOCAL_REFS(env)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,1589), log_message_end ("%s()","PopLocalFrame")):((void)0)), (env))))->PopLocalFrame))(env, ((void*)0)); }; | |||
1590 | ||||
1591 | return is; | |||
1592 | } | |||
1593 | ||||
1594 | /** | |||
1595 | * Return property value as jstring | |||
1596 | */ | |||
1597 | static jstring | |||
1598 | getPropertyValue(JNIEnv *env, char *propertyName) | |||
1599 | { | |||
1600 | jstring valueString; | |||
1601 | jstring nameString; | |||
1602 | ||||
1603 | valueString = NULL((void*)0); | |||
1604 | ||||
1605 | /* Create new String object to hold the property name */ | |||
1606 | nameString = JNI_FUNC_PTR(env,NewStringUTF)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,1606), log_message_end ("%s()","NewStringUTF")):((void)0)), ( env))))->NewStringUTF))(env, propertyName); | |||
1607 | if (JNI_FUNC_PTR(env,ExceptionOccurred)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,1607), log_message_end ("%s()","ExceptionOccurred")):((void) 0)), (env))))->ExceptionOccurred))(env)) { | |||
1608 | JNI_FUNC_PTR(env,ExceptionClear)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,1608), log_message_end ("%s()","ExceptionClear")):((void)0)) , (env))))->ExceptionClear))(env); | |||
1609 | /* NULL will be returned below */ | |||
1610 | } else { | |||
1611 | /* Call valueString = System.getProperty(nameString) */ | |||
1612 | valueString = JNI_FUNC_PTR(env,CallStaticObjectMethod)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,1612), log_message_end ("%s()","CallStaticObjectMethod")):(( void)0)), (env))))->CallStaticObjectMethod)) | |||
1613 | (env, gdata->systemClass, gdata->systemGetProperty, nameString); | |||
1614 | if (JNI_FUNC_PTR(env,ExceptionOccurred)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,1614), log_message_end ("%s()","ExceptionOccurred")):((void) 0)), (env))))->ExceptionOccurred))(env)) { | |||
1615 | JNI_FUNC_PTR(env,ExceptionClear)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,1615), log_message_end ("%s()","ExceptionClear")):((void)0)) , (env))))->ExceptionClear))(env); | |||
1616 | valueString = NULL((void*)0); | |||
1617 | } | |||
1618 | } | |||
1619 | return valueString; | |||
1620 | } | |||
1621 | ||||
1622 | /** | |||
1623 | * Set an agent property | |||
1624 | */ | |||
1625 | void | |||
1626 | setAgentPropertyValue(JNIEnv *env, char *propertyName, char* propertyValue) | |||
1627 | { | |||
1628 | jstring nameString; | |||
1629 | jstring valueString; | |||
1630 | ||||
1631 | if (gdata->agent_properties == NULL((void*)0)) { | |||
1632 | /* VMSupport doesn't exist; so ignore */ | |||
1633 | return; | |||
1634 | } | |||
1635 | ||||
1636 | /* Create jstrings for property name and value */ | |||
1637 | nameString = JNI_FUNC_PTR(env,NewStringUTF)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,1637), log_message_end ("%s()","NewStringUTF")):((void)0)), ( env))))->NewStringUTF))(env, propertyName); | |||
1638 | if (nameString != NULL((void*)0)) { | |||
1639 | /* convert the value to UTF8 */ | |||
1640 | int len; | |||
1641 | char *utf8value; | |||
1642 | int utf8maxSize; | |||
1643 | ||||
1644 | len = (int)strlen(propertyValue); | |||
1645 | utf8maxSize = len * 4 + 1; | |||
1646 | utf8value = (char *)jvmtiAllocate(utf8maxSize); | |||
1647 | if (utf8value != NULL((void*)0)) { | |||
1648 | utf8FromPlatform(propertyValue, len, (jbyte *)utf8value, utf8maxSize); | |||
1649 | valueString = JNI_FUNC_PTR(env, NewStringUTF)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,1649), log_message_end ("%s()","NewStringUTF")):((void)0)), ( env))))->NewStringUTF))(env, utf8value); | |||
1650 | jvmtiDeallocate(utf8value); | |||
1651 | ||||
1652 | if (valueString != NULL((void*)0)) { | |||
1653 | /* invoke Properties.setProperty */ | |||
1654 | JNI_FUNC_PTR(env,CallObjectMethod)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,1654), log_message_end ("%s()","CallObjectMethod")):((void)0 )), (env))))->CallObjectMethod)) | |||
1655 | (env, gdata->agent_properties, | |||
1656 | gdata->setProperty, | |||
1657 | nameString, valueString); | |||
1658 | } | |||
1659 | } | |||
1660 | } | |||
1661 | if (JNI_FUNC_PTR(env,ExceptionOccurred)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,1661), log_message_end ("%s()","ExceptionOccurred")):((void) 0)), (env))))->ExceptionOccurred))(env)) { | |||
1662 | JNI_FUNC_PTR(env,ExceptionClear)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,1662), log_message_end ("%s()","ExceptionClear")):((void)0)) , (env))))->ExceptionClear))(env); | |||
1663 | } | |||
1664 | } | |||
1665 | ||||
1666 | /** | |||
1667 | * Return property value as JDWP allocated string in UTF8 encoding | |||
1668 | */ | |||
1669 | static char * | |||
1670 | getPropertyUTF8(JNIEnv *env, char *propertyName) | |||
1671 | { | |||
1672 | jvmtiError error; | |||
1673 | char *value; | |||
1674 | ||||
1675 | value = NULL((void*)0); | |||
1676 | error = JVMTI_FUNC_PTR(gdata->jvmti,GetSystemProperty)(*((*((((gdata->log_flags & (0x00000004))?(log_message_begin ("JVMTI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,1676), log_message_end ("%s()","GetSystemProperty")):((void) 0)),(gdata->jvmti))))->GetSystemProperty)) | |||
1677 | (gdata->jvmti, (const char *)propertyName, &value); | |||
1678 | if (error != JVMTI_ERROR_NONE) { | |||
1679 | jstring valueString; | |||
1680 | ||||
1681 | value = NULL((void*)0); | |||
1682 | valueString = getPropertyValue(env, propertyName); | |||
1683 | ||||
1684 | if (valueString != NULL((void*)0)) { | |||
1685 | const char *utf; | |||
1686 | ||||
1687 | /* Get the UTF8 encoding for this property value string */ | |||
1688 | utf = JNI_FUNC_PTR(env,GetStringUTFChars)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,1688), log_message_end ("%s()","GetStringUTFChars")):((void) 0)), (env))))->GetStringUTFChars))(env, valueString, NULL((void*)0)); | |||
1689 | /* Make a copy for returning, release the JNI copy */ | |||
1690 | value = jvmtiAllocate((int)strlen(utf) + 1); | |||
1691 | if (value != NULL((void*)0)) { | |||
1692 | (void)strcpy(value, utf); | |||
1693 | } | |||
1694 | JNI_FUNC_PTR(env,ReleaseStringUTFChars)(*((*((((gdata->log_flags & (0x00000002)) ?(log_message_begin ("JNI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,1694), log_message_end ("%s()","ReleaseStringUTFChars")):((void )0)), (env))))->ReleaseStringUTFChars))(env, valueString, utf); | |||
1695 | } | |||
1696 | } | |||
1697 | if ( value == NULL((void*)0) ) { | |||
1698 | ERROR_MESSAGE(("JDWP Can't get property value for %s", propertyName))( ((gdata->log_flags & (0x00000080))?(log_message_begin ("ERROR","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,1698), log_message_end ("JDWP Can't get property value for %s" , propertyName)):((void)0)), error_message ("JDWP Can't get property value for %s" , propertyName) ); | |||
1699 | EXIT_ERROR(AGENT_ERROR_NULL_POINTER,NULL){ print_message(stderr, "JDWP exit error ", "\n", "%s(%d): %s [%s:%d]" , jvmtiErrorText((jvmtiError)((jvmtiError)(JVMTI_ERROR_MAX+64 +21))), ((jvmtiError)(JVMTI_ERROR_MAX+64+21)), (((void*)0)==( (void*)0)?"":((void*)0)), "/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" , 1699); debugInit_exit((jvmtiError)((jvmtiError)(JVMTI_ERROR_MAX +64+21)), ((void*)0)); }; | |||
1700 | } | |||
1701 | return value; | |||
1702 | } | |||
1703 | ||||
1704 | jboolean | |||
1705 | isMethodObsolete(jmethodID method) | |||
1706 | { | |||
1707 | jvmtiError error; | |||
1708 | jboolean obsolete = JNI_TRUE1; | |||
1709 | ||||
1710 | if ( method != NULL((void*)0) ) { | |||
1711 | error = JVMTI_FUNC_PTR(gdata->jvmti,IsMethodObsolete)(*((*((((gdata->log_flags & (0x00000004))?(log_message_begin ("JVMTI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,1711), log_message_end ("%s()","IsMethodObsolete")):((void)0 )),(gdata->jvmti))))->IsMethodObsolete)) | |||
1712 | (gdata->jvmti, method, &obsolete); | |||
1713 | if (error != JVMTI_ERROR_NONE) { | |||
1714 | obsolete = JNI_TRUE1; | |||
1715 | } | |||
1716 | } | |||
1717 | return obsolete; | |||
1718 | } | |||
1719 | ||||
1720 | /* Get the jvmti environment to be used with tags */ | |||
1721 | jvmtiEnv * | |||
1722 | getSpecialJvmti(void) | |||
1723 | { | |||
1724 | jvmtiEnv *jvmti; | |||
1725 | jvmtiError error; | |||
1726 | int rc; | |||
1727 | ||||
1728 | /* Get one time use JVMTI Env */ | |||
1729 | jvmtiCapabilities caps; | |||
1730 | ||||
1731 | rc = JVM_FUNC_PTR(gdata->jvm,GetEnv)(*((*((((gdata->log_flags & (0x00000001)) ?(log_message_begin ("JVM","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,1731), log_message_end ("%s()","GetEnv")):((void)0)), (gdata ->jvm))))->GetEnv)) | |||
1732 | (gdata->jvm, (void **)&jvmti, JVMTI_VERSION_1); | |||
1733 | if (rc != JNI_OK0) { | |||
1734 | return NULL((void*)0); | |||
1735 | } | |||
1736 | (void)memset(&caps, 0, (int)sizeof(caps)); | |||
1737 | caps.can_tag_objects = 1; | |||
1738 | error = JVMTI_FUNC_PTR(jvmti,AddCapabilities)(*((*((((gdata->log_flags & (0x00000004))?(log_message_begin ("JVMTI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,1738), log_message_end ("%s()","AddCapabilities")):((void)0) ),(jvmti))))->AddCapabilities))(jvmti, &caps); | |||
1739 | if ( error != JVMTI_ERROR_NONE ) { | |||
1740 | return NULL((void*)0); | |||
1741 | } | |||
1742 | return jvmti; | |||
1743 | } | |||
1744 | ||||
1745 | void | |||
1746 | writeCodeLocation(PacketOutputStream *out, jclass clazz, | |||
1747 | jmethodID method, jlocation location) | |||
1748 | { | |||
1749 | jbyte tag; | |||
1750 | ||||
1751 | if (clazz != NULL((void*)0)) { | |||
1752 | tag = referenceTypeTag(clazz); | |||
1753 | } else { | |||
1754 | tag = JDWP_TYPE_TAG(CLASS)1; | |||
1755 | } | |||
1756 | (void)outStream_writeByte(out, tag); | |||
1757 | (void)outStream_writeObjectRef(getEnv(), out, clazz); | |||
1758 | (void)outStream_writeMethodID(out, isMethodObsolete(method)?NULL((void*)0):method); | |||
1759 | (void)outStream_writeLocation(out, location); | |||
1760 | } | |||
1761 | ||||
1762 | void * | |||
1763 | jvmtiAllocate(jint numBytes) | |||
1764 | { | |||
1765 | void *ptr; | |||
1766 | jvmtiError error; | |||
1767 | if ( numBytes == 0 ) { | |||
1768 | return NULL((void*)0); | |||
1769 | } | |||
1770 | error = JVMTI_FUNC_PTR(gdata->jvmti,Allocate)(*((*((((gdata->log_flags & (0x00000004))?(log_message_begin ("JVMTI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,1770), log_message_end ("%s()","Allocate")):((void)0)),(gdata ->jvmti))))->Allocate)) | |||
1771 | (gdata->jvmti, numBytes, (unsigned char**)&ptr); | |||
1772 | if (error != JVMTI_ERROR_NONE ) { | |||
1773 | EXIT_ERROR(error, "Can't allocate jvmti memory"){ print_message(stderr, "JDWP exit error ", "\n", "%s(%d): %s [%s:%d]" , jvmtiErrorText((jvmtiError)error), error, ("Can't allocate jvmti memory" ==((void*)0)?"":"Can't allocate jvmti memory"), "/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" , 1773); debugInit_exit((jvmtiError)error, "Can't allocate jvmti memory" ); }; | |||
1774 | } | |||
1775 | return ptr; | |||
1776 | } | |||
1777 | ||||
1778 | void | |||
1779 | jvmtiDeallocate(void *ptr) | |||
1780 | { | |||
1781 | jvmtiError error; | |||
1782 | if ( ptr == NULL((void*)0) ) { | |||
1783 | return; | |||
1784 | } | |||
1785 | error = JVMTI_FUNC_PTR(gdata->jvmti,Deallocate)(*((*((((gdata->log_flags & (0x00000004))?(log_message_begin ("JVMTI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,1785), log_message_end ("%s()","Deallocate")):((void)0)),(gdata ->jvmti))))->Deallocate)) | |||
1786 | (gdata->jvmti, ptr); | |||
1787 | if (error != JVMTI_ERROR_NONE ) { | |||
1788 | EXIT_ERROR(error, "Can't deallocate jvmti memory"){ print_message(stderr, "JDWP exit error ", "\n", "%s(%d): %s [%s:%d]" , jvmtiErrorText((jvmtiError)error), error, ("Can't deallocate jvmti memory" ==((void*)0)?"":"Can't deallocate jvmti memory"), "/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" , 1788); debugInit_exit((jvmtiError)error, "Can't deallocate jvmti memory" ); }; | |||
1789 | } | |||
1790 | } | |||
1791 | ||||
1792 | /* Rarely needed, transport library uses JDWP errors, only use? */ | |||
1793 | jvmtiError | |||
1794 | map2jvmtiError(jdwpError error) | |||
1795 | { | |||
1796 | switch ( error ) { | |||
1797 | case JDWP_ERROR(NONE)0: | |||
1798 | return JVMTI_ERROR_NONE; | |||
1799 | case JDWP_ERROR(INVALID_THREAD)10: | |||
1800 | return JVMTI_ERROR_INVALID_THREAD; | |||
1801 | case JDWP_ERROR(INVALID_THREAD_GROUP)11: | |||
1802 | return JVMTI_ERROR_INVALID_THREAD_GROUP; | |||
1803 | case JDWP_ERROR(INVALID_PRIORITY)12: | |||
1804 | return JVMTI_ERROR_INVALID_PRIORITY; | |||
1805 | case JDWP_ERROR(THREAD_NOT_SUSPENDED)13: | |||
1806 | return JVMTI_ERROR_THREAD_NOT_SUSPENDED; | |||
1807 | case JDWP_ERROR(THREAD_SUSPENDED)14: | |||
1808 | return JVMTI_ERROR_THREAD_SUSPENDED; | |||
1809 | case JDWP_ERROR(INVALID_OBJECT)20: | |||
1810 | return JVMTI_ERROR_INVALID_OBJECT; | |||
1811 | case JDWP_ERROR(INVALID_CLASS)21: | |||
1812 | return JVMTI_ERROR_INVALID_CLASS; | |||
1813 | case JDWP_ERROR(CLASS_NOT_PREPARED)22: | |||
1814 | return JVMTI_ERROR_CLASS_NOT_PREPARED; | |||
1815 | case JDWP_ERROR(INVALID_METHODID)23: | |||
1816 | return JVMTI_ERROR_INVALID_METHODID; | |||
1817 | case JDWP_ERROR(INVALID_LOCATION)24: | |||
1818 | return JVMTI_ERROR_INVALID_LOCATION; | |||
1819 | case JDWP_ERROR(INVALID_FIELDID)25: | |||
1820 | return JVMTI_ERROR_INVALID_FIELDID; | |||
1821 | case JDWP_ERROR(INVALID_FRAMEID)30: | |||
1822 | return AGENT_ERROR_INVALID_FRAMEID((jvmtiError)(JVMTI_ERROR_MAX+64+20)); | |||
1823 | case JDWP_ERROR(NO_MORE_FRAMES)31: | |||
1824 | return JVMTI_ERROR_NO_MORE_FRAMES; | |||
1825 | case JDWP_ERROR(OPAQUE_FRAME)32: | |||
1826 | return JVMTI_ERROR_OPAQUE_FRAME; | |||
1827 | case JDWP_ERROR(NOT_CURRENT_FRAME)33: | |||
1828 | return AGENT_ERROR_NOT_CURRENT_FRAME((jvmtiError)(JVMTI_ERROR_MAX+64+7)); | |||
1829 | case JDWP_ERROR(TYPE_MISMATCH)34: | |||
1830 | return JVMTI_ERROR_TYPE_MISMATCH; | |||
1831 | case JDWP_ERROR(INVALID_SLOT)35: | |||
1832 | return JVMTI_ERROR_INVALID_SLOT; | |||
1833 | case JDWP_ERROR(DUPLICATE)40: | |||
1834 | return JVMTI_ERROR_DUPLICATE; | |||
1835 | case JDWP_ERROR(NOT_FOUND)41: | |||
1836 | return JVMTI_ERROR_NOT_FOUND; | |||
1837 | case JDWP_ERROR(INVALID_MONITOR)50: | |||
1838 | return JVMTI_ERROR_INVALID_MONITOR; | |||
1839 | case JDWP_ERROR(NOT_MONITOR_OWNER)51: | |||
1840 | return JVMTI_ERROR_NOT_MONITOR_OWNER; | |||
1841 | case JDWP_ERROR(INTERRUPT)52: | |||
1842 | return JVMTI_ERROR_INTERRUPT; | |||
1843 | case JDWP_ERROR(INVALID_CLASS_FORMAT)60: | |||
1844 | return JVMTI_ERROR_INVALID_CLASS_FORMAT; | |||
1845 | case JDWP_ERROR(CIRCULAR_CLASS_DEFINITION)61: | |||
1846 | return JVMTI_ERROR_CIRCULAR_CLASS_DEFINITION; | |||
1847 | case JDWP_ERROR(FAILS_VERIFICATION)62: | |||
1848 | return JVMTI_ERROR_FAILS_VERIFICATION; | |||
1849 | case JDWP_ERROR(ADD_METHOD_NOT_IMPLEMENTED)63: | |||
1850 | return JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_ADDED; | |||
1851 | case JDWP_ERROR(SCHEMA_CHANGE_NOT_IMPLEMENTED)64: | |||
1852 | return JVMTI_ERROR_UNSUPPORTED_REDEFINITION_SCHEMA_CHANGED; | |||
1853 | case JDWP_ERROR(INVALID_TYPESTATE)65: | |||
1854 | return JVMTI_ERROR_INVALID_TYPESTATE; | |||
1855 | case JDWP_ERROR(HIERARCHY_CHANGE_NOT_IMPLEMENTED)66: | |||
1856 | return JVMTI_ERROR_UNSUPPORTED_REDEFINITION_HIERARCHY_CHANGED; | |||
1857 | case JDWP_ERROR(DELETE_METHOD_NOT_IMPLEMENTED)67: | |||
1858 | return JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_DELETED; | |||
1859 | case JDWP_ERROR(UNSUPPORTED_VERSION)68: | |||
1860 | return JVMTI_ERROR_UNSUPPORTED_VERSION; | |||
1861 | case JDWP_ERROR(NAMES_DONT_MATCH)69: | |||
1862 | return JVMTI_ERROR_NAMES_DONT_MATCH; | |||
1863 | case JDWP_ERROR(CLASS_MODIFIERS_CHANGE_NOT_IMPLEMENTED)70: | |||
1864 | return JVMTI_ERROR_UNSUPPORTED_REDEFINITION_CLASS_MODIFIERS_CHANGED; | |||
1865 | case JDWP_ERROR(METHOD_MODIFIERS_CHANGE_NOT_IMPLEMENTED)71: | |||
1866 | return JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_MODIFIERS_CHANGED; | |||
1867 | case JDWP_ERROR(CLASS_ATTRIBUTE_CHANGE_NOT_IMPLEMENTED)72: | |||
1868 | return JVMTI_ERROR_UNSUPPORTED_REDEFINITION_CLASS_ATTRIBUTE_CHANGED; | |||
1869 | case JDWP_ERROR(NOT_IMPLEMENTED)99: | |||
1870 | return JVMTI_ERROR_NOT_AVAILABLE; | |||
1871 | case JDWP_ERROR(NULL_POINTER)100: | |||
1872 | return JVMTI_ERROR_NULL_POINTER; | |||
1873 | case JDWP_ERROR(ABSENT_INFORMATION)101: | |||
1874 | return JVMTI_ERROR_ABSENT_INFORMATION; | |||
1875 | case JDWP_ERROR(INVALID_EVENT_TYPE)102: | |||
1876 | return JVMTI_ERROR_INVALID_EVENT_TYPE; | |||
1877 | case JDWP_ERROR(ILLEGAL_ARGUMENT)103: | |||
1878 | return JVMTI_ERROR_ILLEGAL_ARGUMENT; | |||
1879 | case JDWP_ERROR(OUT_OF_MEMORY)110: | |||
1880 | return JVMTI_ERROR_OUT_OF_MEMORY; | |||
1881 | case JDWP_ERROR(ACCESS_DENIED)111: | |||
1882 | return JVMTI_ERROR_ACCESS_DENIED; | |||
1883 | case JDWP_ERROR(VM_DEAD)112: | |||
1884 | return JVMTI_ERROR_WRONG_PHASE; | |||
1885 | case JDWP_ERROR(UNATTACHED_THREAD)115: | |||
1886 | return JVMTI_ERROR_UNATTACHED_THREAD; | |||
1887 | case JDWP_ERROR(INVALID_TAG)500: | |||
1888 | return AGENT_ERROR_INVALID_TAG((jvmtiError)(JVMTI_ERROR_MAX+64+9)); | |||
1889 | case JDWP_ERROR(ALREADY_INVOKING)502: | |||
1890 | return AGENT_ERROR_ALREADY_INVOKING((jvmtiError)(JVMTI_ERROR_MAX+64+10)); | |||
1891 | case JDWP_ERROR(INVALID_INDEX)503: | |||
1892 | return AGENT_ERROR_INVALID_INDEX((jvmtiError)(JVMTI_ERROR_MAX+64+11)); | |||
1893 | case JDWP_ERROR(INVALID_LENGTH)504: | |||
1894 | return AGENT_ERROR_INVALID_LENGTH((jvmtiError)(JVMTI_ERROR_MAX+64+12)); | |||
1895 | case JDWP_ERROR(INVALID_STRING)506: | |||
1896 | return AGENT_ERROR_INVALID_STRING((jvmtiError)(JVMTI_ERROR_MAX+64+13)); | |||
1897 | case JDWP_ERROR(INVALID_CLASS_LOADER)507: | |||
1898 | return AGENT_ERROR_INVALID_CLASS_LOADER((jvmtiError)(JVMTI_ERROR_MAX+64+14)); | |||
1899 | case JDWP_ERROR(INVALID_ARRAY)508: | |||
1900 | return AGENT_ERROR_INVALID_ARRAY((jvmtiError)(JVMTI_ERROR_MAX+64+15)); | |||
1901 | case JDWP_ERROR(TRANSPORT_LOAD)509: | |||
1902 | return AGENT_ERROR_TRANSPORT_LOAD((jvmtiError)(JVMTI_ERROR_MAX+64+16)); | |||
1903 | case JDWP_ERROR(TRANSPORT_INIT)510: | |||
1904 | return AGENT_ERROR_TRANSPORT_INIT((jvmtiError)(JVMTI_ERROR_MAX+64+17)); | |||
1905 | case JDWP_ERROR(NATIVE_METHOD)511: | |||
1906 | return AGENT_ERROR_NATIVE_METHOD((jvmtiError)(JVMTI_ERROR_MAX+64+18)); | |||
1907 | case JDWP_ERROR(INVALID_COUNT)512: | |||
1908 | return AGENT_ERROR_INVALID_COUNT((jvmtiError)(JVMTI_ERROR_MAX+64+19)); | |||
1909 | case JDWP_ERROR(INTERNAL)113: | |||
1910 | return AGENT_ERROR_JDWP_INTERNAL((jvmtiError)(JVMTI_ERROR_MAX+64+6)); | |||
1911 | } | |||
1912 | return AGENT_ERROR_INTERNAL((jvmtiError)(JVMTI_ERROR_MAX+64+1)); | |||
1913 | } | |||
1914 | ||||
1915 | static jvmtiEvent index2jvmti[EI_max-EI_min+1]; | |||
1916 | static jdwpEvent index2jdwp [EI_max-EI_min+1]; | |||
1917 | ||||
1918 | void | |||
1919 | eventIndexInit(void) | |||
1920 | { | |||
1921 | (void)memset(index2jvmti, 0, (int)sizeof(index2jvmti)); | |||
1922 | (void)memset(index2jdwp, 0, (int)sizeof(index2jdwp)); | |||
1923 | ||||
1924 | index2jvmti[EI_SINGLE_STEP -EI_min] = JVMTI_EVENT_SINGLE_STEP; | |||
1925 | index2jvmti[EI_BREAKPOINT -EI_min] = JVMTI_EVENT_BREAKPOINT; | |||
1926 | index2jvmti[EI_FRAME_POP -EI_min] = JVMTI_EVENT_FRAME_POP; | |||
1927 | index2jvmti[EI_EXCEPTION -EI_min] = JVMTI_EVENT_EXCEPTION; | |||
1928 | index2jvmti[EI_THREAD_START -EI_min] = JVMTI_EVENT_THREAD_START; | |||
1929 | index2jvmti[EI_THREAD_END -EI_min] = JVMTI_EVENT_THREAD_END; | |||
1930 | index2jvmti[EI_CLASS_PREPARE -EI_min] = JVMTI_EVENT_CLASS_PREPARE; | |||
1931 | index2jvmti[EI_GC_FINISH -EI_min] = JVMTI_EVENT_GARBAGE_COLLECTION_FINISH; | |||
1932 | index2jvmti[EI_CLASS_LOAD -EI_min] = JVMTI_EVENT_CLASS_LOAD; | |||
1933 | index2jvmti[EI_FIELD_ACCESS -EI_min] = JVMTI_EVENT_FIELD_ACCESS; | |||
1934 | index2jvmti[EI_FIELD_MODIFICATION -EI_min] = JVMTI_EVENT_FIELD_MODIFICATION; | |||
1935 | index2jvmti[EI_EXCEPTION_CATCH -EI_min] = JVMTI_EVENT_EXCEPTION_CATCH; | |||
1936 | index2jvmti[EI_METHOD_ENTRY -EI_min] = JVMTI_EVENT_METHOD_ENTRY; | |||
1937 | index2jvmti[EI_METHOD_EXIT -EI_min] = JVMTI_EVENT_METHOD_EXIT; | |||
1938 | index2jvmti[EI_MONITOR_CONTENDED_ENTER -EI_min] = JVMTI_EVENT_MONITOR_CONTENDED_ENTER; | |||
1939 | index2jvmti[EI_MONITOR_CONTENDED_ENTERED -EI_min] = JVMTI_EVENT_MONITOR_CONTENDED_ENTERED; | |||
1940 | index2jvmti[EI_MONITOR_WAIT -EI_min] = JVMTI_EVENT_MONITOR_WAIT; | |||
1941 | index2jvmti[EI_MONITOR_WAITED -EI_min] = JVMTI_EVENT_MONITOR_WAITED; | |||
1942 | index2jvmti[EI_VM_INIT -EI_min] = JVMTI_EVENT_VM_INIT; | |||
1943 | index2jvmti[EI_VM_DEATH -EI_min] = JVMTI_EVENT_VM_DEATH; | |||
1944 | ||||
1945 | index2jdwp[EI_SINGLE_STEP -EI_min] = JDWP_EVENT(SINGLE_STEP)1; | |||
1946 | index2jdwp[EI_BREAKPOINT -EI_min] = JDWP_EVENT(BREAKPOINT)2; | |||
1947 | index2jdwp[EI_FRAME_POP -EI_min] = JDWP_EVENT(FRAME_POP)3; | |||
1948 | index2jdwp[EI_EXCEPTION -EI_min] = JDWP_EVENT(EXCEPTION)4; | |||
1949 | index2jdwp[EI_THREAD_START -EI_min] = JDWP_EVENT(THREAD_START)6; | |||
1950 | index2jdwp[EI_THREAD_END -EI_min] = JDWP_EVENT(THREAD_END)7; | |||
1951 | index2jdwp[EI_CLASS_PREPARE -EI_min] = JDWP_EVENT(CLASS_PREPARE)8; | |||
1952 | index2jdwp[EI_GC_FINISH -EI_min] = JDWP_EVENT(CLASS_UNLOAD)9; | |||
1953 | index2jdwp[EI_CLASS_LOAD -EI_min] = JDWP_EVENT(CLASS_LOAD)10; | |||
1954 | index2jdwp[EI_FIELD_ACCESS -EI_min] = JDWP_EVENT(FIELD_ACCESS)20; | |||
1955 | index2jdwp[EI_FIELD_MODIFICATION -EI_min] = JDWP_EVENT(FIELD_MODIFICATION)21; | |||
1956 | index2jdwp[EI_EXCEPTION_CATCH -EI_min] = JDWP_EVENT(EXCEPTION_CATCH)30; | |||
1957 | index2jdwp[EI_METHOD_ENTRY -EI_min] = JDWP_EVENT(METHOD_ENTRY)40; | |||
1958 | index2jdwp[EI_METHOD_EXIT -EI_min] = JDWP_EVENT(METHOD_EXIT)41; | |||
1959 | index2jdwp[EI_MONITOR_CONTENDED_ENTER -EI_min] = JDWP_EVENT(MONITOR_CONTENDED_ENTER)43; | |||
1960 | index2jdwp[EI_MONITOR_CONTENDED_ENTERED -EI_min] = JDWP_EVENT(MONITOR_CONTENDED_ENTERED)44; | |||
1961 | index2jdwp[EI_MONITOR_WAIT -EI_min] = JDWP_EVENT(MONITOR_WAIT)45; | |||
1962 | index2jdwp[EI_MONITOR_WAITED -EI_min] = JDWP_EVENT(MONITOR_WAITED)46; | |||
1963 | index2jdwp[EI_VM_INIT -EI_min] = JDWP_EVENT(VM_INIT)90; | |||
1964 | index2jdwp[EI_VM_DEATH -EI_min] = JDWP_EVENT(VM_DEATH)99; | |||
1965 | } | |||
1966 | ||||
1967 | jdwpEvent | |||
1968 | eventIndex2jdwp(EventIndex i) | |||
1969 | { | |||
1970 | if ( i < EI_min || i > EI_max ) { | |||
1971 | EXIT_ERROR(AGENT_ERROR_INVALID_INDEX,"bad EventIndex"){ print_message(stderr, "JDWP exit error ", "\n", "%s(%d): %s [%s:%d]" , jvmtiErrorText((jvmtiError)((jvmtiError)(JVMTI_ERROR_MAX+64 +11))), ((jvmtiError)(JVMTI_ERROR_MAX+64+11)), ("bad EventIndex" ==((void*)0)?"":"bad EventIndex"), "/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" , 1971); debugInit_exit((jvmtiError)((jvmtiError)(JVMTI_ERROR_MAX +64+11)), "bad EventIndex"); }; | |||
1972 | } | |||
1973 | return index2jdwp[i-EI_min]; | |||
1974 | } | |||
1975 | ||||
1976 | jvmtiEvent | |||
1977 | eventIndex2jvmti(EventIndex i) | |||
1978 | { | |||
1979 | if ( i < EI_min || i > EI_max ) { | |||
1980 | EXIT_ERROR(AGENT_ERROR_INVALID_INDEX,"bad EventIndex"){ print_message(stderr, "JDWP exit error ", "\n", "%s(%d): %s [%s:%d]" , jvmtiErrorText((jvmtiError)((jvmtiError)(JVMTI_ERROR_MAX+64 +11))), ((jvmtiError)(JVMTI_ERROR_MAX+64+11)), ("bad EventIndex" ==((void*)0)?"":"bad EventIndex"), "/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" , 1980); debugInit_exit((jvmtiError)((jvmtiError)(JVMTI_ERROR_MAX +64+11)), "bad EventIndex"); }; | |||
1981 | } | |||
1982 | return index2jvmti[i-EI_min]; | |||
1983 | } | |||
1984 | ||||
1985 | #ifdef DEBUG1 | |||
1986 | ||||
1987 | char* | |||
1988 | eventIndex2EventName(EventIndex ei) | |||
1989 | { | |||
1990 | switch ( ei ) { | |||
1991 | case EI_SINGLE_STEP: | |||
1992 | return "EI_SINGLE_STEP"; | |||
1993 | case EI_BREAKPOINT: | |||
1994 | return "EI_BREAKPOINT"; | |||
1995 | case EI_FRAME_POP: | |||
1996 | return "EI_FRAME_POP"; | |||
1997 | case EI_EXCEPTION: | |||
1998 | return "EI_EXCEPTION"; | |||
1999 | case EI_THREAD_START: | |||
2000 | return "EI_THREAD_START"; | |||
2001 | case EI_THREAD_END: | |||
2002 | return "EI_THREAD_END"; | |||
2003 | case EI_CLASS_PREPARE: | |||
2004 | return "EI_CLASS_PREPARE"; | |||
2005 | case EI_GC_FINISH: | |||
2006 | return "EI_GC_FINISH"; | |||
2007 | case EI_CLASS_LOAD: | |||
2008 | return "EI_CLASS_LOAD"; | |||
2009 | case EI_FIELD_ACCESS: | |||
2010 | return "EI_FIELD_ACCESS"; | |||
2011 | case EI_FIELD_MODIFICATION: | |||
2012 | return "EI_FIELD_MODIFICATION"; | |||
2013 | case EI_EXCEPTION_CATCH: | |||
2014 | return "EI_EXCEPTION_CATCH"; | |||
2015 | case EI_METHOD_ENTRY: | |||
2016 | return "EI_METHOD_ENTRY"; | |||
2017 | case EI_METHOD_EXIT: | |||
2018 | return "EI_METHOD_EXIT"; | |||
2019 | case EI_MONITOR_CONTENDED_ENTER: | |||
2020 | return "EI_MONITOR_CONTENDED_ENTER"; | |||
2021 | case EI_MONITOR_CONTENDED_ENTERED: | |||
2022 | return "EI_MONITOR_CONTENDED_ENTERED"; | |||
2023 | case EI_MONITOR_WAIT: | |||
2024 | return "EI_MONITOR_WAIT"; | |||
2025 | case EI_MONITOR_WAITED: | |||
2026 | return "EI_MONITOR_WAITED"; | |||
2027 | case EI_VM_INIT: | |||
2028 | return "EI_VM_INIT"; | |||
2029 | case EI_VM_DEATH: | |||
2030 | return "EI_VM_DEATH"; | |||
2031 | default: | |||
2032 | JDI_ASSERT(JNI_FALSE)do { if (gdata && gdata->assertOn && !(0)) { jdiAssertionFailed("/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" , 2032, "JNI_FALSE"); } } while (0); | |||
2033 | return "Bad EI"; | |||
2034 | } | |||
2035 | } | |||
2036 | ||||
2037 | #endif | |||
2038 | ||||
2039 | EventIndex | |||
2040 | jdwp2EventIndex(jdwpEvent eventType) | |||
2041 | { | |||
2042 | switch ( eventType ) { | |||
2043 | case JDWP_EVENT(SINGLE_STEP)1: | |||
2044 | return EI_SINGLE_STEP; | |||
2045 | case JDWP_EVENT(BREAKPOINT)2: | |||
2046 | return EI_BREAKPOINT; | |||
2047 | case JDWP_EVENT(FRAME_POP)3: | |||
2048 | return EI_FRAME_POP; | |||
2049 | case JDWP_EVENT(EXCEPTION)4: | |||
2050 | return EI_EXCEPTION; | |||
2051 | case JDWP_EVENT(THREAD_START)6: | |||
2052 | return EI_THREAD_START; | |||
2053 | case JDWP_EVENT(THREAD_END)7: | |||
2054 | return EI_THREAD_END; | |||
2055 | case JDWP_EVENT(CLASS_PREPARE)8: | |||
2056 | return EI_CLASS_PREPARE; | |||
2057 | case JDWP_EVENT(CLASS_UNLOAD)9: | |||
2058 | return EI_GC_FINISH; | |||
2059 | case JDWP_EVENT(CLASS_LOAD)10: | |||
2060 | return EI_CLASS_LOAD; | |||
2061 | case JDWP_EVENT(FIELD_ACCESS)20: | |||
2062 | return EI_FIELD_ACCESS; | |||
2063 | case JDWP_EVENT(FIELD_MODIFICATION)21: | |||
2064 | return EI_FIELD_MODIFICATION; | |||
2065 | case JDWP_EVENT(EXCEPTION_CATCH)30: | |||
2066 | return EI_EXCEPTION_CATCH; | |||
2067 | case JDWP_EVENT(METHOD_ENTRY)40: | |||
2068 | return EI_METHOD_ENTRY; | |||
2069 | case JDWP_EVENT(METHOD_EXIT)41: | |||
2070 | return EI_METHOD_EXIT; | |||
2071 | case JDWP_EVENT(METHOD_EXIT_WITH_RETURN_VALUE)42: | |||
2072 | return EI_METHOD_EXIT; | |||
2073 | case JDWP_EVENT(MONITOR_CONTENDED_ENTER)43: | |||
2074 | return EI_MONITOR_CONTENDED_ENTER; | |||
2075 | case JDWP_EVENT(MONITOR_CONTENDED_ENTERED)44: | |||
2076 | return EI_MONITOR_CONTENDED_ENTERED; | |||
2077 | case JDWP_EVENT(MONITOR_WAIT)45: | |||
2078 | return EI_MONITOR_WAIT; | |||
2079 | case JDWP_EVENT(MONITOR_WAITED)46: | |||
2080 | return EI_MONITOR_WAITED; | |||
2081 | case JDWP_EVENT(VM_INIT)90: | |||
2082 | return EI_VM_INIT; | |||
2083 | case JDWP_EVENT(VM_DEATH)99: | |||
2084 | return EI_VM_DEATH; | |||
2085 | default: | |||
2086 | break; | |||
2087 | } | |||
2088 | ||||
2089 | /* | |||
2090 | * Event type not recognized - don't exit with error as caller | |||
2091 | * may wish to return error to debugger. | |||
2092 | */ | |||
2093 | return (EventIndex)0; | |||
2094 | } | |||
2095 | ||||
2096 | EventIndex | |||
2097 | jvmti2EventIndex(jvmtiEvent kind) | |||
2098 | { | |||
2099 | switch ( kind ) { | |||
2100 | case JVMTI_EVENT_SINGLE_STEP: | |||
2101 | return EI_SINGLE_STEP; | |||
2102 | case JVMTI_EVENT_BREAKPOINT: | |||
2103 | return EI_BREAKPOINT; | |||
2104 | case JVMTI_EVENT_FRAME_POP: | |||
2105 | return EI_FRAME_POP; | |||
2106 | case JVMTI_EVENT_EXCEPTION: | |||
2107 | return EI_EXCEPTION; | |||
2108 | case JVMTI_EVENT_THREAD_START: | |||
2109 | return EI_THREAD_START; | |||
2110 | case JVMTI_EVENT_THREAD_END: | |||
2111 | return EI_THREAD_END; | |||
2112 | case JVMTI_EVENT_CLASS_PREPARE: | |||
2113 | return EI_CLASS_PREPARE; | |||
2114 | case JVMTI_EVENT_GARBAGE_COLLECTION_FINISH: | |||
2115 | return EI_GC_FINISH; | |||
2116 | case JVMTI_EVENT_CLASS_LOAD: | |||
2117 | return EI_CLASS_LOAD; | |||
2118 | case JVMTI_EVENT_FIELD_ACCESS: | |||
2119 | return EI_FIELD_ACCESS; | |||
2120 | case JVMTI_EVENT_FIELD_MODIFICATION: | |||
2121 | return EI_FIELD_MODIFICATION; | |||
2122 | case JVMTI_EVENT_EXCEPTION_CATCH: | |||
2123 | return EI_EXCEPTION_CATCH; | |||
2124 | case JVMTI_EVENT_METHOD_ENTRY: | |||
2125 | return EI_METHOD_ENTRY; | |||
2126 | case JVMTI_EVENT_METHOD_EXIT: | |||
2127 | return EI_METHOD_EXIT; | |||
2128 | /* | |||
2129 | * There is no JVMTI_EVENT_METHOD_EXIT_WITH_RETURN_VALUE. | |||
2130 | * The normal JVMTI_EVENT_METHOD_EXIT always contains the return value. | |||
2131 | */ | |||
2132 | case JVMTI_EVENT_MONITOR_CONTENDED_ENTER: | |||
2133 | return EI_MONITOR_CONTENDED_ENTER; | |||
2134 | case JVMTI_EVENT_MONITOR_CONTENDED_ENTERED: | |||
2135 | return EI_MONITOR_CONTENDED_ENTERED; | |||
2136 | case JVMTI_EVENT_MONITOR_WAIT: | |||
2137 | return EI_MONITOR_WAIT; | |||
2138 | case JVMTI_EVENT_MONITOR_WAITED: | |||
2139 | return EI_MONITOR_WAITED; | |||
2140 | case JVMTI_EVENT_VM_INIT: | |||
2141 | return EI_VM_INIT; | |||
2142 | case JVMTI_EVENT_VM_DEATH: | |||
2143 | return EI_VM_DEATH; | |||
2144 | default: | |||
2145 | EXIT_ERROR(AGENT_ERROR_INVALID_INDEX,"JVMTI to EventIndex mapping"){ print_message(stderr, "JDWP exit error ", "\n", "%s(%d): %s [%s:%d]" , jvmtiErrorText((jvmtiError)((jvmtiError)(JVMTI_ERROR_MAX+64 +11))), ((jvmtiError)(JVMTI_ERROR_MAX+64+11)), ("JVMTI to EventIndex mapping" ==((void*)0)?"":"JVMTI to EventIndex mapping"), "/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" , 2145); debugInit_exit((jvmtiError)((jvmtiError)(JVMTI_ERROR_MAX +64+11)), "JVMTI to EventIndex mapping"); }; | |||
2146 | break; | |||
2147 | } | |||
2148 | return (EventIndex)0; | |||
2149 | } | |||
2150 | ||||
2151 | /* This routine is commonly used, maps jvmti and agent errors to the best | |||
2152 | * jdwp error code we can map to. | |||
2153 | */ | |||
2154 | jdwpError | |||
2155 | map2jdwpError(jvmtiError error) | |||
2156 | { | |||
2157 | switch ( (int)error ) { | |||
2158 | case JVMTI_ERROR_NONE: | |||
2159 | return JDWP_ERROR(NONE)0; | |||
2160 | case AGENT_ERROR_INVALID_THREAD((jvmtiError)(JVMTI_ERROR_MAX+64+23)): | |||
2161 | case JVMTI_ERROR_INVALID_THREAD: | |||
2162 | return JDWP_ERROR(INVALID_THREAD)10; | |||
2163 | case JVMTI_ERROR_INVALID_THREAD_GROUP: | |||
2164 | return JDWP_ERROR(INVALID_THREAD_GROUP)11; | |||
2165 | case JVMTI_ERROR_INVALID_PRIORITY: | |||
2166 | return JDWP_ERROR(INVALID_PRIORITY)12; | |||
2167 | case JVMTI_ERROR_THREAD_NOT_SUSPENDED: | |||
2168 | return JDWP_ERROR(THREAD_NOT_SUSPENDED)13; | |||
2169 | case JVMTI_ERROR_THREAD_SUSPENDED: | |||
2170 | return JDWP_ERROR(THREAD_SUSPENDED)14; | |||
2171 | case JVMTI_ERROR_THREAD_NOT_ALIVE: | |||
2172 | return JDWP_ERROR(INVALID_THREAD)10; | |||
2173 | case AGENT_ERROR_INVALID_OBJECT((jvmtiError)(JVMTI_ERROR_MAX+64+25)): | |||
2174 | case JVMTI_ERROR_INVALID_OBJECT: | |||
2175 | return JDWP_ERROR(INVALID_OBJECT)20; | |||
2176 | case JVMTI_ERROR_INVALID_CLASS: | |||
2177 | return JDWP_ERROR(INVALID_CLASS)21; | |||
2178 | case JVMTI_ERROR_CLASS_NOT_PREPARED: | |||
2179 | return JDWP_ERROR(CLASS_NOT_PREPARED)22; | |||
2180 | case JVMTI_ERROR_INVALID_METHODID: | |||
2181 | return JDWP_ERROR(INVALID_METHODID)23; | |||
2182 | case JVMTI_ERROR_INVALID_LOCATION: | |||
2183 | return JDWP_ERROR(INVALID_LOCATION)24; | |||
2184 | case JVMTI_ERROR_INVALID_FIELDID: | |||
2185 | return JDWP_ERROR(INVALID_FIELDID)25; | |||
2186 | case AGENT_ERROR_NO_MORE_FRAMES((jvmtiError)(JVMTI_ERROR_MAX+64+26)): | |||
2187 | case JVMTI_ERROR_NO_MORE_FRAMES: | |||
2188 | return JDWP_ERROR(NO_MORE_FRAMES)31; | |||
2189 | case JVMTI_ERROR_OPAQUE_FRAME: | |||
2190 | return JDWP_ERROR(OPAQUE_FRAME)32; | |||
2191 | case JVMTI_ERROR_TYPE_MISMATCH: | |||
2192 | return JDWP_ERROR(TYPE_MISMATCH)34; | |||
2193 | case JVMTI_ERROR_INVALID_SLOT: | |||
2194 | return JDWP_ERROR(INVALID_SLOT)35; | |||
2195 | case JVMTI_ERROR_DUPLICATE: | |||
2196 | return JDWP_ERROR(DUPLICATE)40; | |||
2197 | case JVMTI_ERROR_NOT_FOUND: | |||
2198 | return JDWP_ERROR(NOT_FOUND)41; | |||
2199 | case JVMTI_ERROR_INVALID_MONITOR: | |||
2200 | return JDWP_ERROR(INVALID_MONITOR)50; | |||
2201 | case JVMTI_ERROR_NOT_MONITOR_OWNER: | |||
2202 | return JDWP_ERROR(NOT_MONITOR_OWNER)51; | |||
2203 | case JVMTI_ERROR_INTERRUPT: | |||
2204 | return JDWP_ERROR(INTERRUPT)52; | |||
2205 | case JVMTI_ERROR_INVALID_CLASS_FORMAT: | |||
2206 | return JDWP_ERROR(INVALID_CLASS_FORMAT)60; | |||
2207 | case JVMTI_ERROR_CIRCULAR_CLASS_DEFINITION: | |||
2208 | return JDWP_ERROR(CIRCULAR_CLASS_DEFINITION)61; | |||
2209 | case JVMTI_ERROR_FAILS_VERIFICATION: | |||
2210 | return JDWP_ERROR(FAILS_VERIFICATION)62; | |||
2211 | case JVMTI_ERROR_INVALID_TYPESTATE: | |||
2212 | return JDWP_ERROR(INVALID_TYPESTATE)65; | |||
2213 | case JVMTI_ERROR_UNSUPPORTED_VERSION: | |||
2214 | return JDWP_ERROR(UNSUPPORTED_VERSION)68; | |||
2215 | case JVMTI_ERROR_NAMES_DONT_MATCH: | |||
2216 | return JDWP_ERROR(NAMES_DONT_MATCH)69; | |||
2217 | case AGENT_ERROR_NULL_POINTER((jvmtiError)(JVMTI_ERROR_MAX+64+21)): | |||
2218 | case JVMTI_ERROR_NULL_POINTER: | |||
2219 | return JDWP_ERROR(NULL_POINTER)100; | |||
2220 | case JVMTI_ERROR_ABSENT_INFORMATION: | |||
2221 | return JDWP_ERROR(ABSENT_INFORMATION)101; | |||
2222 | case AGENT_ERROR_INVALID_EVENT_TYPE((jvmtiError)(JVMTI_ERROR_MAX+64+24)): | |||
2223 | case JVMTI_ERROR_INVALID_EVENT_TYPE: | |||
2224 | return JDWP_ERROR(INVALID_EVENT_TYPE)102; | |||
2225 | case AGENT_ERROR_ILLEGAL_ARGUMENT((jvmtiError)(JVMTI_ERROR_MAX+64+22)): | |||
2226 | case JVMTI_ERROR_ILLEGAL_ARGUMENT: | |||
2227 | return JDWP_ERROR(ILLEGAL_ARGUMENT)103; | |||
2228 | case JVMTI_ERROR_OUT_OF_MEMORY: | |||
2229 | case AGENT_ERROR_OUT_OF_MEMORY((jvmtiError)(JVMTI_ERROR_MAX+64+8)): | |||
2230 | return JDWP_ERROR(OUT_OF_MEMORY)110; | |||
2231 | case JVMTI_ERROR_ACCESS_DENIED: | |||
2232 | return JDWP_ERROR(ACCESS_DENIED)111; | |||
2233 | case JVMTI_ERROR_WRONG_PHASE: | |||
2234 | case AGENT_ERROR_VM_DEAD((jvmtiError)(JVMTI_ERROR_MAX+64+2)): | |||
2235 | case AGENT_ERROR_NO_JNI_ENV((jvmtiError)(JVMTI_ERROR_MAX+64+3)): | |||
2236 | return JDWP_ERROR(VM_DEAD)112; | |||
2237 | case AGENT_ERROR_JNI_EXCEPTION((jvmtiError)(JVMTI_ERROR_MAX+64+4)): | |||
2238 | case JVMTI_ERROR_UNATTACHED_THREAD: | |||
2239 | return JDWP_ERROR(UNATTACHED_THREAD)115; | |||
2240 | case JVMTI_ERROR_NOT_AVAILABLE: | |||
2241 | case JVMTI_ERROR_MUST_POSSESS_CAPABILITY: | |||
2242 | return JDWP_ERROR(NOT_IMPLEMENTED)99; | |||
2243 | case JVMTI_ERROR_UNSUPPORTED_REDEFINITION_HIERARCHY_CHANGED: | |||
2244 | return JDWP_ERROR(HIERARCHY_CHANGE_NOT_IMPLEMENTED)66; | |||
2245 | case JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_DELETED: | |||
2246 | return JDWP_ERROR(DELETE_METHOD_NOT_IMPLEMENTED)67; | |||
2247 | case JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_ADDED: | |||
2248 | return JDWP_ERROR(ADD_METHOD_NOT_IMPLEMENTED)63; | |||
2249 | case JVMTI_ERROR_UNSUPPORTED_REDEFINITION_SCHEMA_CHANGED: | |||
2250 | return JDWP_ERROR(SCHEMA_CHANGE_NOT_IMPLEMENTED)64; | |||
2251 | case JVMTI_ERROR_UNSUPPORTED_REDEFINITION_CLASS_MODIFIERS_CHANGED: | |||
2252 | return JDWP_ERROR(CLASS_MODIFIERS_CHANGE_NOT_IMPLEMENTED)70; | |||
2253 | case JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_MODIFIERS_CHANGED: | |||
2254 | return JDWP_ERROR(METHOD_MODIFIERS_CHANGE_NOT_IMPLEMENTED)71; | |||
2255 | case JVMTI_ERROR_UNSUPPORTED_REDEFINITION_CLASS_ATTRIBUTE_CHANGED: | |||
2256 | return JDWP_ERROR(CLASS_ATTRIBUTE_CHANGE_NOT_IMPLEMENTED)72; | |||
2257 | case AGENT_ERROR_NOT_CURRENT_FRAME((jvmtiError)(JVMTI_ERROR_MAX+64+7)): | |||
2258 | return JDWP_ERROR(NOT_CURRENT_FRAME)33; | |||
2259 | case AGENT_ERROR_INVALID_TAG((jvmtiError)(JVMTI_ERROR_MAX+64+9)): | |||
2260 | return JDWP_ERROR(INVALID_TAG)500; | |||
2261 | case AGENT_ERROR_ALREADY_INVOKING((jvmtiError)(JVMTI_ERROR_MAX+64+10)): | |||
2262 | return JDWP_ERROR(ALREADY_INVOKING)502; | |||
2263 | case AGENT_ERROR_INVALID_INDEX((jvmtiError)(JVMTI_ERROR_MAX+64+11)): | |||
2264 | return JDWP_ERROR(INVALID_INDEX)503; | |||
2265 | case AGENT_ERROR_INVALID_LENGTH((jvmtiError)(JVMTI_ERROR_MAX+64+12)): | |||
2266 | return JDWP_ERROR(INVALID_LENGTH)504; | |||
2267 | case AGENT_ERROR_INVALID_STRING((jvmtiError)(JVMTI_ERROR_MAX+64+13)): | |||
2268 | return JDWP_ERROR(INVALID_STRING)506; | |||
2269 | case AGENT_ERROR_INVALID_CLASS_LOADER((jvmtiError)(JVMTI_ERROR_MAX+64+14)): | |||
2270 | return JDWP_ERROR(INVALID_CLASS_LOADER)507; | |||
2271 | case AGENT_ERROR_INVALID_ARRAY((jvmtiError)(JVMTI_ERROR_MAX+64+15)): | |||
2272 | return JDWP_ERROR(INVALID_ARRAY)508; | |||
2273 | case AGENT_ERROR_TRANSPORT_LOAD((jvmtiError)(JVMTI_ERROR_MAX+64+16)): | |||
2274 | return JDWP_ERROR(TRANSPORT_LOAD)509; | |||
2275 | case AGENT_ERROR_TRANSPORT_INIT((jvmtiError)(JVMTI_ERROR_MAX+64+17)): | |||
2276 | return JDWP_ERROR(TRANSPORT_INIT)510; | |||
2277 | case AGENT_ERROR_NATIVE_METHOD((jvmtiError)(JVMTI_ERROR_MAX+64+18)): | |||
2278 | return JDWP_ERROR(NATIVE_METHOD)511; | |||
2279 | case AGENT_ERROR_INVALID_COUNT((jvmtiError)(JVMTI_ERROR_MAX+64+19)): | |||
2280 | return JDWP_ERROR(INVALID_COUNT)512; | |||
2281 | case AGENT_ERROR_INVALID_FRAMEID((jvmtiError)(JVMTI_ERROR_MAX+64+20)): | |||
2282 | return JDWP_ERROR(INVALID_FRAMEID)30; | |||
2283 | case JVMTI_ERROR_INTERNAL: | |||
2284 | case JVMTI_ERROR_INVALID_ENVIRONMENT: | |||
2285 | case AGENT_ERROR_INTERNAL((jvmtiError)(JVMTI_ERROR_MAX+64+1)): | |||
2286 | case AGENT_ERROR_JVMTI_INTERNAL((jvmtiError)(JVMTI_ERROR_MAX+64+5)): | |||
2287 | case AGENT_ERROR_JDWP_INTERNAL((jvmtiError)(JVMTI_ERROR_MAX+64+6)): | |||
2288 | return JDWP_ERROR(INTERNAL)113; | |||
2289 | default: | |||
2290 | break; | |||
2291 | } | |||
2292 | return JDWP_ERROR(INTERNAL)113; | |||
2293 | } | |||
2294 | ||||
2295 | jint | |||
2296 | map2jdwpSuspendStatus(jint state) | |||
2297 | { | |||
2298 | jint status = 0; | |||
2299 | if ( ( state & JVMTI_THREAD_STATE_SUSPENDED ) != 0 ) { | |||
2300 | status = JDWP_SUSPEND_STATUS(SUSPENDED)0x1; | |||
2301 | } | |||
2302 | return status; | |||
2303 | } | |||
2304 | ||||
2305 | jdwpThreadStatus | |||
2306 | map2jdwpThreadStatus(jint state) | |||
2307 | { | |||
2308 | jdwpThreadStatus status; | |||
2309 | ||||
2310 | status = (jdwpThreadStatus)(-1); | |||
2311 | ||||
2312 | if ( ! ( state & JVMTI_THREAD_STATE_ALIVE ) ) { | |||
2313 | if ( state & JVMTI_THREAD_STATE_TERMINATED ) { | |||
2314 | status = JDWP_THREAD_STATUS(ZOMBIE)0; | |||
2315 | } else { | |||
2316 | /* FIXUP? New JDWP #define for not started? */ | |||
2317 | status = (jdwpThreadStatus)(-1); | |||
2318 | } | |||
2319 | } else { | |||
2320 | if ( state & JVMTI_THREAD_STATE_SLEEPING ) { | |||
2321 | status = JDWP_THREAD_STATUS(SLEEPING)2; | |||
2322 | } else if ( state & JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER ) { | |||
2323 | status = JDWP_THREAD_STATUS(MONITOR)3; | |||
2324 | } else if ( state & JVMTI_THREAD_STATE_WAITING ) { | |||
2325 | status = JDWP_THREAD_STATUS(WAIT)4; | |||
2326 | } else if ( state & JVMTI_THREAD_STATE_RUNNABLE ) { | |||
2327 | status = JDWP_THREAD_STATUS(RUNNING)1; | |||
2328 | } | |||
2329 | } | |||
2330 | return status; | |||
2331 | } | |||
2332 | ||||
2333 | jint | |||
2334 | map2jdwpClassStatus(jint classStatus) | |||
2335 | { | |||
2336 | jint status = 0; | |||
2337 | if ( ( classStatus & JVMTI_CLASS_STATUS_VERIFIED ) != 0 ) { | |||
2338 | status |= JDWP_CLASS_STATUS(VERIFIED)1; | |||
2339 | } | |||
2340 | if ( ( classStatus & JVMTI_CLASS_STATUS_PREPARED ) != 0 ) { | |||
2341 | status |= JDWP_CLASS_STATUS(PREPARED)2; | |||
2342 | } | |||
2343 | if ( ( classStatus & JVMTI_CLASS_STATUS_INITIALIZED ) != 0 ) { | |||
2344 | status |= JDWP_CLASS_STATUS(INITIALIZED)4; | |||
2345 | } | |||
2346 | if ( ( classStatus & JVMTI_CLASS_STATUS_ERROR ) != 0 ) { | |||
2347 | status |= JDWP_CLASS_STATUS(ERROR)8; | |||
2348 | } | |||
2349 | return status; | |||
2350 | } | |||
2351 | ||||
2352 | void | |||
2353 | log_debugee_location(const char *func, | |||
2354 | jthread thread, jmethodID method, jlocation location) | |||
2355 | { | |||
2356 | int logging_locations = LOG_TEST(JDWP_LOG_LOC)(gdata->log_flags & (0x00000020)); | |||
2357 | ||||
2358 | if ( logging_locations ) { | |||
2359 | char *method_name; | |||
2360 | char *class_sig; | |||
2361 | jvmtiError error; | |||
2362 | jvmtiThreadInfo info; | |||
2363 | jint state; | |||
2364 | ||||
2365 | /* Get thread information */ | |||
2366 | info.name = NULL((void*)0); | |||
2367 | error = FUNC_PTR(gdata->jvmti,GetThreadInfo)(*((*(gdata->jvmti))->GetThreadInfo)) | |||
2368 | (gdata->jvmti, thread, &info); | |||
2369 | if ( error != JVMTI_ERROR_NONE) { | |||
2370 | info.name = NULL((void*)0); | |||
2371 | } | |||
2372 | error = FUNC_PTR(gdata->jvmti,GetThreadState)(*((*(gdata->jvmti))->GetThreadState)) | |||
2373 | (gdata->jvmti, thread, &state); | |||
2374 | if ( error != JVMTI_ERROR_NONE) { | |||
2375 | state = 0; | |||
2376 | } | |||
2377 | ||||
2378 | /* Get method if necessary */ | |||
2379 | if ( method==NULL((void*)0) ) { | |||
2380 | error = FUNC_PTR(gdata->jvmti,GetFrameLocation)(*((*(gdata->jvmti))->GetFrameLocation)) | |||
2381 | (gdata->jvmti, thread, 0, &method, &location); | |||
2382 | if ( error != JVMTI_ERROR_NONE ) { | |||
2383 | method = NULL((void*)0); | |||
2384 | location = 0; | |||
2385 | } | |||
2386 | } | |||
2387 | ||||
2388 | /* Get method name */ | |||
2389 | method_name = NULL((void*)0); | |||
2390 | if ( method != NULL((void*)0) ) { | |||
2391 | error = methodSignature(method, &method_name, NULL((void*)0), NULL((void*)0)); | |||
2392 | if ( error != JVMTI_ERROR_NONE ) { | |||
2393 | method_name = NULL((void*)0); | |||
2394 | } | |||
2395 | } | |||
2396 | ||||
2397 | /* Get class signature */ | |||
2398 | class_sig = NULL((void*)0); | |||
2399 | if ( method != NULL((void*)0) ) { | |||
2400 | jclass clazz; | |||
2401 | ||||
2402 | error = methodClass(method, &clazz); | |||
2403 | if ( error == JVMTI_ERROR_NONE ) { | |||
2404 | error = classSignature(clazz, &class_sig, NULL((void*)0)); | |||
2405 | if ( error != JVMTI_ERROR_NONE ) { | |||
2406 | class_sig = NULL((void*)0); | |||
2407 | } | |||
2408 | } | |||
2409 | } | |||
2410 | ||||
2411 | /* Issue log message */ | |||
2412 | LOG_LOC(("%s: debugee: thread=%p(%s:0x%x),method=%p(%s@%d;%s)",((gdata->log_flags & (0x00000020)) ?(log_message_begin ("LOC","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,2416), log_message_end ("%s: debugee: thread=%p(%s:0x%x),method=%p(%s@%d;%s)" , func, thread, info.name==((void*)0) ? "?" : info.name, state , method, method_name==((void*)0) ? "?" : method_name, (int)location , class_sig==((void*)0) ? "?" : class_sig)):((void)0)) | |||
2413 | func,((gdata->log_flags & (0x00000020)) ?(log_message_begin ("LOC","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,2416), log_message_end ("%s: debugee: thread=%p(%s:0x%x),method=%p(%s@%d;%s)" , func, thread, info.name==((void*)0) ? "?" : info.name, state , method, method_name==((void*)0) ? "?" : method_name, (int)location , class_sig==((void*)0) ? "?" : class_sig)):((void)0)) | |||
2414 | thread, info.name==NULL ? "?" : info.name, state,((gdata->log_flags & (0x00000020)) ?(log_message_begin ("LOC","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,2416), log_message_end ("%s: debugee: thread=%p(%s:0x%x),method=%p(%s@%d;%s)" , func, thread, info.name==((void*)0) ? "?" : info.name, state , method, method_name==((void*)0) ? "?" : method_name, (int)location , class_sig==((void*)0) ? "?" : class_sig)):((void)0)) | |||
2415 | method, method_name==NULL ? "?" : method_name,((gdata->log_flags & (0x00000020)) ?(log_message_begin ("LOC","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,2416), log_message_end ("%s: debugee: thread=%p(%s:0x%x),method=%p(%s@%d;%s)" , func, thread, info.name==((void*)0) ? "?" : info.name, state , method, method_name==((void*)0) ? "?" : method_name, (int)location , class_sig==((void*)0) ? "?" : class_sig)):((void)0)) | |||
2416 | (int)location, class_sig==NULL ? "?" : class_sig))((gdata->log_flags & (0x00000020)) ?(log_message_begin ("LOC","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,2416), log_message_end ("%s: debugee: thread=%p(%s:0x%x),method=%p(%s@%d;%s)" , func, thread, info.name==((void*)0) ? "?" : info.name, state , method, method_name==((void*)0) ? "?" : method_name, (int)location , class_sig==((void*)0) ? "?" : class_sig)):((void)0)); | |||
2417 | ||||
2418 | /* Free memory */ | |||
2419 | if ( class_sig != NULL((void*)0) ) { | |||
2420 | jvmtiDeallocate(class_sig); | |||
2421 | } | |||
2422 | if ( method_name != NULL((void*)0) ) { | |||
2423 | jvmtiDeallocate(method_name); | |||
2424 | } | |||
2425 | if ( info.name != NULL((void*)0) ) { | |||
2426 | jvmtiDeallocate(info.name); | |||
2427 | } | |||
2428 | } | |||
2429 | } | |||
2430 | ||||
2431 | /* ********************************************************************* */ | |||
2432 | /* JDK 6.0: Use of new Heap Iteration functions */ | |||
2433 | /* ********************************************************************* */ | |||
2434 | ||||
2435 | /* ********************************************************************* */ | |||
2436 | /* Instances */ | |||
2437 | ||||
2438 | /* Structure to hold class instances heap iteration data (arg user_data) */ | |||
2439 | typedef struct ClassInstancesData { | |||
2440 | jint instCount; | |||
2441 | jint maxInstances; | |||
2442 | jlong objTag; | |||
2443 | jvmtiError error; | |||
2444 | } ClassInstancesData; | |||
2445 | ||||
2446 | /* Callback for instance object tagging (heap_reference_callback). */ | |||
2447 | static jint JNICALL | |||
2448 | cbObjectTagInstance(jvmtiHeapReferenceKind reference_kind, | |||
2449 | const jvmtiHeapReferenceInfo* reference_info, jlong class_tag, | |||
2450 | jlong referrer_class_tag, jlong size, | |||
2451 | jlong* tag_ptr, jlong* referrer_tag_ptr, jint length, void* user_data) | |||
2452 | { | |||
2453 | ClassInstancesData *data; | |||
2454 | ||||
2455 | /* Check data structure */ | |||
2456 | data = (ClassInstancesData*)user_data; | |||
2457 | if (data == NULL((void*)0)) { | |||
2458 | return JVMTI_VISIT_ABORT; | |||
2459 | } | |||
2460 | ||||
2461 | /* If we have tagged enough objects, just abort */ | |||
2462 | if ( data->maxInstances != 0 && data->instCount >= data->maxInstances ) { | |||
2463 | return JVMTI_VISIT_ABORT; | |||
2464 | } | |||
2465 | ||||
2466 | /* If tagged already, just continue */ | |||
2467 | if ( (*tag_ptr) != (jlong)0 ) { | |||
2468 | return JVMTI_VISIT_OBJECTS; | |||
2469 | } | |||
2470 | ||||
2471 | /* Tag the object so we don't count it again, and so we can retrieve it */ | |||
2472 | (*tag_ptr) = data->objTag; | |||
2473 | data->instCount++; | |||
2474 | return JVMTI_VISIT_OBJECTS; | |||
2475 | } | |||
2476 | ||||
2477 | /* Get instances for one class */ | |||
2478 | jvmtiError | |||
2479 | classInstances(jclass klass, ObjectBatch *instances, int maxInstances) | |||
2480 | { | |||
2481 | ClassInstancesData data; | |||
2482 | jvmtiHeapCallbacks heap_callbacks; | |||
2483 | jvmtiError error; | |||
2484 | jvmtiEnv *jvmti; | |||
2485 | ||||
2486 | /* Check interface assumptions */ | |||
2487 | ||||
2488 | if (klass == NULL((void*)0)) { | |||
2489 | return AGENT_ERROR_INVALID_OBJECT((jvmtiError)(JVMTI_ERROR_MAX+64+25)); | |||
2490 | } | |||
2491 | ||||
2492 | if ( maxInstances < 0 || instances == NULL((void*)0)) { | |||
2493 | return AGENT_ERROR_ILLEGAL_ARGUMENT((jvmtiError)(JVMTI_ERROR_MAX+64+22)); | |||
2494 | } | |||
2495 | ||||
2496 | /* Initialize return information */ | |||
2497 | instances->count = 0; | |||
2498 | instances->objects = NULL((void*)0); | |||
2499 | ||||
2500 | /* Get jvmti environment to use */ | |||
2501 | jvmti = getSpecialJvmti(); | |||
2502 | if ( jvmti == NULL((void*)0) ) { | |||
2503 | return AGENT_ERROR_INTERNAL((jvmtiError)(JVMTI_ERROR_MAX+64+1)); | |||
2504 | } | |||
2505 | ||||
2506 | /* Setup data to passed around the callbacks */ | |||
2507 | data.instCount = 0; | |||
2508 | data.maxInstances = maxInstances; | |||
2509 | data.objTag = (jlong)1; | |||
2510 | data.error = JVMTI_ERROR_NONE; | |||
2511 | ||||
2512 | /* Clear out callbacks structure */ | |||
2513 | (void)memset(&heap_callbacks,0,sizeof(heap_callbacks)); | |||
2514 | ||||
2515 | /* Set the callbacks we want */ | |||
2516 | heap_callbacks.heap_reference_callback = &cbObjectTagInstance; | |||
2517 | ||||
2518 | /* Follow references, no initiating object, just this class, all objects */ | |||
2519 | error = JVMTI_FUNC_PTR(jvmti,FollowReferences)(*((*((((gdata->log_flags & (0x00000004))?(log_message_begin ("JVMTI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,2519), log_message_end ("%s()","FollowReferences")):((void)0 )),(jvmti))))->FollowReferences)) | |||
2520 | (jvmti, 0, klass, NULL((void*)0), &heap_callbacks, &data); | |||
2521 | if ( error == JVMTI_ERROR_NONE ) { | |||
2522 | error = data.error; | |||
2523 | } | |||
2524 | ||||
2525 | /* Get all the instances now that they are tagged */ | |||
2526 | if ( error == JVMTI_ERROR_NONE ) { | |||
2527 | error = JVMTI_FUNC_PTR(jvmti,GetObjectsWithTags)(*((*((((gdata->log_flags & (0x00000004))?(log_message_begin ("JVMTI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,2527), log_message_end ("%s()","GetObjectsWithTags")):((void )0)),(jvmti))))->GetObjectsWithTags)) | |||
2528 | (jvmti, 1, &(data.objTag), &(instances->count), | |||
2529 | &(instances->objects), NULL((void*)0)); | |||
2530 | /* Verify we got the count we expected */ | |||
2531 | if ( data.instCount != instances->count ) { | |||
2532 | error = AGENT_ERROR_INTERNAL((jvmtiError)(JVMTI_ERROR_MAX+64+1)); | |||
2533 | } | |||
2534 | } | |||
2535 | ||||
2536 | /* Dispose of any special jvmti environment */ | |||
2537 | (void)JVMTI_FUNC_PTR(jvmti,DisposeEnvironment)(*((*((((gdata->log_flags & (0x00000004))?(log_message_begin ("JVMTI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,2537), log_message_end ("%s()","DisposeEnvironment")):((void )0)),(jvmti))))->DisposeEnvironment))(jvmti); | |||
2538 | return error; | |||
2539 | } | |||
2540 | ||||
2541 | /* ********************************************************************* */ | |||
2542 | /* Instance counts. */ | |||
2543 | ||||
2544 | /* Macros to convert a class or instance tag to an index and back again */ | |||
2545 | #define INDEX2CLASSTAG(i)((jlong)((i)+1)) ((jlong)((i)+1)) | |||
2546 | #define CLASSTAG2INDEX(t)(((int)(t))-1) (((int)(t))-1) | |||
2547 | #define JLONG_ABS(x)(((x)<(jlong)0)?-(x):(x)) (((x)<(jlong)0)?-(x):(x)) | |||
2548 | ||||
2549 | /* Structure to hold class count heap traversal data (arg user_data) */ | |||
2550 | typedef struct ClassCountData { | |||
2551 | int classCount; | |||
2552 | jlong *counts; | |||
2553 | jlong negObjTag; | |||
2554 | jvmtiError error; | |||
2555 | } ClassCountData; | |||
2556 | ||||
2557 | /* Two different cbObjectCounter's, one for FollowReferences, one for | |||
2558 | * IterateThroughHeap. Pick a card, any card. | |||
2559 | */ | |||
2560 | ||||
2561 | /* Callback for object count heap traversal (heap_reference_callback) */ | |||
2562 | static jint JNICALL | |||
2563 | cbObjectCounterFromRef(jvmtiHeapReferenceKind reference_kind, | |||
2564 | const jvmtiHeapReferenceInfo* reference_info, jlong class_tag, | |||
2565 | jlong referrer_class_tag, jlong size, | |||
2566 | jlong* tag_ptr, jlong* referrer_tag_ptr, jint length, void* user_data) | |||
2567 | { | |||
2568 | ClassCountData *data; | |||
2569 | int index; | |||
2570 | jlong jindex; | |||
2571 | jlong tag; | |||
2572 | ||||
2573 | /* Check data structure */ | |||
2574 | data = (ClassCountData*)user_data; | |||
2575 | if (data == NULL((void*)0)) { | |||
2576 | return JVMTI_VISIT_ABORT; | |||
2577 | } | |||
2578 | ||||
2579 | /* Classes with no class_tag should have been filtered out. */ | |||
2580 | if ( class_tag == (jlong)0 ) { | |||
2581 | data->error = AGENT_ERROR_INTERNAL((jvmtiError)(JVMTI_ERROR_MAX+64+1)); | |||
2582 | return JVMTI_VISIT_ABORT; | |||
2583 | } | |||
2584 | ||||
2585 | /* Class tag not one we really want (jclass not in supplied list) */ | |||
2586 | if ( class_tag == data->negObjTag ) { | |||
2587 | return JVMTI_VISIT_OBJECTS; | |||
2588 | } | |||
2589 | ||||
2590 | /* If object tag is negative, just continue, we counted it */ | |||
2591 | tag = (*tag_ptr); | |||
2592 | if ( tag < (jlong)0 ) { | |||
2593 | return JVMTI_VISIT_OBJECTS; | |||
2594 | } | |||
2595 | ||||
2596 | /* Tag the object with a negative value just so we don't count it again */ | |||
2597 | if ( tag == (jlong)0 ) { | |||
2598 | /* This object had no tag value, so we give it the negObjTag value */ | |||
2599 | (*tag_ptr) = data->negObjTag; | |||
2600 | } else { | |||
2601 | /* If this object had a positive tag value, it must be one of the | |||
2602 | * jclass objects we tagged. We need to preserve the value of | |||
2603 | * this tag for later objects that might have this as a class | |||
2604 | * tag, so we just make the existing tag value negative. | |||
2605 | */ | |||
2606 | (*tag_ptr) = -tag; | |||
2607 | } | |||
2608 | ||||
2609 | /* Absolute value of class tag is an index into the counts[] array */ | |||
2610 | jindex = JLONG_ABS(class_tag)(((class_tag)<(jlong)0)?-(class_tag):(class_tag)); | |||
2611 | index = CLASSTAG2INDEX(jindex)(((int)(jindex))-1); | |||
2612 | if (index < 0 || index >= data->classCount) { | |||
2613 | data->error = AGENT_ERROR_ILLEGAL_ARGUMENT((jvmtiError)(JVMTI_ERROR_MAX+64+22)); | |||
2614 | return JVMTI_VISIT_ABORT; | |||
2615 | } | |||
2616 | ||||
2617 | /* Bump instance count on this class */ | |||
2618 | data->counts[index]++; | |||
2619 | return JVMTI_VISIT_OBJECTS; | |||
2620 | } | |||
2621 | ||||
2622 | /* Callback for instance count heap traversal (heap_iteration_callback) */ | |||
2623 | static jint JNICALL | |||
2624 | cbObjectCounter(jlong class_tag, jlong size, jlong* tag_ptr, jint length, | |||
2625 | void* user_data) | |||
2626 | { | |||
2627 | ClassCountData *data; | |||
2628 | int index; | |||
2629 | ||||
2630 | /* Check data structure */ | |||
2631 | data = (ClassCountData*)user_data; | |||
2632 | if (data == NULL((void*)0)) { | |||
2633 | return JVMTI_VISIT_ABORT; | |||
2634 | } | |||
2635 | ||||
2636 | /* Classes with no tag should be filtered out. */ | |||
2637 | if ( class_tag == (jlong)0 ) { | |||
2638 | data->error = AGENT_ERROR_INTERNAL((jvmtiError)(JVMTI_ERROR_MAX+64+1)); | |||
2639 | return JVMTI_VISIT_ABORT; | |||
2640 | } | |||
2641 | ||||
2642 | /* Class tag is actually an index into data arrays */ | |||
2643 | index = CLASSTAG2INDEX(class_tag)(((int)(class_tag))-1); | |||
2644 | if (index < 0 || index >= data->classCount) { | |||
2645 | data->error = AGENT_ERROR_ILLEGAL_ARGUMENT((jvmtiError)(JVMTI_ERROR_MAX+64+22)); | |||
2646 | return JVMTI_VISIT_ABORT; | |||
2647 | } | |||
2648 | ||||
2649 | /* Bump instance count on this class */ | |||
2650 | data->counts[index]++; | |||
2651 | return JVMTI_VISIT_OBJECTS; | |||
2652 | } | |||
2653 | ||||
2654 | /* Get instance counts for a set of classes */ | |||
2655 | jvmtiError | |||
2656 | classInstanceCounts(jint classCount, jclass *classes, jlong *counts) | |||
2657 | { | |||
2658 | jvmtiHeapCallbacks heap_callbacks; | |||
2659 | ClassCountData data; | |||
2660 | jvmtiError error; | |||
2661 | jvmtiEnv *jvmti; | |||
2662 | int i; | |||
2663 | ||||
2664 | /* Check interface assumptions */ | |||
2665 | if ( classes == NULL((void*)0) || classCount <= 0 || counts == NULL((void*)0) ) { | |||
2666 | return AGENT_ERROR_ILLEGAL_ARGUMENT((jvmtiError)(JVMTI_ERROR_MAX+64+22)); | |||
2667 | } | |||
2668 | ||||
2669 | /* Initialize return information */ | |||
2670 | for ( i = 0 ; i < classCount ; i++ ) { | |||
2671 | counts[i] = (jlong)0; | |||
2672 | } | |||
2673 | ||||
2674 | /* Get jvmti environment to use */ | |||
2675 | jvmti = getSpecialJvmti(); | |||
2676 | if ( jvmti == NULL((void*)0) ) { | |||
2677 | return AGENT_ERROR_INTERNAL((jvmtiError)(JVMTI_ERROR_MAX+64+1)); | |||
2678 | } | |||
2679 | ||||
2680 | /* Setup class data structure */ | |||
2681 | data.error = JVMTI_ERROR_NONE; | |||
2682 | data.classCount = classCount; | |||
2683 | data.counts = counts; | |||
2684 | ||||
2685 | error = JVMTI_ERROR_NONE; | |||
2686 | /* Set tags on classes, use index in classes[] as the tag value. */ | |||
2687 | error = JVMTI_ERROR_NONE; | |||
2688 | for ( i = 0 ; i < classCount ; i++ ) { | |||
2689 | if (classes[i] != NULL((void*)0)) { | |||
2690 | jlong tag; | |||
2691 | ||||
2692 | tag = INDEX2CLASSTAG(i)((jlong)((i)+1)); | |||
2693 | error = JVMTI_FUNC_PTR(jvmti,SetTag)(*((*((((gdata->log_flags & (0x00000004))?(log_message_begin ("JVMTI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,2693), log_message_end ("%s()","SetTag")):((void)0)),(jvmti) )))->SetTag)) (jvmti, classes[i], tag); | |||
2694 | if ( error != JVMTI_ERROR_NONE ) { | |||
2695 | break; | |||
2696 | } | |||
2697 | } | |||
2698 | } | |||
2699 | ||||
2700 | /* Traverse heap, two ways to do this for instance counts. */ | |||
2701 | if ( error == JVMTI_ERROR_NONE ) { | |||
2702 | ||||
2703 | /* Clear out callbacks structure */ | |||
2704 | (void)memset(&heap_callbacks,0,sizeof(heap_callbacks)); | |||
2705 | ||||
2706 | /* Check debug flags to see how to do this. */ | |||
2707 | if ( (gdata->debugflags & USE_ITERATE_THROUGH_HEAP0X001) == 0 ) { | |||
2708 | ||||
2709 | /* Using FollowReferences only gives us live objects, but we | |||
2710 | * need to tag the objects to avoid counting them twice since | |||
2711 | * the callback is per reference. | |||
2712 | * The jclass objects have been tagged with their index in the | |||
2713 | * supplied list, and that tag may flip to negative if it | |||
2714 | * is also an object of interest. | |||
2715 | * All other objects being counted that weren't in the | |||
2716 | * supplied classes list will have a negative classCount | |||
2717 | * tag value. So all objects counted will have negative tags. | |||
2718 | * If the absolute tag value is an index in the supplied | |||
2719 | * list, then it's one of the supplied classes. | |||
2720 | */ | |||
2721 | data.negObjTag = -INDEX2CLASSTAG(classCount)((jlong)((classCount)+1)); | |||
2722 | ||||
2723 | /* Setup callbacks, only using object reference callback */ | |||
2724 | heap_callbacks.heap_reference_callback = &cbObjectCounterFromRef; | |||
2725 | ||||
2726 | /* Follow references, no initiating object, tagged classes only */ | |||
2727 | error = JVMTI_FUNC_PTR(jvmti,FollowReferences)(*((*((((gdata->log_flags & (0x00000004))?(log_message_begin ("JVMTI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,2727), log_message_end ("%s()","FollowReferences")):((void)0 )),(jvmti))))->FollowReferences)) | |||
2728 | (jvmti, JVMTI_HEAP_FILTER_CLASS_UNTAGGED, | |||
2729 | NULL((void*)0), NULL((void*)0), &heap_callbacks, &data); | |||
2730 | ||||
2731 | } else { | |||
2732 | ||||
2733 | /* Using IterateThroughHeap means that we will visit each object | |||
2734 | * once, so no special tag tricks here. Just simple counting. | |||
2735 | * However in this case the object might not be live, so we do | |||
2736 | * a GC beforehand to make sure we minimize this. | |||
2737 | */ | |||
2738 | ||||
2739 | /* FIXUP: Need some kind of trigger here to avoid excessive GC's? */ | |||
2740 | error = JVMTI_FUNC_PTR(jvmti,ForceGarbageCollection)(*((*((((gdata->log_flags & (0x00000004))?(log_message_begin ("JVMTI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,2740), log_message_end ("%s()","ForceGarbageCollection")):(( void)0)),(jvmti))))->ForceGarbageCollection))(jvmti); | |||
2741 | if ( error != JVMTI_ERROR_NONE ) { | |||
2742 | ||||
2743 | /* Setup callbacks, just need object callback */ | |||
2744 | heap_callbacks.heap_iteration_callback = &cbObjectCounter; | |||
2745 | ||||
2746 | /* Iterate through entire heap, tagged classes only */ | |||
2747 | error = JVMTI_FUNC_PTR(jvmti,IterateThroughHeap)(*((*((((gdata->log_flags & (0x00000004))?(log_message_begin ("JVMTI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,2747), log_message_end ("%s()","IterateThroughHeap")):((void )0)),(jvmti))))->IterateThroughHeap)) | |||
2748 | (jvmti, JVMTI_HEAP_FILTER_CLASS_UNTAGGED, | |||
2749 | NULL((void*)0), &heap_callbacks, &data); | |||
2750 | ||||
2751 | } | |||
2752 | } | |||
2753 | ||||
2754 | /* Use data error if needed */ | |||
2755 | if ( error == JVMTI_ERROR_NONE ) { | |||
2756 | error = data.error; | |||
2757 | } | |||
2758 | ||||
2759 | } | |||
2760 | ||||
2761 | /* Dispose of any special jvmti environment */ | |||
2762 | (void)JVMTI_FUNC_PTR(jvmti,DisposeEnvironment)(*((*((((gdata->log_flags & (0x00000004))?(log_message_begin ("JVMTI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,2762), log_message_end ("%s()","DisposeEnvironment")):((void )0)),(jvmti))))->DisposeEnvironment))(jvmti); | |||
2763 | return error; | |||
2764 | } | |||
2765 | ||||
2766 | /* ********************************************************************* */ | |||
2767 | /* Referrers */ | |||
2768 | ||||
2769 | /* Structure to hold object referrer heap traversal data (arg user_data) */ | |||
2770 | typedef struct ReferrerData { | |||
2771 | int refCount; | |||
2772 | int maxObjects; | |||
2773 | jlong refTag; | |||
2774 | jlong objTag; | |||
2775 | jboolean selfRef; | |||
2776 | jvmtiError error; | |||
2777 | } ReferrerData; | |||
2778 | ||||
2779 | /* Callback for referrers object tagging (heap_reference_callback). */ | |||
2780 | static jint JNICALL | |||
2781 | cbObjectTagReferrer(jvmtiHeapReferenceKind reference_kind, | |||
2782 | const jvmtiHeapReferenceInfo* reference_info, jlong class_tag, | |||
2783 | jlong referrer_class_tag, jlong size, | |||
2784 | jlong* tag_ptr, jlong* referrer_tag_ptr, jint length, void* user_data) | |||
2785 | { | |||
2786 | ReferrerData *data; | |||
2787 | ||||
2788 | /* Check data structure */ | |||
2789 | data = (ReferrerData*)user_data; | |||
2790 | if (data == NULL((void*)0)) { | |||
2791 | return JVMTI_VISIT_ABORT; | |||
2792 | } | |||
2793 | ||||
2794 | /* If we have tagged enough objects, just abort */ | |||
2795 | if ( data->maxObjects != 0 && data->refCount >= data->maxObjects ) { | |||
2796 | return JVMTI_VISIT_ABORT; | |||
2797 | } | |||
2798 | ||||
2799 | /* If not of interest, just continue */ | |||
2800 | if ( (*tag_ptr) != data->objTag ) { | |||
2801 | return JVMTI_VISIT_OBJECTS; | |||
2802 | } | |||
2803 | ||||
2804 | /* Self reference that we haven't counted? */ | |||
2805 | if ( tag_ptr == referrer_tag_ptr ) { | |||
2806 | if ( data->selfRef == JNI_FALSE0 ) { | |||
2807 | data->selfRef = JNI_TRUE1; | |||
2808 | data->refCount++; | |||
2809 | } | |||
2810 | return JVMTI_VISIT_OBJECTS; | |||
2811 | } | |||
2812 | ||||
2813 | /* If the referrer can be tagged, and hasn't been tagged, tag it */ | |||
2814 | if ( referrer_tag_ptr != NULL((void*)0) ) { | |||
2815 | if ( (*referrer_tag_ptr) == (jlong)0 ) { | |||
2816 | *referrer_tag_ptr = data->refTag; | |||
2817 | data->refCount++; | |||
2818 | } | |||
2819 | } | |||
2820 | return JVMTI_VISIT_OBJECTS; | |||
2821 | } | |||
2822 | ||||
2823 | /* Heap traversal to find referrers of an object */ | |||
2824 | jvmtiError | |||
2825 | objectReferrers(jobject obj, ObjectBatch *referrers, int maxObjects) | |||
2826 | { | |||
2827 | jvmtiHeapCallbacks heap_callbacks; | |||
2828 | ReferrerData data; | |||
2829 | jvmtiError error; | |||
2830 | jvmtiEnv *jvmti; | |||
2831 | ||||
2832 | /* Check interface assumptions */ | |||
2833 | if (obj == NULL((void*)0)) { | |||
2834 | return AGENT_ERROR_INVALID_OBJECT((jvmtiError)(JVMTI_ERROR_MAX+64+25)); | |||
2835 | } | |||
2836 | if (referrers == NULL((void*)0) || maxObjects < 0 ) { | |||
2837 | return AGENT_ERROR_ILLEGAL_ARGUMENT((jvmtiError)(JVMTI_ERROR_MAX+64+22)); | |||
2838 | } | |||
2839 | ||||
2840 | /* Initialize return information */ | |||
2841 | referrers->count = 0; | |||
2842 | referrers->objects = NULL((void*)0); | |||
2843 | ||||
2844 | /* Get jvmti environment to use */ | |||
2845 | jvmti = getSpecialJvmti(); | |||
2846 | if ( jvmti == NULL((void*)0) ) { | |||
2847 | return AGENT_ERROR_INTERNAL((jvmtiError)(JVMTI_ERROR_MAX+64+1)); | |||
2848 | } | |||
2849 | ||||
2850 | /* Fill in the data structure passed around the callbacks */ | |||
2851 | data.refCount = 0; | |||
2852 | data.maxObjects = maxObjects; | |||
2853 | data.objTag = (jlong)1; | |||
2854 | data.refTag = (jlong)2; | |||
2855 | data.selfRef = JNI_FALSE0; | |||
2856 | data.error = JVMTI_ERROR_NONE; | |||
2857 | ||||
2858 | /* Tag the object of interest */ | |||
2859 | error = JVMTI_FUNC_PTR(jvmti,SetTag)(*((*((((gdata->log_flags & (0x00000004))?(log_message_begin ("JVMTI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,2859), log_message_end ("%s()","SetTag")):((void)0)),(jvmti) )))->SetTag)) (jvmti, obj, data.objTag); | |||
2860 | ||||
2861 | /* No need to go any further if we can't tag the object */ | |||
2862 | if ( error == JVMTI_ERROR_NONE ) { | |||
2863 | ||||
2864 | /* Clear out callbacks structure */ | |||
2865 | (void)memset(&heap_callbacks,0,sizeof(heap_callbacks)); | |||
2866 | ||||
2867 | /* Setup callbacks we want */ | |||
2868 | heap_callbacks.heap_reference_callback = &cbObjectTagReferrer; | |||
2869 | ||||
2870 | /* Follow references, no initiating object, all classes, 1 tagged objs */ | |||
2871 | error = JVMTI_FUNC_PTR(jvmti,FollowReferences)(*((*((((gdata->log_flags & (0x00000004))?(log_message_begin ("JVMTI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,2871), log_message_end ("%s()","FollowReferences")):((void)0 )),(jvmti))))->FollowReferences)) | |||
2872 | (jvmti, JVMTI_HEAP_FILTER_UNTAGGED, | |||
2873 | NULL((void*)0), NULL((void*)0), &heap_callbacks, &data); | |||
2874 | ||||
2875 | /* Use data error if needed */ | |||
2876 | if ( error == JVMTI_ERROR_NONE ) { | |||
2877 | error = data.error; | |||
2878 | } | |||
2879 | ||||
2880 | } | |||
2881 | ||||
2882 | /* Watch out for self-reference */ | |||
2883 | if ( error == JVMTI_ERROR_NONE && data.selfRef == JNI_TRUE1 ) { | |||
2884 | /* Tag itself as a referer */ | |||
2885 | error = JVMTI_FUNC_PTR(jvmti,SetTag)(*((*((((gdata->log_flags & (0x00000004))?(log_message_begin ("JVMTI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,2885), log_message_end ("%s()","SetTag")):((void)0)),(jvmti) )))->SetTag)) (jvmti, obj, data.refTag); | |||
2886 | } | |||
2887 | ||||
2888 | /* Get the jobjects for the tagged referrer objects. */ | |||
2889 | if ( error == JVMTI_ERROR_NONE ) { | |||
2890 | error = JVMTI_FUNC_PTR(jvmti,GetObjectsWithTags)(*((*((((gdata->log_flags & (0x00000004))?(log_message_begin ("JVMTI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,2890), log_message_end ("%s()","GetObjectsWithTags")):((void )0)),(jvmti))))->GetObjectsWithTags)) | |||
2891 | (jvmti, 1, &(data.refTag), &(referrers->count), | |||
2892 | &(referrers->objects), NULL((void*)0)); | |||
2893 | /* Verify we got the count we expected */ | |||
2894 | if ( data.refCount != referrers->count ) { | |||
2895 | error = AGENT_ERROR_INTERNAL((jvmtiError)(JVMTI_ERROR_MAX+64+1)); | |||
2896 | } | |||
2897 | } | |||
2898 | ||||
2899 | /* Dispose of any special jvmti environment */ | |||
2900 | (void)JVMTI_FUNC_PTR(jvmti,DisposeEnvironment)(*((*((((gdata->log_flags & (0x00000004))?(log_message_begin ("JVMTI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c" ,2900), log_message_end ("%s()","DisposeEnvironment")):((void )0)),(jvmti))))->DisposeEnvironment))(jvmti); | |||
2901 | return error; | |||
2902 | } |