hotspot/src/share/vm/oops/instanceKlass.cpp
changeset 3693 af387bf37e8d
parent 3576 4ceec8fb3e18
child 3694 942b7bc7f28c
equal deleted inserted replaced
3692:9530a85b334c 3693:af387bf37e8d
  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