Top


定義場所(file name)

hotspot/src/share/vm/classfile/classFileParser.cpp

名前(function name)

void ClassFileParser::fill_oop_maps(instanceKlassHandle k,
                                    unsigned int nonstatic_oop_map_count,
                                    int* nonstatic_oop_offsets,
                                    unsigned int* nonstatic_oop_counts) {

本体部(body)

  {- -------------------------------------------
  (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.