src/share/vm/ci/ciInstanceKlass.cpp

changeset 479
52fed2ec0afb
parent 435
a61af66fc99e
child 548
ba764ed4b6f2
     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...)

mercurial