115 } else {
116 NSK_DISPLAY1("All %s bytecode is equal to expected one\n", kind);
117 }
118 }
119
120 return success;
121 }
122
123 /** Get classfile bytecode from a static field of given class. */
124 static int getBytecode(jvmtiEnv* jvmti, JNIEnv* jni, jclass cls,
125 const char fieldName[], const char fieldSig[],
126 jint* size, unsigned char* *bytes) {
127
128 jfieldID fieldID = NULL;
129 jbyteArray array = NULL;
130 jbyte* elements;
131 int i;
132
133 NSK_DISPLAY1("Find static field: %s\n", fieldName);
134 if (!NSK_JNI_VERIFY(jni, (fieldID =
135 NSK_CPP_STUB4(GetStaticFieldID, jni, cls, fieldName, fieldSig)) != NULL)) {
136 nsk_jvmti_setFailStatus();
137 return NSK_FALSE;
138 }
139 NSK_DISPLAY1(" ... got fieldID: 0x%p\n", (void*)fieldID);
140
141 NSK_DISPLAY1("Get classfile bytes array from static field: %s\n", fieldName);
142 if (!NSK_JNI_VERIFY(jni, (array = (jbyteArray)
143 NSK_CPP_STUB3(GetStaticObjectField, jni, cls, fieldID)) != NULL)) {
144 nsk_jvmti_setFailStatus();
145 return NSK_FALSE;
146 }
147 NSK_DISPLAY1(" ... got array object: 0x%p\n", (void*)array);
148
149 if (!NSK_JNI_VERIFY(jni, (*size =
150 NSK_CPP_STUB2(GetArrayLength, jni, array)) > 0)) {
151 nsk_jvmti_setFailStatus();
152 return NSK_FALSE;
153 }
154 NSK_DISPLAY1(" ... got array size: %d bytes\n", (int)*size);
155
156 {
157 jboolean isCopy;
158 if (!NSK_JNI_VERIFY(jni, (elements =
159 NSK_CPP_STUB3(GetByteArrayElements, jni, array,
160 &isCopy)) != NULL)) {
161 nsk_jvmti_setFailStatus();
162 return NSK_FALSE;
163 }
164 }
165 NSK_DISPLAY1(" ... got elements list: 0x%p\n", (void*)elements);
166
167 if (!NSK_JVMTI_VERIFY(
168 NSK_CPP_STUB3(Allocate, jvmti, *size, bytes))) {
169 nsk_jvmti_setFailStatus();
170 return NSK_FALSE;
171 }
172 NSK_DISPLAY1(" ... created bytes array: 0x%p\n", (void*)*bytes);
173
174 for (i = 0; i < *size; i++) {
175 (*bytes)[i] = (unsigned char)elements[i];
176 }
177 NSK_DISPLAY1(" ... copied bytecode: %d bytes\n", (int)*size);
178
179 NSK_DISPLAY1("Release elements list: 0x%p\n", (void*)elements);
180 NSK_TRACE(NSK_CPP_STUB4(ReleaseByteArrayElements, jni, array, elements, JNI_ABORT));
181 NSK_DISPLAY0(" ... released\n");
182
183 return NSK_TRUE;
184 }
185
186 /** Get global reference to object from a static field of given class. */
187 static jobject getObject(jvmtiEnv* jvmti, JNIEnv* jni, jclass cls,
188 const char fieldName[], const char fieldSig[]) {
189
190 jfieldID fieldID = NULL;
191 jobject obj = NULL;
192
193 NSK_DISPLAY1("Find static field: %s\n", fieldName);
194 if (!NSK_JNI_VERIFY(jni, (fieldID =
195 NSK_CPP_STUB4(GetStaticFieldID, jni, cls, fieldName, fieldSig)) != NULL)) {
196 nsk_jvmti_setFailStatus();
197 return NULL;
198 }
199 NSK_DISPLAY1(" ... got fieldID: 0x%p\n", (void*)fieldID);
200
201 NSK_DISPLAY1("Get object from static field: %s\n", fieldName);
202 if (!NSK_JNI_VERIFY(jni, (obj =
203 NSK_CPP_STUB3(GetStaticObjectField, jni, cls, fieldID)) != NULL)) {
204 nsk_jvmti_setFailStatus();
205 return NULL;
206 }
207 NSK_DISPLAY1(" ... got object: 0x%p\n", (void*)obj);
208
209 NSK_DISPLAY1("Make global reference to object: 0x%p\n", obj);
210 if (!NSK_JNI_VERIFY(jni, (obj =
211 NSK_CPP_STUB2(NewGlobalRef, jni, obj)) != NULL)) {
212 nsk_jvmti_setFailStatus();
213 return NULL;
214 }
215 NSK_DISPLAY1(" ... got global ref: 0x%p\n", (void*)obj);
216
217 return obj;
218 }
219
220 /** Redefine given class with new bytecode. */
221 static int redefineClass(jvmtiEnv* jvmti, jclass klass, const char className[],
222 jint size, unsigned char bytes[]) {
223 jvmtiClassDefinition classDef;
224
225 classDef.klass = klass;
226 classDef.class_byte_count = size;
227 classDef.class_bytes = bytes;
228
229 NSK_DISPLAY1("Redefine class: %s\n", className);
230 if (!NSK_JVMTI_VERIFY(
231 NSK_CPP_STUB3(RedefineClasses, jvmti, 1, &classDef))) {
232 nsk_jvmti_setFailStatus();
233 return NSK_FALSE;
234 }
235 NSK_DISPLAY1(" ... redefined with bytecode: %d bytes\n", (int)size);
236
237 return NSK_TRUE;
238 }
239
240 /* ============================================================================= */
241
242 /** Agent algorithm. */
243 static void JNICALL
244 agentProc(jvmtiEnv* jvmti, JNIEnv* jni, void* arg) {
245 NSK_DISPLAY0("Wait for debuggee to load original class\n");
246 if (!NSK_VERIFY(nsk_jvmti_waitForSync(timeout)))
247 return;
248
249 /* perform testing */
250 {
251 {
252 jclass debugeeClass = NULL;
253
254 NSK_DISPLAY0(">>> Obtain debuggee class\n");
255 NSK_DISPLAY1("Find debugee class: %s\n", DEBUGEE_CLASS_NAME);
256 if (!NSK_JNI_VERIFY(jni, (debugeeClass =
257 NSK_CPP_STUB2(FindClass, jni, DEBUGEE_CLASS_NAME)) != NULL)) {
258 nsk_jvmti_setFailStatus();
259 return;
260 }
261 NSK_DISPLAY1(" ... found class: 0x%p\n", (void*)debugeeClass);
262
263 NSK_DISPLAY0(">>> Obtain tested class object\n");
264 if (!NSK_VERIFY((testedClass = (jclass)
265 getObject(jvmti, jni, debugeeClass, TESTED_CLASS_FIELD_NAME,
266 TESTED_CLASS_FIELD_SIG)) != NULL))
267 return;
268
269 NSK_DISPLAY0(">>> Obtain classloader object\n");
270 if (!NSK_VERIFY((classLoader =
271 getObject(jvmti, jni, debugeeClass, CLASSLOADER_FIELD_NAME,
272 TESTED_CLASSLOADER_SIG)) != NULL))
273 return;
274
275 NSK_DISPLAY0(">>> Obtain redefined bytecode of tested class\n");
276 if (!NSK_VERIFY(getBytecode(jvmti, jni, debugeeClass,
277 REDEF_BYTECODE_FIELD_NAME,
302 NSK_DISPLAY1("Disable event: %s\n", "CLASS_FILE_LOAD_HOOK");
303 if (NSK_VERIFY(nsk_jvmti_enableEvents(JVMTI_DISABLE, 1, &event, NULL))) {
304 NSK_DISPLAY0(" ... event disabled\n");
305 }
306
307 NSK_DISPLAY1("Check if event was received: %s\n", "CLASS_FILE_LOAD_HOOK");
308 if (eventsCount != 1) {
309 NSK_COMPLAIN3("Unexpected number of %s events received for tested class:\n"
310 "# received: %d events\n"
311 "# expected: %d events\n",
312 "CLASS_FILE_LOAD_HOOK", eventsCount, 1);
313 nsk_jvmti_setFailStatus();
314 } else {
315 NSK_DISPLAY1(" ... received: %d events\n", eventsCount);
316 }
317 }
318
319 NSK_DISPLAY0(">>> Clean used data\n");
320 {
321 NSK_DISPLAY1("Delete global reference to classloader object: 0x%p\n", (void*)classLoader);
322 NSK_CPP_STUB2(DeleteGlobalRef, jni, classLoader);
323
324 NSK_DISPLAY1("Delete global reference to tested class object: 0x%p\n", (void*)testedClass);
325 NSK_CPP_STUB2(DeleteGlobalRef, jni, testedClass);
326
327 NSK_DISPLAY1("Deallocate redefined bytecode array: 0x%p\n", (void*)redefClassBytes);
328 if (!NSK_JVMTI_VERIFY(
329 NSK_CPP_STUB2(Deallocate, jvmti, redefClassBytes))) {
330 nsk_jvmti_setFailStatus();
331 }
332 }
333 }
334
335 NSK_DISPLAY0("Let debugee to finish\n");
336 if (!NSK_VERIFY(nsk_jvmti_resumeSync()))
337 return;
338 }
339
340 /* ============================================================================= */
341
342 /** Callback for CLASS_FILE_LOAD_HOOK event **/
343 static void JNICALL
344 callbackClassFileLoadHook(jvmtiEnv *jvmti, JNIEnv *jni,
345 jclass class_being_redefined,
346 jobject loader, const char* name, jobject protection_domain,
347 jint class_data_len, const unsigned char* class_data,
348 jint *new_class_data_len, unsigned char** new_class_data) {
349
350 NSK_DISPLAY5(" <CLASS_FILE_LOAD_HOOK>: name: %s, loader: 0x%p, redefined: 0x%p, bytecode: 0x%p:%d\n",
351 nsk_null_string(name), (void*)loader, (void*)class_being_redefined,
352 (void*)class_data, (int)class_data_len);
353
354 if (name != NULL && (strcmp(name, TESTED_CLASS_NAME) == 0)) {
355 NSK_DISPLAY1("SUCCESS! CLASS_FILE_LOAD_HOOK for tested class: %s\n", TESTED_CLASS_NAME);
356 eventsCount++;
357
358 NSK_DISPLAY1("Check classloader: 0x%p\n", (void*)loader);
359 if (loader == NULL) {
360 NSK_COMPLAIN1("Unexpected NULL classloader in CLASS_FILE_LOAD_HOOK: 0x%p\n",
361 (void*)loader);
362 nsk_jvmti_setFailStatus();
363 } else if (!NSK_CPP_STUB3(IsSameObject, jni, loader, classLoader)) {
364 NSK_COMPLAIN2("Unexpected classloader in CLASS_FILE_LOAD_HOOK:\n"
365 "# got classloder: 0x%p\n"
366 "# expected same as: 0x%p\n",
367 (void*)loader, (void*)classLoader);
368 nsk_jvmti_setFailStatus();
369 }
370
371 NSK_DISPLAY1("Check class_being_redefined: 0x%p\n", (void*)class_being_redefined);
372 if (class_being_redefined == NULL) {
373 NSK_COMPLAIN1("Unexpected NULL class_being_redefined in CLASS_FILE_LOAD_HOOK: 0x%p\n",
374 (void*)class_being_redefined);
375 nsk_jvmti_setFailStatus();
376 } else if (!NSK_CPP_STUB3(IsSameObject, jni, class_being_redefined, testedClass)) {
377 NSK_COMPLAIN2("Unexpected class_being_redefined in CLASS_FILE_LOAD_HOOK:\n"
378 "# got class: 0x%p\n"
379 "# expected same as: 0x%p\n",
380 (void*)class_being_redefined, (void*)testedClass);
381 nsk_jvmti_setFailStatus();
382 }
383
384 if (!checkBytecode("redefined", class_data_len, class_data,
385 redefClassSize, redefClassBytes, NSK_TRUE)) {
386 nsk_jvmti_setFailStatus();
387 }
388 }
389 }
390
391 /* ============================================================================= */
392
393 /** Agent library initialization. */
394 #ifdef STATIC_BUILD
395 JNIEXPORT jint JNICALL Agent_OnLoad_classfloadhk007(JavaVM *jvm, char *options, void *reserved) {
396 return Agent_Initialize(jvm, options, reserved);
406 jvmtiEnv* jvmti = NULL;
407
408 /* init framework and parse options */
409 if (!NSK_VERIFY(nsk_jvmti_parseOptions(options)))
410 return JNI_ERR;
411
412 timeout = nsk_jvmti_getWaitTime() * 60 * 1000;
413
414 /* create JVMTI environment */
415 if (!NSK_VERIFY((jvmti =
416 nsk_jvmti_createJVMTIEnv(jvm, reserved)) != NULL))
417 return JNI_ERR;
418
419 NSK_DISPLAY1("Add required capabilities: %s\n", "can_generate_eraly_class_hook_events, can_redefine_classes");
420 {
421 jvmtiCapabilities caps;
422
423 memset(&caps, 0, sizeof(caps));
424 caps.can_generate_all_class_hook_events = 1;
425 caps.can_redefine_classes = 1;
426 if (!NSK_JVMTI_VERIFY(
427 NSK_CPP_STUB2(AddCapabilities, jvmti, &caps))) {
428 return JNI_ERR;
429 }
430 }
431 NSK_DISPLAY0(" ... added\n");
432
433 NSK_DISPLAY1("Set callback for event: %s\n", "CLASS_FILE_LOAD_HOOK");
434 {
435 jvmtiEventCallbacks callbacks;
436 jint size = (jint)sizeof(callbacks);
437
438 memset(&callbacks, 0, sizeof(callbacks));
439 callbacks.ClassFileLoadHook = callbackClassFileLoadHook;
440 if (!NSK_JVMTI_VERIFY(
441 NSK_CPP_STUB3(SetEventCallbacks, jvmti, &callbacks, size))) {
442 return JNI_ERR;
443 }
444 }
445 NSK_DISPLAY0(" ... set\n");
446
447 /* register agent proc and arg */
448 if (!NSK_VERIFY(nsk_jvmti_setAgentProc(agentProc, NULL)))
449 return JNI_ERR;
450
451 return JNI_OK;
452 }
453
454 /* ============================================================================= */
455
456 }
|
115 } else {
116 NSK_DISPLAY1("All %s bytecode is equal to expected one\n", kind);
117 }
118 }
119
120 return success;
121 }
122
123 /** Get classfile bytecode from a static field of given class. */
124 static int getBytecode(jvmtiEnv* jvmti, JNIEnv* jni, jclass cls,
125 const char fieldName[], const char fieldSig[],
126 jint* size, unsigned char* *bytes) {
127
128 jfieldID fieldID = NULL;
129 jbyteArray array = NULL;
130 jbyte* elements;
131 int i;
132
133 NSK_DISPLAY1("Find static field: %s\n", fieldName);
134 if (!NSK_JNI_VERIFY(jni, (fieldID =
135 jni->GetStaticFieldID(cls, fieldName, fieldSig)) != NULL)) {
136 nsk_jvmti_setFailStatus();
137 return NSK_FALSE;
138 }
139 NSK_DISPLAY1(" ... got fieldID: 0x%p\n", (void*)fieldID);
140
141 NSK_DISPLAY1("Get classfile bytes array from static field: %s\n", fieldName);
142 if (!NSK_JNI_VERIFY(jni, (array = (jbyteArray)
143 jni->GetStaticObjectField(cls, fieldID)) != NULL)) {
144 nsk_jvmti_setFailStatus();
145 return NSK_FALSE;
146 }
147 NSK_DISPLAY1(" ... got array object: 0x%p\n", (void*)array);
148
149 if (!NSK_JNI_VERIFY(jni, (*size = jni->GetArrayLength(array)) > 0)) {
150 nsk_jvmti_setFailStatus();
151 return NSK_FALSE;
152 }
153 NSK_DISPLAY1(" ... got array size: %d bytes\n", (int)*size);
154
155 {
156 jboolean isCopy;
157 if (!NSK_JNI_VERIFY(jni, (elements = jni->GetByteArrayElements(array, &isCopy)) != NULL)) {
158 nsk_jvmti_setFailStatus();
159 return NSK_FALSE;
160 }
161 }
162 NSK_DISPLAY1(" ... got elements list: 0x%p\n", (void*)elements);
163
164 if (!NSK_JVMTI_VERIFY(jvmti->Allocate(*size, bytes))) {
165 nsk_jvmti_setFailStatus();
166 return NSK_FALSE;
167 }
168 NSK_DISPLAY1(" ... created bytes array: 0x%p\n", (void*)*bytes);
169
170 for (i = 0; i < *size; i++) {
171 (*bytes)[i] = (unsigned char)elements[i];
172 }
173 NSK_DISPLAY1(" ... copied bytecode: %d bytes\n", (int)*size);
174
175 NSK_DISPLAY1("Release elements list: 0x%p\n", (void*)elements);
176 NSK_TRACE(jni->ReleaseByteArrayElements(array, elements, JNI_ABORT));
177 NSK_DISPLAY0(" ... released\n");
178
179 return NSK_TRUE;
180 }
181
182 /** Get global reference to object from a static field of given class. */
183 static jobject getObject(jvmtiEnv* jvmti, JNIEnv* jni, jclass cls,
184 const char fieldName[], const char fieldSig[]) {
185
186 jfieldID fieldID = NULL;
187 jobject obj = NULL;
188
189 NSK_DISPLAY1("Find static field: %s\n", fieldName);
190 if (!NSK_JNI_VERIFY(jni, (fieldID =
191 jni->GetStaticFieldID(cls, fieldName, fieldSig)) != NULL)) {
192 nsk_jvmti_setFailStatus();
193 return NULL;
194 }
195 NSK_DISPLAY1(" ... got fieldID: 0x%p\n", (void*)fieldID);
196
197 NSK_DISPLAY1("Get object from static field: %s\n", fieldName);
198 if (!NSK_JNI_VERIFY(jni, (obj = jni->GetStaticObjectField(cls, fieldID)) != NULL)) {
199 nsk_jvmti_setFailStatus();
200 return NULL;
201 }
202 NSK_DISPLAY1(" ... got object: 0x%p\n", (void*)obj);
203
204 NSK_DISPLAY1("Make global reference to object: 0x%p\n", obj);
205 if (!NSK_JNI_VERIFY(jni, (obj = jni->NewGlobalRef(obj)) != NULL)) {
206 nsk_jvmti_setFailStatus();
207 return NULL;
208 }
209 NSK_DISPLAY1(" ... got global ref: 0x%p\n", (void*)obj);
210
211 return obj;
212 }
213
214 /** Redefine given class with new bytecode. */
215 static int redefineClass(jvmtiEnv* jvmti, jclass klass, const char className[],
216 jint size, unsigned char bytes[]) {
217 jvmtiClassDefinition classDef;
218
219 classDef.klass = klass;
220 classDef.class_byte_count = size;
221 classDef.class_bytes = bytes;
222
223 NSK_DISPLAY1("Redefine class: %s\n", className);
224 if (!NSK_JVMTI_VERIFY(jvmti->RedefineClasses(1, &classDef))) {
225 nsk_jvmti_setFailStatus();
226 return NSK_FALSE;
227 }
228 NSK_DISPLAY1(" ... redefined with bytecode: %d bytes\n", (int)size);
229
230 return NSK_TRUE;
231 }
232
233 /* ============================================================================= */
234
235 /** Agent algorithm. */
236 static void JNICALL
237 agentProc(jvmtiEnv* jvmti, JNIEnv* jni, void* arg) {
238 NSK_DISPLAY0("Wait for debuggee to load original class\n");
239 if (!NSK_VERIFY(nsk_jvmti_waitForSync(timeout)))
240 return;
241
242 /* perform testing */
243 {
244 {
245 jclass debugeeClass = NULL;
246
247 NSK_DISPLAY0(">>> Obtain debuggee class\n");
248 NSK_DISPLAY1("Find debugee class: %s\n", DEBUGEE_CLASS_NAME);
249 if (!NSK_JNI_VERIFY(jni, (debugeeClass =
250 jni->FindClass(DEBUGEE_CLASS_NAME)) != NULL)) {
251 nsk_jvmti_setFailStatus();
252 return;
253 }
254 NSK_DISPLAY1(" ... found class: 0x%p\n", (void*)debugeeClass);
255
256 NSK_DISPLAY0(">>> Obtain tested class object\n");
257 if (!NSK_VERIFY((testedClass = (jclass)
258 getObject(jvmti, jni, debugeeClass, TESTED_CLASS_FIELD_NAME,
259 TESTED_CLASS_FIELD_SIG)) != NULL))
260 return;
261
262 NSK_DISPLAY0(">>> Obtain classloader object\n");
263 if (!NSK_VERIFY((classLoader =
264 getObject(jvmti, jni, debugeeClass, CLASSLOADER_FIELD_NAME,
265 TESTED_CLASSLOADER_SIG)) != NULL))
266 return;
267
268 NSK_DISPLAY0(">>> Obtain redefined bytecode of tested class\n");
269 if (!NSK_VERIFY(getBytecode(jvmti, jni, debugeeClass,
270 REDEF_BYTECODE_FIELD_NAME,
295 NSK_DISPLAY1("Disable event: %s\n", "CLASS_FILE_LOAD_HOOK");
296 if (NSK_VERIFY(nsk_jvmti_enableEvents(JVMTI_DISABLE, 1, &event, NULL))) {
297 NSK_DISPLAY0(" ... event disabled\n");
298 }
299
300 NSK_DISPLAY1("Check if event was received: %s\n", "CLASS_FILE_LOAD_HOOK");
301 if (eventsCount != 1) {
302 NSK_COMPLAIN3("Unexpected number of %s events received for tested class:\n"
303 "# received: %d events\n"
304 "# expected: %d events\n",
305 "CLASS_FILE_LOAD_HOOK", eventsCount, 1);
306 nsk_jvmti_setFailStatus();
307 } else {
308 NSK_DISPLAY1(" ... received: %d events\n", eventsCount);
309 }
310 }
311
312 NSK_DISPLAY0(">>> Clean used data\n");
313 {
314 NSK_DISPLAY1("Delete global reference to classloader object: 0x%p\n", (void*)classLoader);
315 jni->DeleteGlobalRef(classLoader);
316
317 NSK_DISPLAY1("Delete global reference to tested class object: 0x%p\n", (void*)testedClass);
318 jni->DeleteGlobalRef(testedClass);
319
320 NSK_DISPLAY1("Deallocate redefined bytecode array: 0x%p\n", (void*)redefClassBytes);
321 if (!NSK_JVMTI_VERIFY(jvmti->Deallocate(redefClassBytes))) {
322 nsk_jvmti_setFailStatus();
323 }
324 }
325 }
326
327 NSK_DISPLAY0("Let debugee to finish\n");
328 if (!NSK_VERIFY(nsk_jvmti_resumeSync()))
329 return;
330 }
331
332 /* ============================================================================= */
333
334 /** Callback for CLASS_FILE_LOAD_HOOK event **/
335 static void JNICALL
336 callbackClassFileLoadHook(jvmtiEnv *jvmti, JNIEnv *jni,
337 jclass class_being_redefined,
338 jobject loader, const char* name, jobject protection_domain,
339 jint class_data_len, const unsigned char* class_data,
340 jint *new_class_data_len, unsigned char** new_class_data) {
341
342 NSK_DISPLAY5(" <CLASS_FILE_LOAD_HOOK>: name: %s, loader: 0x%p, redefined: 0x%p, bytecode: 0x%p:%d\n",
343 nsk_null_string(name), (void*)loader, (void*)class_being_redefined,
344 (void*)class_data, (int)class_data_len);
345
346 if (name != NULL && (strcmp(name, TESTED_CLASS_NAME) == 0)) {
347 NSK_DISPLAY1("SUCCESS! CLASS_FILE_LOAD_HOOK for tested class: %s\n", TESTED_CLASS_NAME);
348 eventsCount++;
349
350 NSK_DISPLAY1("Check classloader: 0x%p\n", (void*)loader);
351 if (loader == NULL) {
352 NSK_COMPLAIN1("Unexpected NULL classloader in CLASS_FILE_LOAD_HOOK: 0x%p\n",
353 (void*)loader);
354 nsk_jvmti_setFailStatus();
355 } else if (!jni->IsSameObject(loader, classLoader)) {
356 NSK_COMPLAIN2("Unexpected classloader in CLASS_FILE_LOAD_HOOK:\n"
357 "# got classloder: 0x%p\n"
358 "# expected same as: 0x%p\n",
359 (void*)loader, (void*)classLoader);
360 nsk_jvmti_setFailStatus();
361 }
362
363 NSK_DISPLAY1("Check class_being_redefined: 0x%p\n", (void*)class_being_redefined);
364 if (class_being_redefined == NULL) {
365 NSK_COMPLAIN1("Unexpected NULL class_being_redefined in CLASS_FILE_LOAD_HOOK: 0x%p\n",
366 (void*)class_being_redefined);
367 nsk_jvmti_setFailStatus();
368 } else if (!jni->IsSameObject(class_being_redefined, testedClass)) {
369 NSK_COMPLAIN2("Unexpected class_being_redefined in CLASS_FILE_LOAD_HOOK:\n"
370 "# got class: 0x%p\n"
371 "# expected same as: 0x%p\n",
372 (void*)class_being_redefined, (void*)testedClass);
373 nsk_jvmti_setFailStatus();
374 }
375
376 if (!checkBytecode("redefined", class_data_len, class_data,
377 redefClassSize, redefClassBytes, NSK_TRUE)) {
378 nsk_jvmti_setFailStatus();
379 }
380 }
381 }
382
383 /* ============================================================================= */
384
385 /** Agent library initialization. */
386 #ifdef STATIC_BUILD
387 JNIEXPORT jint JNICALL Agent_OnLoad_classfloadhk007(JavaVM *jvm, char *options, void *reserved) {
388 return Agent_Initialize(jvm, options, reserved);
398 jvmtiEnv* jvmti = NULL;
399
400 /* init framework and parse options */
401 if (!NSK_VERIFY(nsk_jvmti_parseOptions(options)))
402 return JNI_ERR;
403
404 timeout = nsk_jvmti_getWaitTime() * 60 * 1000;
405
406 /* create JVMTI environment */
407 if (!NSK_VERIFY((jvmti =
408 nsk_jvmti_createJVMTIEnv(jvm, reserved)) != NULL))
409 return JNI_ERR;
410
411 NSK_DISPLAY1("Add required capabilities: %s\n", "can_generate_eraly_class_hook_events, can_redefine_classes");
412 {
413 jvmtiCapabilities caps;
414
415 memset(&caps, 0, sizeof(caps));
416 caps.can_generate_all_class_hook_events = 1;
417 caps.can_redefine_classes = 1;
418 if (!NSK_JVMTI_VERIFY(jvmti->AddCapabilities(&caps))) {
419 return JNI_ERR;
420 }
421 }
422 NSK_DISPLAY0(" ... added\n");
423
424 NSK_DISPLAY1("Set callback for event: %s\n", "CLASS_FILE_LOAD_HOOK");
425 {
426 jvmtiEventCallbacks callbacks;
427 jint size = (jint)sizeof(callbacks);
428
429 memset(&callbacks, 0, sizeof(callbacks));
430 callbacks.ClassFileLoadHook = callbackClassFileLoadHook;
431 if (!NSK_JVMTI_VERIFY(jvmti->SetEventCallbacks(&callbacks, size))) {
432 return JNI_ERR;
433 }
434 }
435 NSK_DISPLAY0(" ... set\n");
436
437 /* register agent proc and arg */
438 if (!NSK_VERIFY(nsk_jvmti_setAgentProc(agentProc, NULL)))
439 return JNI_ERR;
440
441 return JNI_OK;
442 }
443
444 /* ============================================================================= */
445
446 }
|