fieldDescriptor.hpp revision 3602:da91efe96a93
1262925Simp/* 2262925Simp * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. 3262925Simp * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4262925Simp * 5262925Simp * This code is free software; you can redistribute it and/or modify it 6262925Simp * under the terms of the GNU General Public License version 2 only, as 7262925Simp * published by the Free Software Foundation. 8262925Simp * 9262925Simp * This code is distributed in the hope that it will be useful, but WITHOUT 10262925Simp * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11262925Simp * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12262925Simp * version 2 for more details (a copy is included in the LICENSE file that 13262925Simp * accompanied this code). 14262925Simp * 15262925Simp * You should have received a copy of the GNU General Public License version 16262925Simp * 2 along with this work; if not, write to the Free Software Foundation, 17262925Simp * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18262925Simp * 19262925Simp * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20262925Simp * or visit www.oracle.com if you need additional information or have any 21262925Simp * questions. 22262925Simp * 23262925Simp */ 24262925Simp 25262925Simp#ifndef SHARE_VM_RUNTIME_FIELDDESCRIPTOR_HPP 26262925Simp#define SHARE_VM_RUNTIME_FIELDDESCRIPTOR_HPP 27262925Simp 28262925Simp#include "oops/constantPool.hpp" 29262925Simp#include "oops/symbol.hpp" 30262925Simp#include "runtime/fieldType.hpp" 31262925Simp#include "utilities/accessFlags.hpp" 32262925Simp#include "utilities/constantTag.hpp" 33262925Simp 34262925Simp// A fieldDescriptor describes the attributes of a single field (instance or class variable). 35262925Simp// It needs the class constant pool to work (because it only holds indices into the pool 36262925Simp// rather than the actual info). 37262925Simp 38262925Simpclass fieldDescriptor VALUE_OBJ_CLASS_SPEC { 39271398Sandrew private: 40262925Simp AccessFlags _access_flags; 41262925Simp int _index; // the field index 42262925Simp constantPoolHandle _cp; 43262925Simp 44262925Simp // update the access_flags for the field in the klass 45262925Simp void update_klass_field_access_flag() { 46262925Simp InstanceKlass* ik = InstanceKlass::cast(field_holder()); 47262925Simp ik->field(index())->set_access_flags(_access_flags.as_short()); 48262925Simp } 49262925Simp 50262925Simp FieldInfo* field() const { 51262925Simp InstanceKlass* ik = InstanceKlass::cast(field_holder()); 52262925Simp return ik->field(_index); 53262925Simp } 54262925Simp 55262925Simp public: 56262925Simp Symbol* name() const { 57262925Simp return field()->name(_cp); 58262925Simp } 59262925Simp Symbol* signature() const { 60262925Simp return field()->signature(_cp); 61262925Simp } 62262925Simp Klass* field_holder() const { return _cp->pool_holder(); } 63262925Simp ConstantPool* constants() const { return _cp(); } 64262925Simp AccessFlags access_flags() const { return _access_flags; } 65262925Simp oop loader() const; 66262925Simp // Offset (in words) of field from start of instanceOop / Klass* 67262925Simp int offset() const { return field()->offset(); } 68262925Simp Symbol* generic_signature() const; 69262925Simp int index() const { return _index; } 70262925Simp AnnotationArray* annotations() const; 71262925Simp 72262925Simp // Initial field value 73262925Simp bool has_initial_value() const { return field()->initval_index() != 0; } 74262925Simp int initial_value_index() const { return field()->initval_index(); } 75262925Simp constantTag initial_value_tag() const; // The tag will return true on one of is_int(), is_long(), is_single(), is_double() 76262925Simp jint int_initial_value() const; 77262925Simp jlong long_initial_value() const; 78262925Simp jfloat float_initial_value() const; 79262925Simp jdouble double_initial_value() const; 80262925Simp oop string_initial_value(TRAPS) const; 81262925Simp 82262925Simp // Field signature type 83262925Simp BasicType field_type() const { return FieldType::basic_type(signature()); } 84262925Simp 85262925Simp // Access flags 86262925Simp bool is_public() const { return access_flags().is_public(); } 87262925Simp bool is_private() const { return access_flags().is_private(); } 88262925Simp bool is_protected() const { return access_flags().is_protected(); } 89262925Simp bool is_package_private() const { return !is_public() && !is_private() && !is_protected(); } 90262925Simp 91262925Simp bool is_static() const { return access_flags().is_static(); } 92262925Simp bool is_final() const { return access_flags().is_final(); } 93262925Simp bool is_volatile() const { return access_flags().is_volatile(); } 94262925Simp bool is_transient() const { return access_flags().is_transient(); } 95262925Simp 96262925Simp bool is_synthetic() const { return access_flags().is_synthetic(); } 97262925Simp 98262925Simp bool is_field_access_watched() const { return access_flags().is_field_access_watched(); } 99262925Simp bool is_field_modification_watched() const 100262925Simp { return access_flags().is_field_modification_watched(); } 101262925Simp bool has_generic_signature() const { return access_flags().field_has_generic_signature(); } 102262925Simp 103262925Simp void set_is_field_access_watched(const bool value) { 104262925Simp _access_flags.set_is_field_access_watched(value); 105262925Simp update_klass_field_access_flag(); 106262925Simp } 107262925Simp 108262925Simp void set_is_field_modification_watched(const bool value) { 109262925Simp _access_flags.set_is_field_modification_watched(value); 110262925Simp update_klass_field_access_flag(); 111262925Simp } 112262925Simp 113262925Simp // Initialization 114262925Simp void initialize(InstanceKlass* ik, int index); 115262925Simp 116262925Simp // Print 117262925Simp void print() { print_on(tty); } 118262925Simp void print_on(outputStream* st) const PRODUCT_RETURN; 119262925Simp void print_on_for(outputStream* st, oop obj) PRODUCT_RETURN; 120262925Simp}; 121262925Simp 122262925Simp#endif // SHARE_VM_RUNTIME_FIELDDESCRIPTOR_HPP 123262925Simp