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 }
|