1.1 --- a/src/share/vm/ci/ciInstanceKlass.cpp Tue Mar 11 11:04:40 2008 -0700 1.2 +++ b/src/share/vm/ci/ciInstanceKlass.cpp Tue Mar 11 11:25:13 2008 -0700 1.3 @@ -34,7 +34,9 @@ 1.4 // ciInstanceKlass::ciInstanceKlass 1.5 // 1.6 // Loaded instance klass. 1.7 -ciInstanceKlass::ciInstanceKlass(KlassHandle h_k) : ciKlass(h_k) { 1.8 +ciInstanceKlass::ciInstanceKlass(KlassHandle h_k) : 1.9 + ciKlass(h_k), _non_static_fields(NULL) 1.10 +{ 1.11 assert(get_Klass()->oop_is_instance(), "wrong type"); 1.12 instanceKlass* ik = get_instanceKlass(); 1.13 1.14 @@ -335,6 +337,37 @@ 1.15 return field; 1.16 } 1.17 1.18 +// ------------------------------------------------------------------ 1.19 +// ciInstanceKlass::non_static_fields. 1.20 + 1.21 +class NonStaticFieldFiller: public FieldClosure { 1.22 + GrowableArray<ciField*>* _arr; 1.23 + ciEnv* _curEnv; 1.24 +public: 1.25 + NonStaticFieldFiller(ciEnv* curEnv, GrowableArray<ciField*>* arr) : 1.26 + _curEnv(curEnv), _arr(arr) 1.27 + {} 1.28 + void do_field(fieldDescriptor* fd) { 1.29 + ciField* field = new (_curEnv->arena()) ciField(fd); 1.30 + _arr->append(field); 1.31 + } 1.32 +}; 1.33 + 1.34 +GrowableArray<ciField*>* ciInstanceKlass::non_static_fields() { 1.35 + if (_non_static_fields == NULL) { 1.36 + VM_ENTRY_MARK; 1.37 + ciEnv* curEnv = ciEnv::current(); 1.38 + instanceKlass* ik = get_instanceKlass(); 1.39 + int max_n_fields = ik->fields()->length()/instanceKlass::next_offset; 1.40 + 1.41 + _non_static_fields = 1.42 + new (curEnv->arena()) GrowableArray<ciField*>(max_n_fields); 1.43 + NonStaticFieldFiller filler(curEnv, _non_static_fields); 1.44 + ik->do_nonstatic_fields(&filler); 1.45 + } 1.46 + return _non_static_fields; 1.47 +} 1.48 + 1.49 static int sort_field_by_offset(ciField** a, ciField** b) { 1.50 return (*a)->offset_in_bytes() - (*b)->offset_in_bytes(); 1.51 // (no worries about 32-bit overflow...)