44 #define CLASS_TAG 4 45 46 #define ENCODE_TAG(type, obj, fld) (((jlong)type)<<32 | ((jlong)obj)<<16 | (jlong)fld) 47 #define DECODE_TYPE(tag) tag>>32 48 #define DECODE_OBJECT(tag) ((tag>>16)&0xFFFF) 49 #define DECODE_FIELD(tag) (tag&0xFFFF) 50 51 #define TEST_OBJECTS_COUNT 2 52 #define TAGGED_OBJECTS 1 53 54 static long timeout = 0; 55 static int filter_type = -1; 56 57 // by default at least one object will be reported regardless to filter type 58 static int expected_object_count = 1; 59 static int reported_objects = 0; 60 61 //expected values 62 #define INT_ARRAY_LENGTH 2 63 64 static jint TAGGED_STATIC_INT_VALUE = 0xC0DE01; 65 static jint TAGGED_INT_VALUE = 0xC0DE02; 66 static jint UNTAGGED_STATIC_INT_VALUE = 0xC0DE03; 67 static jint UNTAGGED_INT_VALUE = 0xC0DE04; 68 static jint TAGGED_INT_ARRAY_VALUE[] = {0xC0DE01, 69 0xC0DE01+1}; 70 static jint UNTAGGED_INT_ARRAY_VALUE[] = {0xC0DE03, 71 0xC0DE03+1}; 72 static const wchar_t *TAGGED_STRING_VALUE = L"I'm a tagged string"; 73 static const wchar_t *UNTAGGED_STRING_VALUE = L"I'm an untagged string"; 74 75 //kind of field 76 #define TYPE_FIELD 1 77 #define TYPE_ARRAY 2 78 #define TYPE_STRING 4 79 80 //field info 81 typedef struct { 82 char *name; 83 char *signature; 84 int found; 85 int collected; 86 int primitive; 87 int expected; 335 336 // Iterate over fields, collect info about it and tag non primitive fields. 337 for (field = 0; field < objects_info[object].fields_count; field++) { 338 jint modifiers; 339 int is_static = 0; 340 int is_primitive = 0; 341 if (!NSK_JVMTI_VERIFY(jvmti->GetFieldName(targetClass, 342 targetFields[field], 343 &objects_info[object].fields[field].name, 344 &objects_info[object].fields[field].signature, 345 NULL))) 346 return JNI_ERR; 347 if (!NSK_JVMTI_VERIFY(jvmti->GetFieldModifiers( 348 targetClass, targetFields[field], &modifiers))) { 349 return JNI_ERR; 350 } 351 is_static = (modifiers & STATIC_FIELD) == STATIC_FIELD; 352 if (is_primitive_type(objects_info[object].fields[field].signature)) { 353 objects_info[object].fields[field].primitive = 1; 354 is_primitive = 1; 355 } else { 356 jobject value; 357 if (!NSK_JVMTI_VERIFY(jvmti->GetFieldModifiers( 358 targetClass, targetFields[field], &modifiers))) { 359 return JNI_ERR; 360 } 361 if (is_static) { 362 if (!NSK_VERIFY(NULL != (value = jni->GetStaticObjectField( 363 targetClass, targetFields[field])))) { 364 return JNI_ERR; 365 } 366 } else { 367 if (!NSK_VERIFY(NULL != (value = jni->GetObjectField(target, targetFields[field])))) { 368 return JNI_ERR; 369 } 370 } 371 if (tagged) { 372 if (!NSK_JVMTI_VERIFY(jvmti->SetTag(value, ENCODE_TAG(FIELD_TAG,object,field)))) { 373 return JNI_ERR; 374 } | 44 #define CLASS_TAG 4 45 46 #define ENCODE_TAG(type, obj, fld) (((jlong)type)<<32 | ((jlong)obj)<<16 | (jlong)fld) 47 #define DECODE_TYPE(tag) tag>>32 48 #define DECODE_OBJECT(tag) ((tag>>16)&0xFFFF) 49 #define DECODE_FIELD(tag) (tag&0xFFFF) 50 51 #define TEST_OBJECTS_COUNT 2 52 #define TAGGED_OBJECTS 1 53 54 static long timeout = 0; 55 static int filter_type = -1; 56 57 // by default at least one object will be reported regardless to filter type 58 static int expected_object_count = 1; 59 static int reported_objects = 0; 60 61 //expected values 62 #define INT_ARRAY_LENGTH 2 63 64 static jint POISON = 0x1234; 65 static jint TAGGED_STATIC_INT_VALUE = 0xC0DE01 + POISON; 66 static jint TAGGED_INT_VALUE = 0xC0DE02 + POISON; 67 static jint UNTAGGED_STATIC_INT_VALUE = 0xC0DE03 + POISON; 68 static jint UNTAGGED_INT_VALUE = 0xC0DE04 + POISON; 69 static jint TAGGED_INT_ARRAY_VALUE[] = {0xC0DE01, 70 0xC0DE01+1}; 71 static jint UNTAGGED_INT_ARRAY_VALUE[] = {0xC0DE03, 72 0xC0DE03+1}; 73 static const wchar_t *TAGGED_STRING_VALUE = L"I'm a tagged string"; 74 static const wchar_t *UNTAGGED_STRING_VALUE = L"I'm an untagged string"; 75 76 //kind of field 77 #define TYPE_FIELD 1 78 #define TYPE_ARRAY 2 79 #define TYPE_STRING 4 80 81 //field info 82 typedef struct { 83 char *name; 84 char *signature; 85 int found; 86 int collected; 87 int primitive; 88 int expected; 336 337 // Iterate over fields, collect info about it and tag non primitive fields. 338 for (field = 0; field < objects_info[object].fields_count; field++) { 339 jint modifiers; 340 int is_static = 0; 341 int is_primitive = 0; 342 if (!NSK_JVMTI_VERIFY(jvmti->GetFieldName(targetClass, 343 targetFields[field], 344 &objects_info[object].fields[field].name, 345 &objects_info[object].fields[field].signature, 346 NULL))) 347 return JNI_ERR; 348 if (!NSK_JVMTI_VERIFY(jvmti->GetFieldModifiers( 349 targetClass, targetFields[field], &modifiers))) { 350 return JNI_ERR; 351 } 352 is_static = (modifiers & STATIC_FIELD) == STATIC_FIELD; 353 if (is_primitive_type(objects_info[object].fields[field].signature)) { 354 objects_info[object].fields[field].primitive = 1; 355 is_primitive = 1; 356 // Add POISON to all int fields to make the value opaque to the JIT compiler. 357 if (is_static) { 358 jint value = jni->GetStaticIntField(targetClass, targetFields[field]); 359 jni->SetStaticIntField(targetClass, targetFields[field], value + POISON); 360 } else { 361 jint value = jni->GetIntField(target, targetFields[field]); 362 jni->SetIntField(target, targetFields[field], value + POISON); 363 } 364 } else { 365 jobject value; 366 if (!NSK_JVMTI_VERIFY(jvmti->GetFieldModifiers( 367 targetClass, targetFields[field], &modifiers))) { 368 return JNI_ERR; 369 } 370 if (is_static) { 371 if (!NSK_VERIFY(NULL != (value = jni->GetStaticObjectField( 372 targetClass, targetFields[field])))) { 373 return JNI_ERR; 374 } 375 } else { 376 if (!NSK_VERIFY(NULL != (value = jni->GetObjectField(target, targetFields[field])))) { 377 return JNI_ERR; 378 } 379 } 380 if (tagged) { 381 if (!NSK_JVMTI_VERIFY(jvmti->SetTag(value, ENCODE_TAG(FIELD_TAG,object,field)))) { 382 return JNI_ERR; 383 } |