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