comparison src/share/vm/runtime/reflectionUtils.hpp @ 3938:e6b1331a51d2

7086585: make Java field injection more flexible Reviewed-by: jrose, twisti, kvn, coleenp
author never
date Sat, 10 Sep 2011 17:29:02 -0700
parents 1d1603768966
children da91efe96a93
comparison
equal deleted inserted replaced
3937:c565834fb592 3938:e6b1331a51d2
105 // } 105 // }
106 106
107 107
108 class FieldStream : public KlassStream { 108 class FieldStream : public KlassStream {
109 private: 109 private:
110 int length() const { return fields()->length(); } 110 int length() const { return _klass->java_fields_count(); }
111 constantPoolOop constants() const { return _klass->constants(); } 111
112 protected:
113 typeArrayOop fields() const { return _klass->fields(); }
114 public: 112 public:
115 FieldStream(instanceKlassHandle klass, bool local_only, bool classes_only) 113 FieldStream(instanceKlassHandle klass, bool local_only, bool classes_only)
116 : KlassStream(klass, local_only, classes_only) { 114 : KlassStream(klass, local_only, classes_only) {
117 _index = length(); 115 _index = length();
118 next(); 116 next();
119 } 117 }
120 118
121 void next() { _index -= instanceKlass::next_offset; } 119 void next() { _index -= 1; }
122 120
123 // Accessors for current field 121 // Accessors for current field
124 AccessFlags access_flags() const { 122 AccessFlags access_flags() const {
125 AccessFlags flags; 123 AccessFlags flags;
126 flags.set_flags(fields()->ushort_at(index() + instanceKlass::access_flags_offset)); 124 flags.set_flags(_klass->field_access_flags(_index));
127 return flags; 125 return flags;
128 } 126 }
129 Symbol* name() const { 127 Symbol* name() const {
130 int name_index = fields()->ushort_at(index() + instanceKlass::name_index_offset); 128 return _klass->field_name(_index);
131 return constants()->symbol_at(name_index);
132 } 129 }
133 Symbol* signature() const { 130 Symbol* signature() const {
134 int signature_index = fields()->ushort_at(index() + 131 return _klass->field_signature(_index);
135 instanceKlass::signature_index_offset);
136 return constants()->symbol_at(signature_index);
137 } 132 }
138 // missing: initval() 133 // missing: initval()
139 int offset() const { 134 int offset() const {
140 return _klass->offset_from_fields( index() ); 135 return _klass->field_offset( index() );
141 } 136 }
142 }; 137 };
143 138
144 class FilteredField { 139 class FilteredField {
145 private: 140 private:
211 : FieldStream(klass, local_only, classes_only) { 206 : FieldStream(klass, local_only, classes_only) {
212 _filtered_fields_count = FilteredFieldsMap::filtered_fields_count((klassOop)klass(), local_only); 207 _filtered_fields_count = FilteredFieldsMap::filtered_fields_count((klassOop)klass(), local_only);
213 } 208 }
214 int field_count(); 209 int field_count();
215 void next() { 210 void next() {
216 _index -= instanceKlass::next_offset; 211 _index -= 1;
217 if (has_filtered_field()) { 212 if (has_filtered_field()) {
218 while (_index >=0 && FilteredFieldsMap::is_filtered_field((klassOop)_klass(), offset())) { 213 while (_index >=0 && FilteredFieldsMap::is_filtered_field((klassOop)_klass(), offset())) {
219 _index -= instanceKlass::next_offset; 214 _index -= 1;
220 } 215 }
221 } 216 }
222 } 217 }
223 }; 218 };
224 219