52 jobject o, jint ind, jbyteArray byteCode) { |
52 jobject o, jint ind, jbyteArray byteCode) { |
53 |
53 |
54 jbyte* elements; |
54 jbyte* elements; |
55 jboolean isCopy; |
55 jboolean isCopy; |
56 |
56 |
57 if (!NSK_JNI_VERIFY(jni_env, (newClassSize[ind] = |
57 if (!NSK_JNI_VERIFY(jni_env, (newClassSize[ind] = jni_env->GetArrayLength(byteCode)) > 0)) { |
58 NSK_CPP_STUB2(GetArrayLength, jni_env, byteCode)) > 0)) { |
|
59 nsk_jvmti_setFailStatus(); |
58 nsk_jvmti_setFailStatus(); |
60 return NSK_FALSE; |
59 return NSK_FALSE; |
61 } |
60 } |
62 NSK_DISPLAY1("\t... got array size: %d\n", newClassSize[ind]); |
61 NSK_DISPLAY1("\t... got array size: %d\n", newClassSize[ind]); |
63 |
62 |
64 if (!NSK_JNI_VERIFY(jni_env, (elements = |
63 if (!NSK_JNI_VERIFY(jni_env, (elements = |
65 NSK_CPP_STUB3(GetByteArrayElements, jni_env, byteCode, |
64 jni_env->GetByteArrayElements(byteCode, &isCopy)) != NULL)) { |
66 &isCopy)) != NULL)) { |
|
67 nsk_jvmti_setFailStatus(); |
65 nsk_jvmti_setFailStatus(); |
68 return NSK_FALSE; |
66 return NSK_FALSE; |
69 } |
67 } |
70 NSK_DISPLAY1("\t... got elements list: 0x%p\n", (void*)elements); |
68 NSK_DISPLAY1("\t... got elements list: 0x%p\n", (void*)elements); |
71 |
69 |
72 if (!NSK_JVMTI_VERIFY(NSK_CPP_STUB3(Allocate, jvmti, |
70 if (!NSK_JVMTI_VERIFY(jvmti->Allocate(newClassSize[ind], &newClassBytes[ind]))) { |
73 newClassSize[ind], &newClassBytes[ind]))) { |
|
74 nsk_jvmti_setFailStatus(); |
71 nsk_jvmti_setFailStatus(); |
75 return NSK_FALSE; |
72 return NSK_FALSE; |
76 } |
73 } |
77 NSK_DISPLAY1("\t... created bytes array: 0x%p\n", (void*)newClassBytes[ind]); |
74 NSK_DISPLAY1("\t... created bytes array: 0x%p\n", (void*)newClassBytes[ind]); |
78 |
75 |
82 newClassBytes[ind][j] = (unsigned char)elements[j]; |
79 newClassBytes[ind][j] = (unsigned char)elements[j]; |
83 } |
80 } |
84 NSK_DISPLAY1("\t... copied bytecode: %d bytes\n", (int)newClassSize[ind]); |
81 NSK_DISPLAY1("\t... copied bytecode: %d bytes\n", (int)newClassSize[ind]); |
85 |
82 |
86 NSK_DISPLAY1("\t... release elements list: 0x%p\n", (void*)elements); |
83 NSK_DISPLAY1("\t... release elements list: 0x%p\n", (void*)elements); |
87 NSK_TRACE(NSK_CPP_STUB4(ReleaseByteArrayElements, jni_env, byteCode, elements, JNI_ABORT)); |
84 NSK_TRACE(jni_env->ReleaseByteArrayElements(byteCode, elements, JNI_ABORT)); |
88 NSK_DISPLAY0("\t... released\n"); |
85 NSK_DISPLAY0("\t... released\n"); |
89 return NSK_TRUE; |
86 return NSK_TRUE; |
90 } |
87 } |
91 |
88 |
92 /* ============================================================================= */ |
89 /* ============================================================================= */ |
98 JNIEXPORT void JNICALL |
95 JNIEXPORT void JNICALL |
99 Java_nsk_jvmti_scenarios_bcinstr_BI01_bi01t002_setClass(JNIEnv *jni_env, |
96 Java_nsk_jvmti_scenarios_bcinstr_BI01_bi01t002_setClass(JNIEnv *jni_env, |
100 jobject o, jint ind, jclass cls) { |
97 jobject o, jint ind, jclass cls) { |
101 |
98 |
102 if (!NSK_JNI_VERIFY(jni_env, (oldClassDef[ind].klass = (jclass) |
99 if (!NSK_JNI_VERIFY(jni_env, (oldClassDef[ind].klass = (jclass) |
103 NSK_CPP_STUB2(NewGlobalRef, jni_env, cls)) != NULL)) { |
100 jni_env->NewGlobalRef(cls)) != NULL)) { |
104 nsk_jvmti_setFailStatus(); |
101 nsk_jvmti_setFailStatus(); |
105 } |
102 } |
106 } |
103 } |
107 |
104 |
108 /* ============================================================================= */ |
105 /* ============================================================================= */ |
129 /*store original byte code, it will be used to do final redefinition*/ |
126 /*store original byte code, it will be used to do final redefinition*/ |
130 int j; |
127 int j; |
131 unsigned char *arr; |
128 unsigned char *arr; |
132 |
129 |
133 oldClassDef[clsLoadedIdx].class_byte_count = class_data_len; |
130 oldClassDef[clsLoadedIdx].class_byte_count = class_data_len; |
134 if (!NSK_JVMTI_VERIFY( |
131 if (!NSK_JVMTI_VERIFY(jvmti_env->Allocate(class_data_len, &arr))) { |
135 NSK_CPP_STUB3(Allocate, jvmti_env, class_data_len, |
|
136 &arr))) { |
|
137 nsk_jvmti_setFailStatus(); |
132 nsk_jvmti_setFailStatus(); |
138 return; |
133 return; |
139 } |
134 } |
140 for (j = 0; j < class_data_len; j++) { |
135 for (j = 0; j < class_data_len; j++) { |
141 arr[j] = class_data[j]; |
136 arr[j] = class_data[j]; |
187 NSK_DISPLAY0("Wait for debuggee to check instrumentation code works nsk_jvmti_waitForSync#3\n"); |
182 NSK_DISPLAY0("Wait for debuggee to check instrumentation code works nsk_jvmti_waitForSync#3\n"); |
188 if (!nsk_jvmti_waitForSync(timeout)) |
183 if (!nsk_jvmti_waitForSync(timeout)) |
189 return; |
184 return; |
190 |
185 |
191 NSK_DISPLAY0("Notification disabled for CLASS_FILE_LOAD_HOOK event\n"); |
186 NSK_DISPLAY0("Notification disabled for CLASS_FILE_LOAD_HOOK event\n"); |
192 if (!NSK_JVMTI_VERIFY( |
187 if (!NSK_JVMTI_VERIFY(jvmti->SetEventNotificationMode(JVMTI_DISABLE, |
193 NSK_CPP_STUB4(SetEventNotificationMode, jvmti, JVMTI_DISABLE, |
188 JVMTI_EVENT_CLASS_FILE_LOAD_HOOK, |
194 JVMTI_EVENT_CLASS_FILE_LOAD_HOOK, NULL))) { |
189 NULL))) { |
195 nsk_jvmti_setFailStatus(); |
190 nsk_jvmti_setFailStatus(); |
196 return; |
191 return; |
197 } |
192 } |
198 |
193 |
199 if (!nsk_jvmti_resumeSync()) |
194 if (!nsk_jvmti_resumeSync()) |
214 if (nsk_getVerboseMode()) { |
209 if (nsk_getVerboseMode()) { |
215 nsk_printHexBytes(" ", 16, oldClassDef[i].class_byte_count, |
210 nsk_printHexBytes(" ", 16, oldClassDef[i].class_byte_count, |
216 oldClassDef[i].class_bytes); |
211 oldClassDef[i].class_bytes); |
217 } |
212 } |
218 } |
213 } |
219 if (!NSK_JVMTI_VERIFY( |
214 if (!NSK_JVMTI_VERIFY(jvmti->RedefineClasses(TOTAL_INSTRUMENTED_CLASSES, oldClassDef))) { |
220 NSK_CPP_STUB3(RedefineClasses, jvmti, TOTAL_INSTRUMENTED_CLASSES, |
|
221 oldClassDef))) { |
|
222 nsk_jvmti_setFailStatus(); |
215 nsk_jvmti_setFailStatus(); |
223 return; |
216 return; |
224 } |
217 } |
225 |
218 |
226 if (!nsk_jvmti_resumeSync()) |
219 if (!nsk_jvmti_resumeSync()) |
230 NSK_DISPLAY0("Wait for debuggee to check old byte code works nsk_jvmti_waitForSync#5\n"); |
223 NSK_DISPLAY0("Wait for debuggee to check old byte code works nsk_jvmti_waitForSync#5\n"); |
231 if (!nsk_jvmti_waitForSync(timeout)) |
224 if (!nsk_jvmti_waitForSync(timeout)) |
232 return; |
225 return; |
233 |
226 |
234 for (i = 0; i < TOTAL_INSTRUMENTED_CLASSES; i++) { |
227 for (i = 0; i < TOTAL_INSTRUMENTED_CLASSES; i++) { |
235 NSK_CPP_STUB2(DeleteGlobalRef, agentJNI, oldClassDef[i].klass); |
228 agentJNI->DeleteGlobalRef(oldClassDef[i].klass); |
236 } |
229 } |
237 |
230 |
238 NSK_DISPLAY0("Let debuggee to finish\n"); |
231 NSK_DISPLAY0("Let debuggee to finish\n"); |
239 if (!nsk_jvmti_resumeSync()) |
232 if (!nsk_jvmti_resumeSync()) |
240 return; |
233 return; |
268 { |
261 { |
269 jvmtiCapabilities caps; |
262 jvmtiCapabilities caps; |
270 memset(&caps, 0, sizeof(caps)); |
263 memset(&caps, 0, sizeof(caps)); |
271 |
264 |
272 caps.can_redefine_classes = 1; |
265 caps.can_redefine_classes = 1; |
273 if (!NSK_JVMTI_VERIFY(NSK_CPP_STUB2(AddCapabilities, jvmti, &caps))) |
266 if (!NSK_JVMTI_VERIFY(jvmti->AddCapabilities(&caps))) |
274 return JNI_ERR; |
267 return JNI_ERR; |
275 } |
268 } |
276 |
269 |
277 NSK_DISPLAY0("Set callback for CLASS_FILE_LOAD_HOOK event\n"); |
270 NSK_DISPLAY0("Set callback for CLASS_FILE_LOAD_HOOK event\n"); |
278 { |
271 { |
279 jvmtiEventCallbacks callbacks; |
272 jvmtiEventCallbacks callbacks; |
280 jint size = (jint)sizeof(callbacks); |
273 jint size = (jint)sizeof(callbacks); |
281 |
274 |
282 memset(&callbacks, 0, size); |
275 memset(&callbacks, 0, size); |
283 callbacks.ClassFileLoadHook = cbClassFileLoadHook; |
276 callbacks.ClassFileLoadHook = cbClassFileLoadHook; |
284 if (!NSK_JVMTI_VERIFY( |
277 if (!NSK_JVMTI_VERIFY(jvmti->SetEventCallbacks(&callbacks, size))) { |
285 NSK_CPP_STUB3(SetEventCallbacks, jvmti, &callbacks, size))) { |
|
286 return JNI_ERR; |
278 return JNI_ERR; |
287 } |
279 } |
288 } |
280 } |
289 |
281 |
290 NSK_DISPLAY0("Set notification enabled for CLASS_FILE_LOAD_HOOK event\n"); |
282 NSK_DISPLAY0("Set notification enabled for CLASS_FILE_LOAD_HOOK event\n"); |
291 if (!NSK_JVMTI_VERIFY( |
283 if (!NSK_JVMTI_VERIFY(jvmti->SetEventNotificationMode(JVMTI_ENABLE, |
292 NSK_CPP_STUB4(SetEventNotificationMode, jvmti, JVMTI_ENABLE, |
284 JVMTI_EVENT_CLASS_FILE_LOAD_HOOK, |
293 JVMTI_EVENT_CLASS_FILE_LOAD_HOOK, NULL))) { |
285 NULL))) { |
294 nsk_jvmti_setFailStatus(); |
286 nsk_jvmti_setFailStatus(); |
295 return NSK_FALSE; |
287 return NSK_FALSE; |
296 } |
288 } |
297 |
289 |
298 if (!NSK_VERIFY(nsk_jvmti_setAgentProc(agentProc, NULL))) |
290 if (!NSK_VERIFY(nsk_jvmti_setAgentProc(agentProc, NULL))) |