comparison src/share/vm/oops/instanceKlass.cpp @ 938:b37c246bf7ce

6861660: OopMapBlock count/size confusion Reviewed-by: tonyp, iveresov
author jcoomes
date Tue, 11 Aug 2009 15:37:23 -0700
parents 1413494da700
children 9eebd3ac74cf
comparison
equal deleted inserted replaced
937:ead53f6b615d 938:b37c246bf7ce
1394 #define InstanceKlass_OOP_MAP_ITERATE(obj, do_oop, assert_fn) \ 1394 #define InstanceKlass_OOP_MAP_ITERATE(obj, do_oop, assert_fn) \
1395 { \ 1395 { \
1396 /* Compute oopmap block range. The common case \ 1396 /* Compute oopmap block range. The common case \
1397 is nonstatic_oop_map_size == 1. */ \ 1397 is nonstatic_oop_map_size == 1. */ \
1398 OopMapBlock* map = start_of_nonstatic_oop_maps(); \ 1398 OopMapBlock* map = start_of_nonstatic_oop_maps(); \
1399 OopMapBlock* const end_map = map + nonstatic_oop_map_size(); \ 1399 OopMapBlock* const end_map = map + nonstatic_oop_map_count(); \
1400 if (UseCompressedOops) { \ 1400 if (UseCompressedOops) { \
1401 while (map < end_map) { \ 1401 while (map < end_map) { \
1402 InstanceKlass_SPECIALIZED_OOP_ITERATE(narrowOop, \ 1402 InstanceKlass_SPECIALIZED_OOP_ITERATE(narrowOop, \
1403 obj->obj_field_addr<narrowOop>(map->offset()), map->length(), \ 1403 obj->obj_field_addr<narrowOop>(map->offset()), map->count(), \
1404 do_oop, assert_fn) \ 1404 do_oop, assert_fn) \
1405 ++map; \ 1405 ++map; \
1406 } \ 1406 } \
1407 } else { \ 1407 } else { \
1408 while (map < end_map) { \ 1408 while (map < end_map) { \
1409 InstanceKlass_SPECIALIZED_OOP_ITERATE(oop, \ 1409 InstanceKlass_SPECIALIZED_OOP_ITERATE(oop, \
1410 obj->obj_field_addr<oop>(map->offset()), map->length(), \ 1410 obj->obj_field_addr<oop>(map->offset()), map->count(), \
1411 do_oop, assert_fn) \ 1411 do_oop, assert_fn) \
1412 ++map; \ 1412 ++map; \
1413 } \ 1413 } \
1414 } \ 1414 } \
1415 } 1415 }
1416 1416
1417 #define InstanceKlass_OOP_MAP_REVERSE_ITERATE(obj, do_oop, assert_fn) \ 1417 #define InstanceKlass_OOP_MAP_REVERSE_ITERATE(obj, do_oop, assert_fn) \
1418 { \ 1418 { \
1419 OopMapBlock* const start_map = start_of_nonstatic_oop_maps(); \ 1419 OopMapBlock* const start_map = start_of_nonstatic_oop_maps(); \
1420 OopMapBlock* map = start_map + nonstatic_oop_map_size(); \ 1420 OopMapBlock* map = start_map + nonstatic_oop_map_count(); \
1421 if (UseCompressedOops) { \ 1421 if (UseCompressedOops) { \
1422 while (start_map < map) { \ 1422 while (start_map < map) { \
1423 --map; \ 1423 --map; \
1424 InstanceKlass_SPECIALIZED_OOP_REVERSE_ITERATE(narrowOop, \ 1424 InstanceKlass_SPECIALIZED_OOP_REVERSE_ITERATE(narrowOop, \
1425 obj->obj_field_addr<narrowOop>(map->offset()), map->length(), \ 1425 obj->obj_field_addr<narrowOop>(map->offset()), map->count(), \
1426 do_oop, assert_fn) \ 1426 do_oop, assert_fn) \
1427 } \ 1427 } \
1428 } else { \ 1428 } else { \
1429 while (start_map < map) { \ 1429 while (start_map < map) { \
1430 --map; \ 1430 --map; \
1431 InstanceKlass_SPECIALIZED_OOP_REVERSE_ITERATE(oop, \ 1431 InstanceKlass_SPECIALIZED_OOP_REVERSE_ITERATE(oop, \
1432 obj->obj_field_addr<oop>(map->offset()), map->length(), \ 1432 obj->obj_field_addr<oop>(map->offset()), map->count(), \
1433 do_oop, assert_fn) \ 1433 do_oop, assert_fn) \
1434 } \ 1434 } \
1435 } \ 1435 } \
1436 } 1436 }
1437 1437
1441 /* Compute oopmap block range. The common case is \ 1441 /* Compute oopmap block range. The common case is \
1442 nonstatic_oop_map_size == 1, so we accept the \ 1442 nonstatic_oop_map_size == 1, so we accept the \
1443 usually non-existent extra overhead of examining \ 1443 usually non-existent extra overhead of examining \
1444 all the maps. */ \ 1444 all the maps. */ \
1445 OopMapBlock* map = start_of_nonstatic_oop_maps(); \ 1445 OopMapBlock* map = start_of_nonstatic_oop_maps(); \
1446 OopMapBlock* const end_map = map + nonstatic_oop_map_size(); \ 1446 OopMapBlock* const end_map = map + nonstatic_oop_map_count(); \
1447 if (UseCompressedOops) { \ 1447 if (UseCompressedOops) { \
1448 while (map < end_map) { \ 1448 while (map < end_map) { \
1449 InstanceKlass_SPECIALIZED_BOUNDED_OOP_ITERATE(narrowOop, \ 1449 InstanceKlass_SPECIALIZED_BOUNDED_OOP_ITERATE(narrowOop, \
1450 obj->obj_field_addr<narrowOop>(map->offset()), map->length(), \ 1450 obj->obj_field_addr<narrowOop>(map->offset()), map->count(), \
1451 low, high, \ 1451 low, high, \
1452 do_oop, assert_fn) \ 1452 do_oop, assert_fn) \
1453 ++map; \ 1453 ++map; \
1454 } \ 1454 } \
1455 } else { \ 1455 } else { \
1456 while (map < end_map) { \ 1456 while (map < end_map) { \
1457 InstanceKlass_SPECIALIZED_BOUNDED_OOP_ITERATE(oop, \ 1457 InstanceKlass_SPECIALIZED_BOUNDED_OOP_ITERATE(oop, \
1458 obj->obj_field_addr<oop>(map->offset()), map->length(), \ 1458 obj->obj_field_addr<oop>(map->offset()), map->count(), \
1459 low, high, \ 1459 low, high, \
1460 do_oop, assert_fn) \ 1460 do_oop, assert_fn) \
1461 ++map; \ 1461 ++map; \
1462 } \ 1462 } \
1463 } \ 1463 } \
2214 static bool first_time = true; 2214 static bool first_time = true;
2215 guarantee(k == SystemDictionary::class_klass() && first_time, "Invalid verify of maps"); 2215 guarantee(k == SystemDictionary::class_klass() && first_time, "Invalid verify of maps");
2216 first_time = false; 2216 first_time = false;
2217 const int extra = java_lang_Class::number_of_fake_oop_fields; 2217 const int extra = java_lang_Class::number_of_fake_oop_fields;
2218 guarantee(ik->nonstatic_field_size() == extra, "just checking"); 2218 guarantee(ik->nonstatic_field_size() == extra, "just checking");
2219 guarantee(ik->nonstatic_oop_map_size() == 1, "just checking"); 2219 guarantee(ik->nonstatic_oop_map_count() == 1, "just checking");
2220 guarantee(ik->size_helper() == align_object_size(instanceOopDesc::header_size() + extra), "just checking"); 2220 guarantee(ik->size_helper() == align_object_size(instanceOopDesc::header_size() + extra), "just checking");
2221 2221
2222 // Check that the map is (2,extra) 2222 // Check that the map is (2,extra)
2223 int offset = java_lang_Class::klass_offset; 2223 int offset = java_lang_Class::klass_offset;
2224 2224
2225 OopMapBlock* map = ik->start_of_nonstatic_oop_maps(); 2225 OopMapBlock* map = ik->start_of_nonstatic_oop_maps();
2226 guarantee(map->offset() == offset && map->length() == extra, "just checking"); 2226 guarantee(map->offset() == offset && map->count() == extra, "sanity");
2227 } 2227 }
2228 } 2228 }
2229 2229
2230 #endif // ndef PRODUCT 2230 #endif // ndef PRODUCT
2231 2231