92 93 void next() { _index--; } 94 Method* method() const { return methods()->at(index()); } 95 }; 96 97 98 // A FieldStream streams over all fields in a class, superclasses and (super)interfaces. 99 // Streaming is done in reverse order (subclasses first, fields in reverse order) 100 // Usage: 101 // 102 // for (FieldStream st(k, false, false); !st.eos(); st.next()) { 103 // Symbol* field_name = st.name(); 104 // ... 105 // } 106 107 108 class FieldStream : public KlassStream { 109 private: 110 int length() const { return _klass->java_fields_count(); } 111 112 public: 113 FieldStream(instanceKlassHandle klass, bool local_only, bool classes_only) 114 : KlassStream(klass, local_only, classes_only) { 115 _index = length(); 116 next(); 117 } 118 119 void next() { _index -= 1; } 120 121 // Accessors for current field 122 AccessFlags access_flags() const { 123 AccessFlags flags; 124 flags.set_flags(_klass->field_access_flags(_index)); 125 return flags; 126 } 127 Symbol* name() const { 128 return _klass->field_name(_index); 129 } 130 Symbol* signature() const { 131 return _klass->field_signature(_index); 132 } 133 // missing: initval() 134 int offset() const { 135 return _klass->field_offset( index() ); 136 } 137 }; 138 139 class FilteredField : public CHeapObj<mtInternal> { 140 private: 141 Klass* _klass; 142 int _field_offset; 143 144 public: 145 FilteredField(Klass* klass, int field_offset) { 146 _klass = klass; 147 _field_offset = field_offset; 148 } 149 Klass* klass() { return _klass; } 150 int field_offset() { return _field_offset; } 151 }; 152 153 class FilteredFieldsMap : AllStatic { 154 private: 155 static GrowableArray<FilteredField *> *_filtered_fields; 156 public: | 92 93 void next() { _index--; } 94 Method* method() const { return methods()->at(index()); } 95 }; 96 97 98 // A FieldStream streams over all fields in a class, superclasses and (super)interfaces. 99 // Streaming is done in reverse order (subclasses first, fields in reverse order) 100 // Usage: 101 // 102 // for (FieldStream st(k, false, false); !st.eos(); st.next()) { 103 // Symbol* field_name = st.name(); 104 // ... 105 // } 106 107 108 class FieldStream : public KlassStream { 109 private: 110 int length() const { return _klass->java_fields_count(); } 111 112 fieldDescriptor _fd_buf; 113 114 public: 115 FieldStream(instanceKlassHandle klass, bool local_only, bool classes_only) 116 : KlassStream(klass, local_only, classes_only) { 117 _index = length(); 118 next(); 119 } 120 121 void next() { _index -= 1; } 122 123 // Accessors for current field 124 AccessFlags access_flags() const { 125 AccessFlags flags; 126 flags.set_flags(_klass->field_access_flags(_index)); 127 return flags; 128 } 129 Symbol* name() const { 130 return _klass->field_name(_index); 131 } 132 Symbol* signature() const { 133 return _klass->field_signature(_index); 134 } 135 // missing: initval() 136 int offset() const { 137 return _klass->field_offset( index() ); 138 } 139 // bridge to a heavier API: 140 fieldDescriptor& field_descriptor() const { 141 fieldDescriptor& field = const_cast<fieldDescriptor&>(_fd_buf); 142 field.reinitialize(_klass(), _index); 143 return field; 144 } 145 }; 146 147 class FilteredField : public CHeapObj<mtInternal> { 148 private: 149 Klass* _klass; 150 int _field_offset; 151 152 public: 153 FilteredField(Klass* klass, int field_offset) { 154 _klass = klass; 155 _field_offset = field_offset; 156 } 157 Klass* klass() { return _klass; } 158 int field_offset() { return _field_offset; } 159 }; 160 161 class FilteredFieldsMap : AllStatic { 162 private: 163 static GrowableArray<FilteredField *> *_filtered_fields; 164 public: |