40 typeArrayOop fieldDescriptor::annotations() const { |
40 typeArrayOop fieldDescriptor::annotations() const { |
41 instanceKlass* ik = instanceKlass::cast(field_holder()); |
41 instanceKlass* ik = instanceKlass::cast(field_holder()); |
42 objArrayOop md = ik->fields_annotations(); |
42 objArrayOop md = ik->fields_annotations(); |
43 if (md == NULL) |
43 if (md == NULL) |
44 return NULL; |
44 return NULL; |
45 assert((index() % instanceKlass::next_offset) == 0, ""); |
45 return typeArrayOop(md->obj_at(index())); |
46 return typeArrayOop(md->obj_at(index() / instanceKlass::next_offset)); |
|
47 } |
46 } |
48 |
47 |
49 constantTag fieldDescriptor::initial_value_tag() const { |
48 constantTag fieldDescriptor::initial_value_tag() const { |
50 return constants()->tag_at(_initial_value_index); |
49 return constants()->tag_at(initial_value_index()); |
51 } |
50 } |
52 |
51 |
53 jint fieldDescriptor::int_initial_value() const { |
52 jint fieldDescriptor::int_initial_value() const { |
54 return constants()->int_at(_initial_value_index); |
53 return constants()->int_at(initial_value_index()); |
55 } |
54 } |
56 |
55 |
57 jlong fieldDescriptor::long_initial_value() const { |
56 jlong fieldDescriptor::long_initial_value() const { |
58 return constants()->long_at(_initial_value_index); |
57 return constants()->long_at(initial_value_index()); |
59 } |
58 } |
60 |
59 |
61 jfloat fieldDescriptor::float_initial_value() const { |
60 jfloat fieldDescriptor::float_initial_value() const { |
62 return constants()->float_at(_initial_value_index); |
61 return constants()->float_at(initial_value_index()); |
63 } |
62 } |
64 |
63 |
65 jdouble fieldDescriptor::double_initial_value() const { |
64 jdouble fieldDescriptor::double_initial_value() const { |
66 return constants()->double_at(_initial_value_index); |
65 return constants()->double_at(initial_value_index()); |
67 } |
66 } |
68 |
67 |
69 oop fieldDescriptor::string_initial_value(TRAPS) const { |
68 oop fieldDescriptor::string_initial_value(TRAPS) const { |
70 return constants()->string_at(_initial_value_index, CHECK_0); |
69 return constants()->string_at(initial_value_index(), CHECK_0); |
71 } |
70 } |
72 |
71 |
73 void fieldDescriptor::initialize(klassOop k, int index) { |
72 void fieldDescriptor::initialize(klassOop k, int index) { |
74 instanceKlass* ik = instanceKlass::cast(k); |
73 instanceKlass* ik = instanceKlass::cast(k); |
75 _cp = ik->constants(); |
74 _cp = ik->constants(); |
76 typeArrayOop fields = ik->fields(); |
75 FieldInfo* f = ik->field(index); |
|
76 assert(!f->is_internal(), "regular Java fields only"); |
77 |
77 |
78 assert(fields->length() % instanceKlass::next_offset == 0, "Illegal size of field array"); |
78 _access_flags = accessFlags_from(f->access_flags()); |
79 assert(fields->length() >= index + instanceKlass::next_offset, "Illegal size of field array"); |
79 guarantee(f->name_index() != 0 && f->signature_index() != 0, "bad constant pool index for fieldDescriptor"); |
80 |
|
81 _access_flags.set_field_flags(fields->ushort_at(index + instanceKlass::access_flags_offset)); |
|
82 _name_index = fields->ushort_at(index + instanceKlass::name_index_offset); |
|
83 _signature_index = fields->ushort_at(index + instanceKlass::signature_index_offset); |
|
84 _initial_value_index = fields->ushort_at(index + instanceKlass::initval_index_offset); |
|
85 guarantee(_name_index != 0 && _signature_index != 0, "bad constant pool index for fieldDescriptor"); |
|
86 _offset = ik->offset_from_fields( index ); |
|
87 _generic_signature_index = fields->ushort_at(index + instanceKlass::generic_signature_offset); |
|
88 _index = index; |
80 _index = index; |
89 } |
81 } |
90 |
82 |
91 #ifndef PRODUCT |
83 #ifndef PRODUCT |
92 |
84 |
93 void fieldDescriptor::print_on(outputStream* st) const { |
85 void fieldDescriptor::print_on(outputStream* st) const { |
94 _access_flags.print_on(st); |
86 access_flags().print_on(st); |
95 constants()->symbol_at(_name_index)->print_value_on(st); |
87 name()->print_value_on(st); |
96 st->print(" "); |
88 st->print(" "); |
97 constants()->symbol_at(_signature_index)->print_value_on(st); |
89 signature()->print_value_on(st); |
98 st->print(" @%d ", offset()); |
90 st->print(" @%d ", offset()); |
99 if (WizardMode && has_initial_value()) { |
91 if (WizardMode && has_initial_value()) { |
100 st->print("(initval "); |
92 st->print("(initval "); |
101 constantTag t = initial_value_tag(); |
93 constantTag t = initial_value_tag(); |
102 if (t.is_int()) { |
94 if (t.is_int()) { |