Bug Summary

File:jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c
Warning:line 103, column 9
Dereference of null pointer

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -triple x86_64-pc-linux-gnu -analyze -disable-free -disable-llvm-verifier -discard-value-names -main-file-name util.c -analyzer-store=region -analyzer-opt-analyze-nested-blocks -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -mrelocation-model pic -pic-level 2 -mthread-model posix -fno-delete-null-pointer-checks -mframe-pointer=all -relaxed-aliasing -fmath-errno -fno-rounding-math -masm-verbose -mconstructor-aliases -munwind-tables -target-cpu x86-64 -dwarf-column-info -fno-split-dwarf-inlining -debugger-tuning=gdb -resource-dir /usr/lib/llvm-10/lib/clang/10.0.0 -I /home/daniel/Projects/java/jdk/build/linux-x86_64-server-fastdebug/support/modules_include/java.base -I /home/daniel/Projects/java/jdk/build/linux-x86_64-server-fastdebug/support/modules_include/java.base/linux -I /home/daniel/Projects/java/jdk/src/java.base/share/native/libjava -I /home/daniel/Projects/java/jdk/src/java.base/unix/native/libjava -I /home/daniel/Projects/java/jdk/src/hotspot/share/include -I /home/daniel/Projects/java/jdk/src/hotspot/os/posix/include -D LIBC=gnu -D _GNU_SOURCE -D _REENTRANT -D _LARGEFILE64_SOURCE -D LINUX -D DEBUG -D _LITTLE_ENDIAN -D ARCH="amd64" -D amd64 -D _LP64=1 -D JDWP_LOGGING -I /home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/unix/native/libjdwp -I /home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp -I /home/daniel/Projects/java/jdk/build/linux-x86_64-server-fastdebug/support/headers/jdk.jdwp.agent -I /home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/include -I /home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/export -D _FORTIFY_SOURCE=2 -internal-isystem /usr/local/include -internal-isystem /usr/lib/llvm-10/lib/clang/10.0.0/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -O2 -Wno-unused-parameter -Wno-unused -Wno-unused-function -std=c99 -fdebug-compilation-dir /home/daniel/Projects/java/jdk/make -ferror-limit 19 -fmessage-length 0 -fvisibility hidden -stack-protector 1 -fgnuc-version=4.2.1 -fobjc-runtime=gcc -fdiagnostics-show-option -vectorize-loops -vectorize-slp -analyzer-output=html -faddrsig -o /home/daniel/Projects/java/scan/2021-12-21-193737-8510-1 -x c /home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c
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 */
40BackendGlobalData *gdata = NULL((void*)0);
41
42/* Forward declarations */
43static jboolean isInterface(jclass clazz);
44static jboolean isArrayClass(jclass clazz);
45static char * getPropertyUTF8(JNIEnv *env, char *propertyName);
46
47/* Save an object reference for use later (create a NewGlobalRef) */
48void
49saveGlobalRef(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 */
73void
74tossGlobalRef(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
92jclass
93findClass(JNIEnv *env, const char * name)
94{
95 jclass x;
96
97 if ( env == NULL((void*)0) ) {
2
Assuming 'env' is equal to NULL
3
Taking true branch
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"); }
;
4
'?' condition is false
99 }
100 if ( name
4.1
'name' is not equal to NULL
== NULL((void*)0) || name[0] == 0 ) {
5
Taking false branch
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);
6
Assuming the condition is false
7
'?' condition is false
8
Dereference of null pointer
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
115jmethodID
116getMethod(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
146static jmethodID
147getStaticMethod(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
179void
180util_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");
1
Calling 'findClass'
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
292void
293util_reset(void)
294{
295}
296
297jboolean
298isObjectTag(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
308jbyte
309specificTypeKey(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
336static void
337writeFieldValue(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
412static void
413writeStaticFieldValue(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
485void
486sharedGetFieldValues(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
526jboolean
527sharedInvoke(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
625jint
626uniqueID(void)
627{
628 static jint currentID = 0;
629 return currentID++;
630}
631
632int
633filterDebugThreads(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
651jbyte
652referenceTypeTag(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 */
670jvmtiError
671fieldModifiers(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 */
684jvmtiError
685methodModifiers(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. */
696jvmtiError
697methodClass(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. */
708jvmtiError
709methodLocation(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 */
721jvmtiError
722methodSignature(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 */
755jvmtiError
756methodReturnType(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 */
785jvmtiError
786classLoader(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 */
799jvmtiError
800fieldSignature(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
829JNIEnv *
830getEnv(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
845jvmtiError
846spawnNewThread(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
908jvmtiError
909jvmtiGetCapabilities(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
930static jint
931jvmtiVersion(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
944jint
945jvmtiMajorVersion(void)
946{
947 return (jvmtiVersion() & JVMTI_VERSION_MASK_MAJOR)
948 >> JVMTI_VERSION_SHIFT_MAJOR;
949}
950
951jint
952jvmtiMinorVersion(void)
953{
954 return (jvmtiVersion() & JVMTI_VERSION_MASK_MINOR)
955 >> JVMTI_VERSION_SHIFT_MINOR;
956}
957
958jint
959jvmtiMicroVersion(void)
960{
961 return (jvmtiVersion() & JVMTI_VERSION_MASK_MICRO)
962 >> JVMTI_VERSION_SHIFT_MICRO;
963}
964
965jvmtiError
966getSourceDebugExtension(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
973static void
974handleInterrupt(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
997static jvmtiError
998ignore_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
1007void
1008debugMonitorEnter(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
1019void
1020debugMonitorExit(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
1032void
1033debugMonitorWait(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
1077void
1078debugMonitorTimedWait(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
1094void
1095debugMonitorNotify(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
1107void
1108debugMonitorNotifyAll(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
1120jrawMonitorID
1121debugMonitorCreate(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
1134void
1135debugMonitorDestroy(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 */
1150jthread *
1151allThreads(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 */
1173void
1174threadGroupInfo(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 */
1188jvmtiError
1189classSignature(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) */
1210char *
1211getClassname(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
1227void
1228writeGenericSignature(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
1237jint
1238classStatus(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
1251static jboolean
1252isArrayClass(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
1265static jboolean
1266isInterface(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
1279jvmtiError
1280isFieldSynthetic(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
1294jvmtiError
1295isMethodSynthetic(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
1309jboolean
1310isMethodNative(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
1323jboolean
1324isSameObject(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
1332jint
1333objectHashCode(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) */
1349jvmtiError
1350allInterfaces(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) */
1362jvmtiError
1363allLoadedClasses(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) */
1375jvmtiError
1376allClassLoaderClasses(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
1387static jboolean
1388is_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) */
1439jvmtiError
1440allNestedClasses(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
1508void
1509createLocalRefSpace(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
1544jboolean
1545isClass(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
1551jboolean
1552isThread(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
1558jboolean
1559isThreadGroup(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
1565jboolean
1566isString(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
1572jboolean
1573isClassLoader(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
1579jboolean
1580isArray(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 */
1597static jstring
1598getPropertyValue(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 */
1625void
1626setAgentPropertyValue(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 */
1669static char *
1670getPropertyUTF8(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
1704jboolean
1705isMethodObsolete(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 */
1721jvmtiEnv *
1722getSpecialJvmti(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
1745void
1746writeCodeLocation(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
1762void *
1763jvmtiAllocate(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
1778void
1779jvmtiDeallocate(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? */
1793jvmtiError
1794map2jvmtiError(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
1915static jvmtiEvent index2jvmti[EI_max-EI_min+1];
1916static jdwpEvent index2jdwp [EI_max-EI_min+1];
1917
1918void
1919eventIndexInit(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
1967jdwpEvent
1968eventIndex2jdwp(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
1976jvmtiEvent
1977eventIndex2jvmti(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
1987char*
1988eventIndex2EventName(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
2039EventIndex
2040jdwp2EventIndex(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
2096EventIndex
2097jvmti2EventIndex(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 */
2154jdwpError
2155map2jdwpError(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
2295jint
2296map2jdwpSuspendStatus(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
2305jdwpThreadStatus
2306map2jdwpThreadStatus(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
2333jint
2334map2jdwpClassStatus(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
2352void
2353log_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) */
2439typedef 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). */
2447static jint JNICALL
2448cbObjectTagInstance(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 */
2478jvmtiError
2479classInstances(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) */
2550typedef 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) */
2562static jint JNICALL
2563cbObjectCounterFromRef(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) */
2623static jint JNICALL
2624cbObjectCounter(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 */
2655jvmtiError
2656classInstanceCounts(jint classCount, jclass *classes, jlong *counts)
2657{
2658 jvmtiHeapCallbacks heap_callbacks;
2659 ClassCountData data;
2660 jvmtiError error;
2661 jvmtiEnv *jvmti;
2662 int i;
2663
2664 /* Check interface assumptions */
2665 if ( classes == NULL((void*)0) || classCount <= 0 || counts == NULL((void*)0) ) {
2666 return AGENT_ERROR_ILLEGAL_ARGUMENT((jvmtiError)(JVMTI_ERROR_MAX+64+22));
2667 }
2668
2669 /* Initialize return information */
2670 for ( i = 0 ; i < classCount ; i++ ) {
2671 counts[i] = (jlong)0;
2672 }
2673
2674 /* Get jvmti environment to use */
2675 jvmti = getSpecialJvmti();
2676 if ( jvmti == NULL((void*)0) ) {
2677 return AGENT_ERROR_INTERNAL((jvmtiError)(JVMTI_ERROR_MAX+64+1));
2678 }
2679
2680 /* Setup class data structure */
2681 data.error = JVMTI_ERROR_NONE;
2682 data.classCount = classCount;
2683 data.counts = counts;
2684
2685 error = JVMTI_ERROR_NONE;
2686 /* Set tags on classes, use index in classes[] as the tag value. */
2687 error = JVMTI_ERROR_NONE;
2688 for ( i = 0 ; i < classCount ; i++ ) {
2689 if (classes[i] != NULL((void*)0)) {
2690 jlong tag;
2691
2692 tag = INDEX2CLASSTAG(i)((jlong)((i)+1));
2693 error = JVMTI_FUNC_PTR(jvmti,SetTag)(*((*((((gdata->log_flags & (0x00000004))?(log_message_begin
("JVMTI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c"
,2693), log_message_end ("%s()","SetTag")):((void)0)),(jvmti)
)))->SetTag))
(jvmti, classes[i], tag);
2694 if ( error != JVMTI_ERROR_NONE ) {
2695 break;
2696 }
2697 }
2698 }
2699
2700 /* Traverse heap, two ways to do this for instance counts. */
2701 if ( error == JVMTI_ERROR_NONE ) {
2702
2703 /* Clear out callbacks structure */
2704 (void)memset(&heap_callbacks,0,sizeof(heap_callbacks));
2705
2706 /* Check debug flags to see how to do this. */
2707 if ( (gdata->debugflags & USE_ITERATE_THROUGH_HEAP0X001) == 0 ) {
2708
2709 /* Using FollowReferences only gives us live objects, but we
2710 * need to tag the objects to avoid counting them twice since
2711 * the callback is per reference.
2712 * The jclass objects have been tagged with their index in the
2713 * supplied list, and that tag may flip to negative if it
2714 * is also an object of interest.
2715 * All other objects being counted that weren't in the
2716 * supplied classes list will have a negative classCount
2717 * tag value. So all objects counted will have negative tags.
2718 * If the absolute tag value is an index in the supplied
2719 * list, then it's one of the supplied classes.
2720 */
2721 data.negObjTag = -INDEX2CLASSTAG(classCount)((jlong)((classCount)+1));
2722
2723 /* Setup callbacks, only using object reference callback */
2724 heap_callbacks.heap_reference_callback = &cbObjectCounterFromRef;
2725
2726 /* Follow references, no initiating object, tagged classes only */
2727 error = JVMTI_FUNC_PTR(jvmti,FollowReferences)(*((*((((gdata->log_flags & (0x00000004))?(log_message_begin
("JVMTI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c"
,2727), log_message_end ("%s()","FollowReferences")):((void)0
)),(jvmti))))->FollowReferences))
2728 (jvmti, JVMTI_HEAP_FILTER_CLASS_UNTAGGED,
2729 NULL((void*)0), NULL((void*)0), &heap_callbacks, &data);
2730
2731 } else {
2732
2733 /* Using IterateThroughHeap means that we will visit each object
2734 * once, so no special tag tricks here. Just simple counting.
2735 * However in this case the object might not be live, so we do
2736 * a GC beforehand to make sure we minimize this.
2737 */
2738
2739 /* FIXUP: Need some kind of trigger here to avoid excessive GC's? */
2740 error = JVMTI_FUNC_PTR(jvmti,ForceGarbageCollection)(*((*((((gdata->log_flags & (0x00000004))?(log_message_begin
("JVMTI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c"
,2740), log_message_end ("%s()","ForceGarbageCollection")):((
void)0)),(jvmti))))->ForceGarbageCollection))
(jvmti);
2741 if ( error != JVMTI_ERROR_NONE ) {
2742
2743 /* Setup callbacks, just need object callback */
2744 heap_callbacks.heap_iteration_callback = &cbObjectCounter;
2745
2746 /* Iterate through entire heap, tagged classes only */
2747 error = JVMTI_FUNC_PTR(jvmti,IterateThroughHeap)(*((*((((gdata->log_flags & (0x00000004))?(log_message_begin
("JVMTI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c"
,2747), log_message_end ("%s()","IterateThroughHeap")):((void
)0)),(jvmti))))->IterateThroughHeap))
2748 (jvmti, JVMTI_HEAP_FILTER_CLASS_UNTAGGED,
2749 NULL((void*)0), &heap_callbacks, &data);
2750
2751 }
2752 }
2753
2754 /* Use data error if needed */
2755 if ( error == JVMTI_ERROR_NONE ) {
2756 error = data.error;
2757 }
2758
2759 }
2760
2761 /* Dispose of any special jvmti environment */
2762 (void)JVMTI_FUNC_PTR(jvmti,DisposeEnvironment)(*((*((((gdata->log_flags & (0x00000004))?(log_message_begin
("JVMTI","/home/daniel/Projects/java/jdk/src/jdk.jdwp.agent/share/native/libjdwp/util.c"
,2762), log_message_end ("%s()","DisposeEnvironment")):((void
)0)),(jvmti))))->DisposeEnvironment))
(jvmti);
2763 return error;
2764}
2765
2766/* ********************************************************************* */
2767/* Referrers */
2768
2769/* Structure to hold object referrer heap traversal data (arg user_data) */
2770typedef 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). */
2780static jint JNICALL
2781cbObjectTagReferrer(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 */
2824jvmtiError
2825objectReferrers(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}