37 #define TOTAL_INSTRUMENTED_CLASSES 2
38
39 static int clsLoadedIdx=0;
40 static jint newClassSize[TOTAL_INSTRUMENTED_CLASSES];
41 static unsigned char* newClassBytes[TOTAL_INSTRUMENTED_CLASSES];
42 static jvmtiClassDefinition oldClassDef[TOTAL_INSTRUMENTED_CLASSES];
43
44 /* ============================================================================= */
45 /*
46 * Class: nsk_jvmti_scenarios_bcinstr_BI01_bi01t002
47 * Method: setNewByteCode
48 * Signature: (I[B)Z
49 */
50 JNIEXPORT jboolean JNICALL
51 Java_nsk_jvmti_scenarios_bcinstr_BI01_bi01t002_setNewByteCode(JNIEnv *jni_env,
52 jobject o, jint ind, jbyteArray byteCode) {
53
54 jbyte* elements;
55 jboolean isCopy;
56
57 if (!NSK_JNI_VERIFY(jni_env, (newClassSize[ind] = jni_env->GetArrayLength(byteCode)) > 0)) {
58 nsk_jvmti_setFailStatus();
59 return NSK_FALSE;
60 }
61 NSK_DISPLAY1("\t... got array size: %d\n", newClassSize[ind]);
62
63 if (!NSK_JNI_VERIFY(jni_env, (elements =
64 jni_env->GetByteArrayElements(byteCode, &isCopy)) != NULL)) {
65 nsk_jvmti_setFailStatus();
66 return NSK_FALSE;
67 }
68 NSK_DISPLAY1("\t... got elements list: 0x%p\n", (void*)elements);
69
70 if (!NSK_JVMTI_VERIFY(jvmti->Allocate(newClassSize[ind], &newClassBytes[ind]))) {
71 nsk_jvmti_setFailStatus();
72 return NSK_FALSE;
73 }
74 NSK_DISPLAY1("\t... created bytes array: 0x%p\n", (void*)newClassBytes[ind]);
75
76 {
77 int j;
78 for (j = 0; j < newClassSize[ind]; j++)
79 newClassBytes[ind][j] = (unsigned char)elements[j];
80 }
81 NSK_DISPLAY1("\t... copied bytecode: %d bytes\n", (int)newClassSize[ind]);
82
83 NSK_DISPLAY1("\t... release elements list: 0x%p\n", (void*)elements);
84 NSK_TRACE(jni_env->ReleaseByteArrayElements(byteCode, elements, JNI_ABORT));
85 NSK_DISPLAY0("\t... released\n");
86 return NSK_TRUE;
87 }
88
89 /* ============================================================================= */
90 /*
91 * Class: nsk_jvmti_scenarios_bcinstr_BI01_bi01t002
92 * Method: setClass
93 * Signature: (ILjava/lang/Class;)V
94 */
95 JNIEXPORT void JNICALL
96 Java_nsk_jvmti_scenarios_bcinstr_BI01_bi01t002_setClass(JNIEnv *jni_env,
97 jobject o, jint ind, jclass cls) {
98
99 if (!NSK_JNI_VERIFY(jni_env, (oldClassDef[ind].klass = (jclass)
100 jni_env->NewGlobalRef(cls)) != NULL)) {
101 nsk_jvmti_setFailStatus();
102 }
103 }
104
105 /* ============================================================================= */
106
107 /** Callback function for ClassFileLoadHook event. */
108 JNIEXPORT void JNICALL
109 cbClassFileLoadHook(jvmtiEnv *jvmti_env, JNIEnv* jni_env,
110 jclass class_being_redefined, jobject loader, const char* name,
111 jobject protection_domain, jint class_data_len,
112 const unsigned char* class_data, jint* new_class_data_len,
113 unsigned char** new_class_data) {
114
115 if ( name == NULL || strcmp(name, TESTED_CLASS_NAME) ) {
116 return;
117 }
118
119 NSK_DISPLAY3("CLASS_FILE_LOAD_HOOK event: %s\n\treceived bytecode: 0x%p:%d\n",
120 name, (void *)class_data, class_data_len);
238
239 /** Agent library initialization. */
240 #ifdef STATIC_BUILD
241 JNIEXPORT jint JNICALL Agent_OnLoad_bi01t002(JavaVM *jvm, char *options, void *reserved) {
242 return Agent_Initialize(jvm, options, reserved);
243 }
244 JNIEXPORT jint JNICALL Agent_OnAttach_bi01t002(JavaVM *jvm, char *options, void *reserved) {
245 return Agent_Initialize(jvm, options, reserved);
246 }
247 JNIEXPORT jint JNI_OnLoad_bi01t002(JavaVM *jvm, char *options, void *reserved) {
248 return JNI_VERSION_1_8;
249 }
250 #endif
251 jint Agent_Initialize(JavaVM *jvm, char *options, void *reserved) {
252
253 if (!NSK_VERIFY(nsk_jvmti_parseOptions(options)))
254 return JNI_ERR;
255
256 timeout = nsk_jvmti_getWaitTime() * 60 * 1000;
257
258 if (!NSK_VERIFY((jvmti = nsk_jvmti_createJVMTIEnv(jvm, reserved)) != NULL))
259 return JNI_ERR;
260
261 {
262 jvmtiCapabilities caps;
263 memset(&caps, 0, sizeof(caps));
264
265 caps.can_redefine_classes = 1;
266 if (!NSK_JVMTI_VERIFY(jvmti->AddCapabilities(&caps)))
267 return JNI_ERR;
268 }
269
270 NSK_DISPLAY0("Set callback for CLASS_FILE_LOAD_HOOK event\n");
271 {
272 jvmtiEventCallbacks callbacks;
273 jint size = (jint)sizeof(callbacks);
274
275 memset(&callbacks, 0, size);
276 callbacks.ClassFileLoadHook = cbClassFileLoadHook;
277 if (!NSK_JVMTI_VERIFY(jvmti->SetEventCallbacks(&callbacks, size))) {
278 return JNI_ERR;
|
37 #define TOTAL_INSTRUMENTED_CLASSES 2
38
39 static int clsLoadedIdx=0;
40 static jint newClassSize[TOTAL_INSTRUMENTED_CLASSES];
41 static unsigned char* newClassBytes[TOTAL_INSTRUMENTED_CLASSES];
42 static jvmtiClassDefinition oldClassDef[TOTAL_INSTRUMENTED_CLASSES];
43
44 /* ============================================================================= */
45 /*
46 * Class: nsk_jvmti_scenarios_bcinstr_BI01_bi01t002
47 * Method: setNewByteCode
48 * Signature: (I[B)Z
49 */
50 JNIEXPORT jboolean JNICALL
51 Java_nsk_jvmti_scenarios_bcinstr_BI01_bi01t002_setNewByteCode(JNIEnv *jni_env,
52 jobject o, jint ind, jbyteArray byteCode) {
53
54 jbyte* elements;
55 jboolean isCopy;
56
57 newClassSize[ind] = jni_env->GetArrayLength(byteCode);
58 if (!NSK_JNI_VERIFY(jni_env, newClassSize[ind] > 0)) {
59 nsk_jvmti_setFailStatus();
60 return NSK_FALSE;
61 }
62 NSK_DISPLAY1("\t... got array size: %d\n", newClassSize[ind]);
63
64 elements = jni_env->GetByteArrayElements(byteCode, &isCopy);
65 if (!NSK_JNI_VERIFY(jni_env, elements != NULL)) {
66 nsk_jvmti_setFailStatus();
67 return NSK_FALSE;
68 }
69 NSK_DISPLAY1("\t... got elements list: 0x%p\n", (void*)elements);
70
71 if (!NSK_JVMTI_VERIFY(jvmti->Allocate(newClassSize[ind], &newClassBytes[ind]))) {
72 nsk_jvmti_setFailStatus();
73 return NSK_FALSE;
74 }
75 NSK_DISPLAY1("\t... created bytes array: 0x%p\n", (void*)newClassBytes[ind]);
76
77 {
78 int j;
79 for (j = 0; j < newClassSize[ind]; j++)
80 newClassBytes[ind][j] = (unsigned char)elements[j];
81 }
82 NSK_DISPLAY1("\t... copied bytecode: %d bytes\n", (int)newClassSize[ind]);
83
84 NSK_DISPLAY1("\t... release elements list: 0x%p\n", (void*)elements);
85 NSK_TRACE(jni_env->ReleaseByteArrayElements(byteCode, elements, JNI_ABORT));
86 NSK_DISPLAY0("\t... released\n");
87 return NSK_TRUE;
88 }
89
90 /* ============================================================================= */
91 /*
92 * Class: nsk_jvmti_scenarios_bcinstr_BI01_bi01t002
93 * Method: setClass
94 * Signature: (ILjava/lang/Class;)V
95 */
96 JNIEXPORT void JNICALL
97 Java_nsk_jvmti_scenarios_bcinstr_BI01_bi01t002_setClass(JNIEnv *jni_env,
98 jobject o, jint ind, jclass cls) {
99
100 oldClassDef[ind].klass = (jclass) jni_env->NewGlobalRef(cls);
101 if (!NSK_JNI_VERIFY(jni_env, oldClassDef[ind].klass != NULL)) {
102 nsk_jvmti_setFailStatus();
103 }
104 }
105
106 /* ============================================================================= */
107
108 /** Callback function for ClassFileLoadHook event. */
109 JNIEXPORT void JNICALL
110 cbClassFileLoadHook(jvmtiEnv *jvmti_env, JNIEnv* jni_env,
111 jclass class_being_redefined, jobject loader, const char* name,
112 jobject protection_domain, jint class_data_len,
113 const unsigned char* class_data, jint* new_class_data_len,
114 unsigned char** new_class_data) {
115
116 if ( name == NULL || strcmp(name, TESTED_CLASS_NAME) ) {
117 return;
118 }
119
120 NSK_DISPLAY3("CLASS_FILE_LOAD_HOOK event: %s\n\treceived bytecode: 0x%p:%d\n",
121 name, (void *)class_data, class_data_len);
239
240 /** Agent library initialization. */
241 #ifdef STATIC_BUILD
242 JNIEXPORT jint JNICALL Agent_OnLoad_bi01t002(JavaVM *jvm, char *options, void *reserved) {
243 return Agent_Initialize(jvm, options, reserved);
244 }
245 JNIEXPORT jint JNICALL Agent_OnAttach_bi01t002(JavaVM *jvm, char *options, void *reserved) {
246 return Agent_Initialize(jvm, options, reserved);
247 }
248 JNIEXPORT jint JNI_OnLoad_bi01t002(JavaVM *jvm, char *options, void *reserved) {
249 return JNI_VERSION_1_8;
250 }
251 #endif
252 jint Agent_Initialize(JavaVM *jvm, char *options, void *reserved) {
253
254 if (!NSK_VERIFY(nsk_jvmti_parseOptions(options)))
255 return JNI_ERR;
256
257 timeout = nsk_jvmti_getWaitTime() * 60 * 1000;
258
259 jvmti = nsk_jvmti_createJVMTIEnv(jvm, reserved);
260 if (!NSK_VERIFY(jvmti != NULL))
261 return JNI_ERR;
262
263 {
264 jvmtiCapabilities caps;
265 memset(&caps, 0, sizeof(caps));
266
267 caps.can_redefine_classes = 1;
268 if (!NSK_JVMTI_VERIFY(jvmti->AddCapabilities(&caps)))
269 return JNI_ERR;
270 }
271
272 NSK_DISPLAY0("Set callback for CLASS_FILE_LOAD_HOOK event\n");
273 {
274 jvmtiEventCallbacks callbacks;
275 jint size = (jint)sizeof(callbacks);
276
277 memset(&callbacks, 0, size);
278 callbacks.ClassFileLoadHook = cbClassFileLoadHook;
279 if (!NSK_JVMTI_VERIFY(jvmti->SetEventCallbacks(&callbacks, size))) {
280 return JNI_ERR;
|