File: | jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c |
Warning: | line 2685, column 5 Value stored to 'error' is never read |
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 == NULL((void*)0) ) { |
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 == NULL((void*)0) || name[0] == 0 ) { |
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; |
Value stored to 'error' is never read | |
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 | } |