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