hotspot/src/share/vm/oops/instanceKlass.cpp
changeset 3821 847fddcb639b
parent 3820 0a8fbbe180db
parent 3817 2074f52fb46c
child 3912 3aaaaad1ccb0
child 3824 86e9e4b25bdf
equal deleted inserted replaced
3820:0a8fbbe180db 3821:847fddcb639b
  1395 #define InstanceKlass_OOP_MAP_ITERATE(obj, do_oop, assert_fn)            \
  1395 #define InstanceKlass_OOP_MAP_ITERATE(obj, do_oop, assert_fn)            \
  1396 {                                                                        \
  1396 {                                                                        \
  1397   /* Compute oopmap block range. The common case                         \
  1397   /* Compute oopmap block range. The common case                         \
  1398      is nonstatic_oop_map_size == 1. */                                  \
  1398      is nonstatic_oop_map_size == 1. */                                  \
  1399   OopMapBlock* map           = start_of_nonstatic_oop_maps();            \
  1399   OopMapBlock* map           = start_of_nonstatic_oop_maps();            \
  1400   OopMapBlock* const end_map = map + nonstatic_oop_map_size();           \
  1400   OopMapBlock* const end_map = map + nonstatic_oop_map_count();          \
  1401   if (UseCompressedOops) {                                               \
  1401   if (UseCompressedOops) {                                               \
  1402     while (map < end_map) {                                              \
  1402     while (map < end_map) {                                              \
  1403       InstanceKlass_SPECIALIZED_OOP_ITERATE(narrowOop,                   \
  1403       InstanceKlass_SPECIALIZED_OOP_ITERATE(narrowOop,                   \
  1404         obj->obj_field_addr<narrowOop>(map->offset()), map->length(),    \
  1404         obj->obj_field_addr<narrowOop>(map->offset()), map->count(),     \
  1405         do_oop, assert_fn)                                               \
  1405         do_oop, assert_fn)                                               \
  1406       ++map;                                                             \
  1406       ++map;                                                             \
  1407     }                                                                    \
  1407     }                                                                    \
  1408   } else {                                                               \
  1408   } else {                                                               \
  1409     while (map < end_map) {                                              \
  1409     while (map < end_map) {                                              \
  1410       InstanceKlass_SPECIALIZED_OOP_ITERATE(oop,                         \
  1410       InstanceKlass_SPECIALIZED_OOP_ITERATE(oop,                         \
  1411         obj->obj_field_addr<oop>(map->offset()), map->length(),          \
  1411         obj->obj_field_addr<oop>(map->offset()), map->count(),           \
  1412         do_oop, assert_fn)                                               \
  1412         do_oop, assert_fn)                                               \
  1413       ++map;                                                             \
  1413       ++map;                                                             \
  1414     }                                                                    \
  1414     }                                                                    \
  1415   }                                                                      \
  1415   }                                                                      \
  1416 }
  1416 }
  1417 
  1417 
  1418 #define InstanceKlass_OOP_MAP_REVERSE_ITERATE(obj, do_oop, assert_fn)    \
  1418 #define InstanceKlass_OOP_MAP_REVERSE_ITERATE(obj, do_oop, assert_fn)    \
  1419 {                                                                        \
  1419 {                                                                        \
  1420   OopMapBlock* const start_map = start_of_nonstatic_oop_maps();          \
  1420   OopMapBlock* const start_map = start_of_nonstatic_oop_maps();          \
  1421   OopMapBlock* map             = start_map + nonstatic_oop_map_size();   \
  1421   OopMapBlock* map             = start_map + nonstatic_oop_map_count();  \
  1422   if (UseCompressedOops) {                                               \
  1422   if (UseCompressedOops) {                                               \
  1423     while (start_map < map) {                                            \
  1423     while (start_map < map) {                                            \
  1424       --map;                                                             \
  1424       --map;                                                             \
  1425       InstanceKlass_SPECIALIZED_OOP_REVERSE_ITERATE(narrowOop,           \
  1425       InstanceKlass_SPECIALIZED_OOP_REVERSE_ITERATE(narrowOop,           \
  1426         obj->obj_field_addr<narrowOop>(map->offset()), map->length(),    \
  1426         obj->obj_field_addr<narrowOop>(map->offset()), map->count(),     \
  1427         do_oop, assert_fn)                                               \
  1427         do_oop, assert_fn)                                               \
  1428     }                                                                    \
  1428     }                                                                    \
  1429   } else {                                                               \
  1429   } else {                                                               \
  1430     while (start_map < map) {                                            \
  1430     while (start_map < map) {                                            \
  1431       --map;                                                             \
  1431       --map;                                                             \
  1432       InstanceKlass_SPECIALIZED_OOP_REVERSE_ITERATE(oop,                 \
  1432       InstanceKlass_SPECIALIZED_OOP_REVERSE_ITERATE(oop,                 \
  1433         obj->obj_field_addr<oop>(map->offset()), map->length(),          \
  1433         obj->obj_field_addr<oop>(map->offset()), map->count(),           \
  1434         do_oop, assert_fn)                                               \
  1434         do_oop, assert_fn)                                               \
  1435     }                                                                    \
  1435     }                                                                    \
  1436   }                                                                      \
  1436   }                                                                      \
  1437 }
  1437 }
  1438 
  1438 
  1442   /* Compute oopmap block range. The common case is                      \
  1442   /* Compute oopmap block range. The common case is                      \
  1443      nonstatic_oop_map_size == 1, so we accept the                       \
  1443      nonstatic_oop_map_size == 1, so we accept the                       \
  1444      usually non-existent extra overhead of examining                    \
  1444      usually non-existent extra overhead of examining                    \
  1445      all the maps. */                                                    \
  1445      all the maps. */                                                    \
  1446   OopMapBlock* map           = start_of_nonstatic_oop_maps();            \
  1446   OopMapBlock* map           = start_of_nonstatic_oop_maps();            \
  1447   OopMapBlock* const end_map = map + nonstatic_oop_map_size();           \
  1447   OopMapBlock* const end_map = map + nonstatic_oop_map_count();          \
  1448   if (UseCompressedOops) {                                               \
  1448   if (UseCompressedOops) {                                               \
  1449     while (map < end_map) {                                              \
  1449     while (map < end_map) {                                              \
  1450       InstanceKlass_SPECIALIZED_BOUNDED_OOP_ITERATE(narrowOop,           \
  1450       InstanceKlass_SPECIALIZED_BOUNDED_OOP_ITERATE(narrowOop,           \
  1451         obj->obj_field_addr<narrowOop>(map->offset()), map->length(),    \
  1451         obj->obj_field_addr<narrowOop>(map->offset()), map->count(),     \
  1452         low, high,                                                       \
  1452         low, high,                                                       \
  1453         do_oop, assert_fn)                                               \
  1453         do_oop, assert_fn)                                               \
  1454       ++map;                                                             \
  1454       ++map;                                                             \
  1455     }                                                                    \
  1455     }                                                                    \
  1456   } else {                                                               \
  1456   } else {                                                               \
  1457     while (map < end_map) {                                              \
  1457     while (map < end_map) {                                              \
  1458       InstanceKlass_SPECIALIZED_BOUNDED_OOP_ITERATE(oop,                 \
  1458       InstanceKlass_SPECIALIZED_BOUNDED_OOP_ITERATE(oop,                 \
  1459         obj->obj_field_addr<oop>(map->offset()), map->length(),          \
  1459         obj->obj_field_addr<oop>(map->offset()), map->count(),           \
  1460         low, high,                                                       \
  1460         low, high,                                                       \
  1461         do_oop, assert_fn)                                               \
  1461         do_oop, assert_fn)                                               \
  1462       ++map;                                                             \
  1462       ++map;                                                             \
  1463     }                                                                    \
  1463     }                                                                    \
  1464   }                                                                      \
  1464   }                                                                      \
  2215     static bool first_time = true;
  2215     static bool first_time = true;
  2216     guarantee(k == SystemDictionary::class_klass() && first_time, "Invalid verify of maps");
  2216     guarantee(k == SystemDictionary::class_klass() && first_time, "Invalid verify of maps");
  2217     first_time = false;
  2217     first_time = false;
  2218     const int extra = java_lang_Class::number_of_fake_oop_fields;
  2218     const int extra = java_lang_Class::number_of_fake_oop_fields;
  2219     guarantee(ik->nonstatic_field_size() == extra, "just checking");
  2219     guarantee(ik->nonstatic_field_size() == extra, "just checking");
  2220     guarantee(ik->nonstatic_oop_map_size() == 1, "just checking");
  2220     guarantee(ik->nonstatic_oop_map_count() == 1, "just checking");
  2221     guarantee(ik->size_helper() == align_object_size(instanceOopDesc::header_size() + extra), "just checking");
  2221     guarantee(ik->size_helper() == align_object_size(instanceOopDesc::header_size() + extra), "just checking");
  2222 
  2222 
  2223     // Check that the map is (2,extra)
  2223     // Check that the map is (2,extra)
  2224     int offset = java_lang_Class::klass_offset;
  2224     int offset = java_lang_Class::klass_offset;
  2225 
  2225 
  2226     OopMapBlock* map = ik->start_of_nonstatic_oop_maps();
  2226     OopMapBlock* map = ik->start_of_nonstatic_oop_maps();
  2227     guarantee(map->offset() == offset && map->length() == extra, "just checking");
  2227     guarantee(map->offset() == offset && map->count() == (unsigned int) extra,
       
  2228               "sanity");
  2228   }
  2229   }
  2229 }
  2230 }
  2230 
  2231 
  2231 #endif // ndef PRODUCT
  2232 #endif // ndef PRODUCT
  2232 
  2233