25 #include "precompiled.hpp" 26 #include "classfile/systemDictionary.hpp" 27 #include "classfile/vmSymbols.hpp" 28 #include "memory/resourceArea.hpp" 29 #include "memory/universe.inline.hpp" 30 #include "oops/instanceKlass.hpp" 31 #include "runtime/fieldDescriptor.hpp" 32 #include "runtime/handles.inline.hpp" 33 #include "runtime/signature.hpp" 34 35 36 oop fieldDescriptor::loader() const { 37 return instanceKlass::cast(_cp->pool_holder())->class_loader(); 38 } 39 40 typeArrayOop fieldDescriptor::annotations() const { 41 instanceKlass* ik = instanceKlass::cast(field_holder()); 42 objArrayOop md = ik->fields_annotations(); 43 if (md == NULL) 44 return NULL; 45 assert((index() % instanceKlass::next_offset) == 0, ""); 46 return typeArrayOop(md->obj_at(index() / instanceKlass::next_offset)); 47 } 48 49 constantTag fieldDescriptor::initial_value_tag() const { 50 return constants()->tag_at(_initial_value_index); 51 } 52 53 jint fieldDescriptor::int_initial_value() const { 54 return constants()->int_at(_initial_value_index); 55 } 56 57 jlong fieldDescriptor::long_initial_value() const { 58 return constants()->long_at(_initial_value_index); 59 } 60 61 jfloat fieldDescriptor::float_initial_value() const { 62 return constants()->float_at(_initial_value_index); 63 } 64 65 jdouble fieldDescriptor::double_initial_value() const { 66 return constants()->double_at(_initial_value_index); 67 } 68 69 oop fieldDescriptor::string_initial_value(TRAPS) const { 70 return constants()->string_at(_initial_value_index, CHECK_0); 71 } 72 73 void fieldDescriptor::initialize(klassOop k, int index) { 74 instanceKlass* ik = instanceKlass::cast(k); 75 _cp = ik->constants(); 76 typeArrayOop fields = ik->fields(); 77 78 assert(fields->length() % instanceKlass::next_offset == 0, "Illegal size of field array"); 79 assert(fields->length() >= index + instanceKlass::next_offset, "Illegal size of field array"); 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; 89 } 90 91 #ifndef PRODUCT 92 93 void fieldDescriptor::print_on(outputStream* st) const { 94 _access_flags.print_on(st); 95 constants()->symbol_at(_name_index)->print_value_on(st); 96 st->print(" "); 97 constants()->symbol_at(_signature_index)->print_value_on(st); 98 st->print(" @%d ", offset()); 99 if (WizardMode && has_initial_value()) { 100 st->print("(initval "); 101 constantTag t = initial_value_tag(); 102 if (t.is_int()) { 103 st->print("int %d)", int_initial_value()); 104 } else if (t.is_long()){ 105 st->print_jlong(long_initial_value()); 106 } else if (t.is_float()){ 107 st->print("float %f)", float_initial_value()); 108 } else if (t.is_double()){ 109 st->print("double %lf)", double_initial_value()); 110 } 111 } 112 } 113 114 void fieldDescriptor::print_on_for(outputStream* st, oop obj) { 115 print_on(st); 116 BasicType ft = field_type(); 117 jint as_int = 0; | 25 #include "precompiled.hpp" 26 #include "classfile/systemDictionary.hpp" 27 #include "classfile/vmSymbols.hpp" 28 #include "memory/resourceArea.hpp" 29 #include "memory/universe.inline.hpp" 30 #include "oops/instanceKlass.hpp" 31 #include "runtime/fieldDescriptor.hpp" 32 #include "runtime/handles.inline.hpp" 33 #include "runtime/signature.hpp" 34 35 36 oop fieldDescriptor::loader() const { 37 return instanceKlass::cast(_cp->pool_holder())->class_loader(); 38 } 39 40 typeArrayOop fieldDescriptor::annotations() const { 41 instanceKlass* ik = instanceKlass::cast(field_holder()); 42 objArrayOop md = ik->fields_annotations(); 43 if (md == NULL) 44 return NULL; 45 return typeArrayOop(md->obj_at(index())); 46 } 47 48 constantTag fieldDescriptor::initial_value_tag() const { 49 return constants()->tag_at(initial_value_index()); 50 } 51 52 jint fieldDescriptor::int_initial_value() const { 53 return constants()->int_at(initial_value_index()); 54 } 55 56 jlong fieldDescriptor::long_initial_value() const { 57 return constants()->long_at(initial_value_index()); 58 } 59 60 jfloat fieldDescriptor::float_initial_value() const { 61 return constants()->float_at(initial_value_index()); 62 } 63 64 jdouble fieldDescriptor::double_initial_value() const { 65 return constants()->double_at(initial_value_index()); 66 } 67 68 oop fieldDescriptor::string_initial_value(TRAPS) const { 69 return constants()->string_at(initial_value_index(), CHECK_0); 70 } 71 72 void fieldDescriptor::initialize(klassOop k, int index) { 73 instanceKlass* ik = instanceKlass::cast(k); 74 _cp = ik->constants(); 75 FieldInfo* f = ik->field(index); 76 assert(!f->is_internal(), "regular Java fields only"); 77 78 _access_flags = accessFlags_from(f->access_flags()); 79 guarantee(f->name_index() != 0 && f->signature_index() != 0, "bad constant pool index for fieldDescriptor"); 80 _index = index; 81 } 82 83 #ifndef PRODUCT 84 85 void fieldDescriptor::print_on(outputStream* st) const { 86 access_flags().print_on(st); 87 name()->print_value_on(st); 88 st->print(" "); 89 signature()->print_value_on(st); 90 st->print(" @%d ", offset()); 91 if (WizardMode && has_initial_value()) { 92 st->print("(initval "); 93 constantTag t = initial_value_tag(); 94 if (t.is_int()) { 95 st->print("int %d)", int_initial_value()); 96 } else if (t.is_long()){ 97 st->print_jlong(long_initial_value()); 98 } else if (t.is_float()){ 99 st->print("float %f)", float_initial_value()); 100 } else if (t.is_double()){ 101 st->print("double %lf)", double_initial_value()); 102 } 103 } 104 } 105 106 void fieldDescriptor::print_on_for(outputStream* st, oop obj) { 107 print_on(st); 108 BasicType ft = field_type(); 109 jint as_int = 0; |