hotspot/src/share/vm/classfile/classFileParser.cpp
void ClassFileParser::fill_oop_maps(instanceKlassHandle k,
unsigned int nonstatic_oop_map_count,
int* nonstatic_oop_offsets,
unsigned int* nonstatic_oop_counts) {
{- -------------------------------------------
(1) (変数宣言など)
---------------------------------------- -}
OopMapBlock* this_oop_map = k->start_of_nonstatic_oop_maps();
const instanceKlass* const super = k->superklass();
{- -------------------------------------------
(1) スーパークラスに OopMapBlock が存在する場合は,
その分の内容をこのクラスの OopMapBlock 領域にコピーしておく.
---------------------------------------- -}
const unsigned int super_count = super ? super->nonstatic_oop_map_count() : 0;
if (super_count > 0) {
// Copy maps from superklass
OopMapBlock* super_oop_map = super->start_of_nonstatic_oop_maps();
for (unsigned int i = 0; i < super_count; ++i) {
*this_oop_map++ = *super_oop_map++;
}
}
{- -------------------------------------------
(1) このクラスで定義された nonstatic oop フィールドがある場合
(= nonstatic_oop_map_count フィールドが 0 より大きい場合),
OopMapBlock::set_offset() 及び OopMapBlock::set_count() で
その情報を OopMapBlock 領域にセットしておく.
(なお, このクラスの最初の oop フィールドが
スーパークラスの最後の oop フィールドと連続している場合は,
それらは1つにまとめている)
---------------------------------------- -}
if (nonstatic_oop_map_count > 0) {
{- -------------------------------------------
(1.1) (このクラスの最初の oop フィールドがスーパークラスの最後の oop フィールドと連続している場合の処理)
---------------------------------------- -}
if (super_count + nonstatic_oop_map_count > k->nonstatic_oop_map_count()) {
// The counts differ because there is no gap between superklass's last oop
// field and the first local oop field. Extend the last oop map copied
// from the superklass instead of creating new one.
nonstatic_oop_map_count--;
nonstatic_oop_offsets++;
this_oop_map--;
this_oop_map->set_count(this_oop_map->count() + *nonstatic_oop_counts++);
this_oop_map++;
}
{- -------------------------------------------
(1.1) (このクラスで定義された nonstatic oop フィールドの情報を OopMapBlock 領域に書き込む処理)
---------------------------------------- -}
// Add new map blocks, fill them
while (nonstatic_oop_map_count-- > 0) {
this_oop_map->set_offset(*nonstatic_oop_offsets++);
this_oop_map->set_count(*nonstatic_oop_counts++);
this_oop_map++;
}
{- -------------------------------------------
(1.1) (assert)
---------------------------------------- -}
assert(k->start_of_nonstatic_oop_maps() + k->nonstatic_oop_map_count() ==
this_oop_map, "sanity");
}
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.