src/share/vm/runtime/fieldDescriptor.cpp

changeset 3137
e6b1331a51d2
parent 2314
f95d63e2154a
child 3803
71afdabfd05b
equal deleted inserted replaced
3136:c565834fb592 3137:e6b1331a51d2
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()) {

mercurial