< prev index next >

test/hotspot/jtreg/vmTestbase/nsk/jvmti/ClassFileLoadHook/classfloadhk002/classfloadhk002.cpp

Print this page
rev 51942 : [mq]: refactor


 105         } else {
 106             NSK_DISPLAY1("All %s bytecode is equal to expected one\n", kind);
 107         }
 108     }
 109 
 110     return success;
 111 }
 112 
 113 /** Get classfile bytecode from a static field of given class. */
 114 static int getBytecode(jvmtiEnv* jvmti, JNIEnv* jni, jclass cls,
 115                                     const char fieldName[], const char fieldSig[],
 116                                     jint* size, unsigned char* *bytes) {
 117 
 118     jfieldID fieldID = NULL;
 119     jbyteArray array = NULL;
 120     jbyte* elements;
 121     int i;
 122 
 123     NSK_DISPLAY1("Find static field: %s\n", fieldName);
 124     if (!NSK_JNI_VERIFY(jni, (fieldID =
 125             NSK_CPP_STUB4(GetStaticFieldID, jni, cls, fieldName, fieldSig)) != NULL)) {
 126         nsk_jvmti_setFailStatus();
 127         return NSK_FALSE;
 128     }
 129     NSK_DISPLAY1("  ... got fieldID: 0x%p\n", (void*)fieldID);
 130 
 131     NSK_DISPLAY1("Get classfile bytes array from static field: %s\n", fieldName);
 132     if (!NSK_JNI_VERIFY(jni, (array = (jbyteArray)
 133             NSK_CPP_STUB3(GetStaticObjectField, jni, cls, fieldID)) != NULL)) {
 134         nsk_jvmti_setFailStatus();
 135         return NSK_FALSE;
 136     }
 137     NSK_DISPLAY1("  ... got array object: 0x%p\n", (void*)array);
 138 
 139     if (!NSK_JNI_VERIFY(jni, (*size =
 140             NSK_CPP_STUB2(GetArrayLength, jni, array)) > 0)) {
 141         nsk_jvmti_setFailStatus();
 142         return NSK_FALSE;
 143     }
 144     NSK_DISPLAY1("  ... got array size: %d bytes\n", (int)*size);
 145 
 146     {
 147         jboolean isCopy;
 148         if (!NSK_JNI_VERIFY(jni, (elements =
 149                 NSK_CPP_STUB3(GetByteArrayElements, jni, array,
 150                                                             &isCopy)) != NULL)) {
 151             nsk_jvmti_setFailStatus();
 152         return NSK_FALSE;
 153         }
 154     }
 155     NSK_DISPLAY1("  ... got elements list: 0x%p\n", (void*)elements);
 156 
 157     if (!NSK_JVMTI_VERIFY(
 158             NSK_CPP_STUB3(Allocate, jvmti, *size, bytes))) {
 159         nsk_jvmti_setFailStatus();
 160         return NSK_FALSE;
 161     }
 162     NSK_DISPLAY1("  ... created bytes array: 0x%p\n", (void*)*bytes);
 163 
 164     for (i = 0; i < *size; i++) {
 165         (*bytes)[i] = (unsigned char)elements[i];
 166     }
 167     NSK_DISPLAY1("  ... copied bytecode: %d bytes\n", (int)*size);
 168 
 169     NSK_DISPLAY1("Release elements list: 0x%p\n", (void*)elements);
 170     NSK_TRACE(NSK_CPP_STUB4(ReleaseByteArrayElements, jni, array, elements, JNI_ABORT));
 171     NSK_DISPLAY0("  ... released\n");
 172 
 173     return NSK_TRUE;
 174 }
 175 
 176 /* ============================================================================= */
 177 
 178 /** Agent algorithm. */
 179 static void JNICALL
 180 agentProc(jvmtiEnv* jvmti, JNIEnv* jni, void* arg) {
 181     NSK_DISPLAY0("Wait for debuggee to become ready\n");
 182     if (!NSK_VERIFY(nsk_jvmti_waitForSync(timeout)))
 183         return;
 184 
 185     /* perform testing */
 186     {
 187         NSK_DISPLAY0(">>> Obtain original bytecode of tested class\n");
 188         {
 189             jclass debugeeClass = NULL;
 190 
 191             NSK_DISPLAY1("Find debugee class: %s\n", DEBUGEE_CLASS_NAME);
 192             if (!NSK_JNI_VERIFY(jni, (debugeeClass =
 193                     NSK_CPP_STUB2(FindClass, jni, DEBUGEE_CLASS_NAME)) != NULL)) {
 194                 nsk_jvmti_setFailStatus();
 195                 return;
 196             }
 197             NSK_DISPLAY1("  ... found class: 0x%p\n", (void*)debugeeClass);
 198 
 199             if (!NSK_VERIFY(getBytecode(jvmti, jni, debugeeClass,
 200                                         ORIG_BYTECODE_FIELD_NAME,
 201                                         BYTECODE_FIELD_SIG,
 202                                         &origClassSize, &origClassBytes)))
 203                 return;
 204         }
 205 
 206         NSK_DISPLAY0(">>> Testcase #1: Load tested class and check CLASS_FILE_LOAD_HOOK event\n");
 207         {
 208             jvmtiEvent event = JVMTI_EVENT_CLASS_FILE_LOAD_HOOK;
 209 
 210             NSK_DISPLAY1("Enable event: %s\n", "CLASS_FILE_LOAD_HOOK");
 211             if (!NSK_VERIFY(nsk_jvmti_enableEvents(JVMTI_ENABLE, 1, &event, NULL)))
 212                 return;
 213             NSK_DISPLAY0("  ... event enabled\n");


 223             if (NSK_VERIFY(nsk_jvmti_enableEvents(JVMTI_DISABLE, 1, &event, NULL))) {
 224                 NSK_DISPLAY0("  ... event disabled\n");
 225             }
 226 
 227             NSK_DISPLAY1("Check if event was received: %s\n", "CLASS_FILE_LOAD_HOOK");
 228             if (eventsCount != 1) {
 229                 NSK_COMPLAIN3("Unexpected number of %s events for tested class:\n"
 230                               "#   got events: %d\n"
 231                               "#   expected:   %d\n",
 232                                 "CLASS_FILE_LOAD_HOOK",
 233                                 eventsCount, 1);
 234                 nsk_jvmti_setFailStatus();
 235             } else {
 236                 NSK_DISPLAY1("  ... received: %d events\n", eventsCount);
 237             }
 238         }
 239 
 240         NSK_DISPLAY0(">>> Clean used data\n");
 241         {
 242             NSK_DISPLAY1("Deallocate bytecode array: 0x%p\n", (void*)origClassBytes);
 243             if (!NSK_JVMTI_VERIFY(
 244                         NSK_CPP_STUB2(Deallocate, jvmti, origClassBytes))) {
 245                 nsk_jvmti_setFailStatus();
 246             }
 247         }
 248     }
 249 
 250     NSK_DISPLAY0("Let debugee to finish\n");
 251     if (!NSK_VERIFY(nsk_jvmti_resumeSync()))
 252         return;
 253 }
 254 
 255 /* ============================================================================= */
 256 
 257 /** Callback for CLASS_FILE_LOAD_HOOK event **/
 258 static void JNICALL
 259 callbackClassFileLoadHook(jvmtiEnv *jvmti_env, JNIEnv *env,
 260                             jclass class_being_redefined,
 261                             jobject loader, const char* name, jobject protection_domain,
 262                             jint class_data_len, const unsigned char* class_data,
 263                             jint *new_class_data_len, unsigned char** new_class_data) {
 264 


 301 jint Agent_Initialize(JavaVM *jvm, char *options, void *reserved) {
 302     jvmtiEnv* jvmti = NULL;
 303 
 304     /* init framework and parse options */
 305     if (!NSK_VERIFY(nsk_jvmti_parseOptions(options)))
 306         return JNI_ERR;
 307 
 308     timeout = nsk_jvmti_getWaitTime() * 60 * 1000;
 309 
 310     /* create JVMTI environment */
 311     if (!NSK_VERIFY((jvmti =
 312             nsk_jvmti_createJVMTIEnv(jvm, reserved)) != NULL))
 313         return JNI_ERR;
 314 
 315     NSK_DISPLAY1("Add required capability: %s\n", "can_generate_eraly_class_hook_events");
 316     {
 317         jvmtiCapabilities caps;
 318 
 319         memset(&caps, 0, sizeof(caps));
 320         caps.can_generate_all_class_hook_events = 1;
 321         if (!NSK_JVMTI_VERIFY(
 322                 NSK_CPP_STUB2(AddCapabilities, jvmti, &caps))) {
 323             return JNI_ERR;
 324         }
 325     }
 326     NSK_DISPLAY0("  ... added\n");
 327 
 328     NSK_DISPLAY1("Set callback for event: %s\n", "CLASS_FILE_LOAD_HOOK");
 329     {
 330         jvmtiEventCallbacks callbacks;
 331         jint size = (jint)sizeof(callbacks);
 332 
 333         memset(&callbacks, 0, sizeof(callbacks));
 334         callbacks.ClassFileLoadHook = callbackClassFileLoadHook;
 335         if (!NSK_JVMTI_VERIFY(
 336                 NSK_CPP_STUB3(SetEventCallbacks, jvmti, &callbacks, size))) {
 337             return JNI_ERR;
 338         }
 339     }
 340     NSK_DISPLAY0("  ... set\n");
 341 
 342     /* register agent proc and arg */
 343     if (!NSK_VERIFY(nsk_jvmti_setAgentProc(agentProc, NULL)))
 344         return JNI_ERR;
 345 
 346     return JNI_OK;
 347 }
 348 
 349 /* ============================================================================= */
 350 
 351 }


 105         } else {
 106             NSK_DISPLAY1("All %s bytecode is equal to expected one\n", kind);
 107         }
 108     }
 109 
 110     return success;
 111 }
 112 
 113 /** Get classfile bytecode from a static field of given class. */
 114 static int getBytecode(jvmtiEnv* jvmti, JNIEnv* jni, jclass cls,
 115                                     const char fieldName[], const char fieldSig[],
 116                                     jint* size, unsigned char* *bytes) {
 117 
 118     jfieldID fieldID = NULL;
 119     jbyteArray array = NULL;
 120     jbyte* elements;
 121     int i;
 122 
 123     NSK_DISPLAY1("Find static field: %s\n", fieldName);
 124     if (!NSK_JNI_VERIFY(jni, (fieldID =
 125             jni->GetStaticFieldID(cls, fieldName, fieldSig)) != NULL)) {
 126         nsk_jvmti_setFailStatus();
 127         return NSK_FALSE;
 128     }
 129     NSK_DISPLAY1("  ... got fieldID: 0x%p\n", (void*)fieldID);
 130 
 131     NSK_DISPLAY1("Get classfile bytes array from static field: %s\n", fieldName);
 132     if (!NSK_JNI_VERIFY(jni, (array = (jbyteArray)
 133             jni->GetStaticObjectField(cls, fieldID)) != NULL)) {
 134         nsk_jvmti_setFailStatus();
 135         return NSK_FALSE;
 136     }
 137     NSK_DISPLAY1("  ... got array object: 0x%p\n", (void*)array);
 138 
 139     if (!NSK_JNI_VERIFY(jni, (*size = jni->GetArrayLength(array)) > 0)) {

 140         nsk_jvmti_setFailStatus();
 141         return NSK_FALSE;
 142     }
 143     NSK_DISPLAY1("  ... got array size: %d bytes\n", (int)*size);
 144 
 145     {
 146         jboolean isCopy;
 147         if (!NSK_JNI_VERIFY(jni, (elements = jni->GetByteArrayElements(array, &isCopy)) != NULL)) {


 148             nsk_jvmti_setFailStatus();
 149         return NSK_FALSE;
 150         }
 151     }
 152     NSK_DISPLAY1("  ... got elements list: 0x%p\n", (void*)elements);
 153 
 154     if (!NSK_JVMTI_VERIFY(jvmti->Allocate(*size, bytes))) {

 155         nsk_jvmti_setFailStatus();
 156         return NSK_FALSE;
 157     }
 158     NSK_DISPLAY1("  ... created bytes array: 0x%p\n", (void*)*bytes);
 159 
 160     for (i = 0; i < *size; i++) {
 161         (*bytes)[i] = (unsigned char)elements[i];
 162     }
 163     NSK_DISPLAY1("  ... copied bytecode: %d bytes\n", (int)*size);
 164 
 165     NSK_DISPLAY1("Release elements list: 0x%p\n", (void*)elements);
 166     NSK_TRACE(jni->ReleaseByteArrayElements(array, elements, JNI_ABORT));
 167     NSK_DISPLAY0("  ... released\n");
 168 
 169     return NSK_TRUE;
 170 }
 171 
 172 /* ============================================================================= */
 173 
 174 /** Agent algorithm. */
 175 static void JNICALL
 176 agentProc(jvmtiEnv* jvmti, JNIEnv* jni, void* arg) {
 177     NSK_DISPLAY0("Wait for debuggee to become ready\n");
 178     if (!NSK_VERIFY(nsk_jvmti_waitForSync(timeout)))
 179         return;
 180 
 181     /* perform testing */
 182     {
 183         NSK_DISPLAY0(">>> Obtain original bytecode of tested class\n");
 184         {
 185             jclass debugeeClass = NULL;
 186 
 187             NSK_DISPLAY1("Find debugee class: %s\n", DEBUGEE_CLASS_NAME);
 188             if (!NSK_JNI_VERIFY(jni, (debugeeClass =
 189                     jni->FindClass(DEBUGEE_CLASS_NAME)) != NULL)) {
 190                 nsk_jvmti_setFailStatus();
 191                 return;
 192             }
 193             NSK_DISPLAY1("  ... found class: 0x%p\n", (void*)debugeeClass);
 194 
 195             if (!NSK_VERIFY(getBytecode(jvmti, jni, debugeeClass,
 196                                         ORIG_BYTECODE_FIELD_NAME,
 197                                         BYTECODE_FIELD_SIG,
 198                                         &origClassSize, &origClassBytes)))
 199                 return;
 200         }
 201 
 202         NSK_DISPLAY0(">>> Testcase #1: Load tested class and check CLASS_FILE_LOAD_HOOK event\n");
 203         {
 204             jvmtiEvent event = JVMTI_EVENT_CLASS_FILE_LOAD_HOOK;
 205 
 206             NSK_DISPLAY1("Enable event: %s\n", "CLASS_FILE_LOAD_HOOK");
 207             if (!NSK_VERIFY(nsk_jvmti_enableEvents(JVMTI_ENABLE, 1, &event, NULL)))
 208                 return;
 209             NSK_DISPLAY0("  ... event enabled\n");


 219             if (NSK_VERIFY(nsk_jvmti_enableEvents(JVMTI_DISABLE, 1, &event, NULL))) {
 220                 NSK_DISPLAY0("  ... event disabled\n");
 221             }
 222 
 223             NSK_DISPLAY1("Check if event was received: %s\n", "CLASS_FILE_LOAD_HOOK");
 224             if (eventsCount != 1) {
 225                 NSK_COMPLAIN3("Unexpected number of %s events for tested class:\n"
 226                               "#   got events: %d\n"
 227                               "#   expected:   %d\n",
 228                                 "CLASS_FILE_LOAD_HOOK",
 229                                 eventsCount, 1);
 230                 nsk_jvmti_setFailStatus();
 231             } else {
 232                 NSK_DISPLAY1("  ... received: %d events\n", eventsCount);
 233             }
 234         }
 235 
 236         NSK_DISPLAY0(">>> Clean used data\n");
 237         {
 238             NSK_DISPLAY1("Deallocate bytecode array: 0x%p\n", (void*)origClassBytes);
 239             if (!NSK_JVMTI_VERIFY(jvmti->Deallocate(origClassBytes))) {

 240                 nsk_jvmti_setFailStatus();
 241             }
 242         }
 243     }
 244 
 245     NSK_DISPLAY0("Let debugee to finish\n");
 246     if (!NSK_VERIFY(nsk_jvmti_resumeSync()))
 247         return;
 248 }
 249 
 250 /* ============================================================================= */
 251 
 252 /** Callback for CLASS_FILE_LOAD_HOOK event **/
 253 static void JNICALL
 254 callbackClassFileLoadHook(jvmtiEnv *jvmti_env, JNIEnv *env,
 255                             jclass class_being_redefined,
 256                             jobject loader, const char* name, jobject protection_domain,
 257                             jint class_data_len, const unsigned char* class_data,
 258                             jint *new_class_data_len, unsigned char** new_class_data) {
 259 


 296 jint Agent_Initialize(JavaVM *jvm, char *options, void *reserved) {
 297     jvmtiEnv* jvmti = NULL;
 298 
 299     /* init framework and parse options */
 300     if (!NSK_VERIFY(nsk_jvmti_parseOptions(options)))
 301         return JNI_ERR;
 302 
 303     timeout = nsk_jvmti_getWaitTime() * 60 * 1000;
 304 
 305     /* create JVMTI environment */
 306     if (!NSK_VERIFY((jvmti =
 307             nsk_jvmti_createJVMTIEnv(jvm, reserved)) != NULL))
 308         return JNI_ERR;
 309 
 310     NSK_DISPLAY1("Add required capability: %s\n", "can_generate_eraly_class_hook_events");
 311     {
 312         jvmtiCapabilities caps;
 313 
 314         memset(&caps, 0, sizeof(caps));
 315         caps.can_generate_all_class_hook_events = 1;
 316         if (!NSK_JVMTI_VERIFY(jvmti->AddCapabilities(&caps))) {

 317             return JNI_ERR;
 318         }
 319     }
 320     NSK_DISPLAY0("  ... added\n");
 321 
 322     NSK_DISPLAY1("Set callback for event: %s\n", "CLASS_FILE_LOAD_HOOK");
 323     {
 324         jvmtiEventCallbacks callbacks;
 325         jint size = (jint)sizeof(callbacks);
 326 
 327         memset(&callbacks, 0, sizeof(callbacks));
 328         callbacks.ClassFileLoadHook = callbackClassFileLoadHook;
 329         if (!NSK_JVMTI_VERIFY(jvmti->SetEventCallbacks(&callbacks, size))) {

 330             return JNI_ERR;
 331         }
 332     }
 333     NSK_DISPLAY0("  ... set\n");
 334 
 335     /* register agent proc and arg */
 336     if (!NSK_VERIFY(nsk_jvmti_setAgentProc(agentProc, NULL)))
 337         return JNI_ERR;
 338 
 339     return JNI_OK;
 340 }
 341 
 342 /* ============================================================================= */
 343 
 344 }
< prev index next >