hotspot/src/share/vm/oops/fieldStreams.hpp
changeset 12772 d317e5e08194
parent 10546 e79347eebbc5
child 13728 882756847a04
equal deleted inserted replaced
12724:1e3d7ca55ffc 12772:d317e5e08194
    40  protected:
    40  protected:
    41   typeArrayHandle     _fields;
    41   typeArrayHandle     _fields;
    42   constantPoolHandle  _constants;
    42   constantPoolHandle  _constants;
    43   int                 _index;
    43   int                 _index;
    44   int                 _limit;
    44   int                 _limit;
       
    45   int                 _generic_signature_slot;
    45 
    46 
    46   FieldInfo* field() const { return FieldInfo::from_field_array(_fields(), _index); }
    47   FieldInfo* field() const { return FieldInfo::from_field_array(_fields(), _index); }
       
    48 
       
    49   int init_generic_signature_start_slot() {
       
    50     int length = _fields->length();
       
    51     int num_fields = 0;
       
    52     int skipped_generic_signature_slots = 0;
       
    53     FieldInfo* fi;
       
    54     AccessFlags flags;
       
    55     /* Scan from 0 to the current _index. Count the number of generic
       
    56        signature slots for field[0] to field[_index - 1]. */
       
    57     for (int i = 0; i < _index; i++) {
       
    58       fi = FieldInfo::from_field_array(_fields(), i);
       
    59       flags.set_flags(fi->access_flags());
       
    60       if (flags.field_has_generic_signature()) {
       
    61         length --;
       
    62         skipped_generic_signature_slots ++;
       
    63       }
       
    64     }
       
    65     /* Scan from the current _index. */
       
    66     for (int i = _index; i*FieldInfo::field_slots < length; i++) {
       
    67       fi = FieldInfo::from_field_array(_fields(), i);
       
    68       flags.set_flags(fi->access_flags());
       
    69       if (flags.field_has_generic_signature()) {
       
    70         length --;
       
    71       }
       
    72       num_fields ++;
       
    73     }
       
    74     _generic_signature_slot = length + skipped_generic_signature_slots;
       
    75     assert(_generic_signature_slot <= _fields->length(), "");
       
    76     return num_fields;
       
    77   }
    47 
    78 
    48   FieldStreamBase(typeArrayHandle fields, constantPoolHandle constants, int start, int limit) {
    79   FieldStreamBase(typeArrayHandle fields, constantPoolHandle constants, int start, int limit) {
    49     _fields = fields;
    80     _fields = fields;
    50     _constants = constants;
    81     _constants = constants;
    51     _index = start;
    82     _index = start;
    52     _limit = limit;
    83     int num_fields = init_generic_signature_start_slot();
       
    84     if (limit < start) {
       
    85       _limit = num_fields;
       
    86     } else {
       
    87       _limit = limit;
       
    88     }
    53   }
    89   }
    54 
    90 
    55   FieldStreamBase(typeArrayHandle fields, constantPoolHandle constants) {
    91   FieldStreamBase(typeArrayHandle fields, constantPoolHandle constants) {
    56     _fields = fields;
    92     _fields = fields;
    57     _constants = constants;
    93     _constants = constants;
    58     _index = 0;
    94     _index = 0;
    59     _limit = fields->length() / FieldInfo::field_slots;
    95     _limit = init_generic_signature_start_slot();
    60   }
    96   }
    61 
    97 
    62  public:
    98  public:
    63   FieldStreamBase(instanceKlass* klass) {
    99   FieldStreamBase(instanceKlass* klass) {
    64     _fields = klass->fields();
   100     _fields = klass->fields();
    65     _constants = klass->constants();
   101     _constants = klass->constants();
    66     _index = 0;
   102     _index = 0;
    67     _limit = klass->java_fields_count();
   103     _limit = klass->java_fields_count();
       
   104     init_generic_signature_start_slot();
    68   }
   105   }
    69   FieldStreamBase(instanceKlassHandle klass) {
   106   FieldStreamBase(instanceKlassHandle klass) {
    70     _fields = klass->fields();
   107     _fields = klass->fields();
    71     _constants = klass->constants();
   108     _constants = klass->constants();
    72     _index = 0;
   109     _index = 0;
    73     _limit = klass->java_fields_count();
   110     _limit = klass->java_fields_count();
       
   111     init_generic_signature_start_slot();
    74   }
   112   }
    75 
   113 
    76   // accessors
   114   // accessors
    77   int index() const                 { return _index; }
   115   int index() const                 { return _index; }
    78 
   116 
    79   void next() { _index += 1; }
   117   void next() {
       
   118     if (access_flags().field_has_generic_signature()) {
       
   119       _generic_signature_slot ++;
       
   120       assert(_generic_signature_slot <= _fields->length(), "");
       
   121     }
       
   122     _index += 1;
       
   123   }
    80   bool done() const { return _index >= _limit; }
   124   bool done() const { return _index >= _limit; }
    81 
   125 
    82   // Accessors for current field
   126   // Accessors for current field
    83   AccessFlags access_flags() const {
   127   AccessFlags access_flags() const {
    84     AccessFlags flags;
   128     AccessFlags flags;
   101   Symbol* signature() const {
   145   Symbol* signature() const {
   102     return field()->signature(_constants);
   146     return field()->signature(_constants);
   103   }
   147   }
   104 
   148 
   105   Symbol* generic_signature() const {
   149   Symbol* generic_signature() const {
   106     return field()->generic_signature(_constants);
   150     if (access_flags().field_has_generic_signature()) {
       
   151       assert(_generic_signature_slot < _fields->length(), "out of bounds");
       
   152       int index = _fields->short_at(_generic_signature_slot);
       
   153       return _constants->symbol_at(index);
       
   154     } else {
       
   155       return NULL;
       
   156     }
   107   }
   157   }
   108 
   158 
   109   int offset() const {
   159   int offset() const {
   110     return field()->offset();
   160     return field()->offset();
   111   }
   161   }
   137     assert(!field()->is_internal(), "regular only");
   187     assert(!field()->is_internal(), "regular only");
   138     field()->set_signature_index(index);
   188     field()->set_signature_index(index);
   139   }
   189   }
   140   int generic_signature_index() const {
   190   int generic_signature_index() const {
   141     assert(!field()->is_internal(), "regular only");
   191     assert(!field()->is_internal(), "regular only");
   142     return field()->generic_signature_index();
   192     if (access_flags().field_has_generic_signature()) {
       
   193       assert(_generic_signature_slot < _fields->length(), "out of bounds");
       
   194       return _fields->short_at(_generic_signature_slot);
       
   195     } else {
       
   196       return 0;
       
   197     }
   143   }
   198   }
   144   void set_generic_signature_index(int index) {
   199   void set_generic_signature_index(int index) {
   145     assert(!field()->is_internal(), "regular only");
   200     assert(!field()->is_internal(), "regular only");
   146     field()->set_generic_signature_index(index);
   201     if (access_flags().field_has_generic_signature()) {
       
   202       assert(_generic_signature_slot < _fields->length(), "out of bounds");
       
   203       _fields->short_at_put(_generic_signature_slot, index);
       
   204     }
   147   }
   205   }
   148   int initval_index() const {
   206   int initval_index() const {
   149     assert(!field()->is_internal(), "regular only");
   207     assert(!field()->is_internal(), "regular only");
   150     return field()->initval_index();
   208     return field()->initval_index();
   151   }
   209   }
   157 
   215 
   158 
   216 
   159 // Iterate over only the internal fields
   217 // Iterate over only the internal fields
   160 class InternalFieldStream : public FieldStreamBase {
   218 class InternalFieldStream : public FieldStreamBase {
   161  public:
   219  public:
   162   InternalFieldStream(instanceKlass* k):      FieldStreamBase(k->fields(), k->constants(), k->java_fields_count(), k->all_fields_count()) {}
   220   InternalFieldStream(instanceKlass* k):      FieldStreamBase(k->fields(), k->constants(), k->java_fields_count(), 0) {}
   163   InternalFieldStream(instanceKlassHandle k): FieldStreamBase(k->fields(), k->constants(), k->java_fields_count(), k->all_fields_count()) {}
   221   InternalFieldStream(instanceKlassHandle k): FieldStreamBase(k->fields(), k->constants(), k->java_fields_count(), 0) {}
   164 };
   222 };
   165 
   223 
   166 
   224 
   167 class AllFieldStream : public FieldStreamBase {
   225 class AllFieldStream : public FieldStreamBase {
   168  public:
   226  public: