129 // 1. The field is both static and final |
129 // 1. The field is both static and final |
130 // 2. The field is not one of the special static/final |
130 // 2. The field is not one of the special static/final |
131 // non-constant fields. These are java.lang.System.in |
131 // non-constant fields. These are java.lang.System.in |
132 // and java.lang.System.out. Abomination. |
132 // and java.lang.System.out. Abomination. |
133 // |
133 // |
134 // A field is also considered constant if it is marked @Stable |
134 // A field is also considered constant if |
135 // and is non-null (or non-zero, if a primitive). |
135 // - it is marked @Stable and is non-null (or non-zero, if a primitive) or |
|
136 // - it is trusted or |
|
137 // - it is the target field of a CallSite object. |
|
138 // |
|
139 // See ciField::initialize_from() for more details. |
136 // |
140 // |
137 // A user should also check the field value (constant_value().is_valid()), since |
141 // A user should also check the field value (constant_value().is_valid()), since |
138 // constant fields of non-initialized classes don't have values yet. |
142 // constant fields of non-initialized classes don't have values yet. |
139 bool is_constant() const { return _is_constant; } |
143 bool is_constant() const { return _is_constant; } |
140 |
144 |
148 // Get the constant value of non-static final field in the given |
152 // Get the constant value of non-static final field in the given |
149 // object. |
153 // object. |
150 ciConstant constant_value_of(ciObject* object); |
154 ciConstant constant_value_of(ciObject* object); |
151 |
155 |
152 // Check for link time errors. Accessing a field from a |
156 // Check for link time errors. Accessing a field from a |
153 // certain class via a certain bytecode may or may not be legal. |
157 // certain method via a certain bytecode may or may not be legal. |
154 // This call checks to see if an exception may be raised by |
158 // This call checks to see if an exception may be raised by |
155 // an access of this field. |
159 // an access of this field. |
156 // |
160 // |
157 // Usage note: if the same field is accessed multiple times |
161 // Usage note: if the same field is accessed multiple times |
158 // in the same compilation, will_link will need to be checked |
162 // in the same compilation, will_link will need to be checked |
159 // at each point of access. |
163 // at each point of access. |
160 bool will_link(ciInstanceKlass* accessing_klass, |
164 bool will_link(ciMethod* accessing_method, |
161 Bytecodes::Code bc); |
165 Bytecodes::Code bc); |
162 |
166 |
163 // Java access flags |
167 // Java access flags |
164 bool is_public () const { return flags().is_public(); } |
168 bool is_public () const { return flags().is_public(); } |
165 bool is_private () const { return flags().is_private(); } |
169 bool is_private () const { return flags().is_private(); } |
166 bool is_protected () const { return flags().is_protected(); } |
170 bool is_protected () const { return flags().is_protected(); } |
167 bool is_static () const { return flags().is_static(); } |
171 bool is_static () const { return flags().is_static(); } |
168 bool is_final () const { return flags().is_final(); } |
172 bool is_final () const { return flags().is_final(); } |
169 bool is_stable () const { return flags().is_stable(); } |
173 bool is_stable () const { return flags().is_stable(); } |
170 bool is_volatile () const { return flags().is_volatile(); } |
174 bool is_volatile () const { return flags().is_volatile(); } |
171 bool is_transient () const { return flags().is_transient(); } |
175 bool is_transient () const { return flags().is_transient(); } |
|
176 // The field is modified outside of instance initializer methods |
|
177 // (or class/initializer methods if the field is static). |
|
178 bool has_initialized_final_update() const { return flags().has_initialized_final_update(); } |
172 |
179 |
173 bool is_call_site_target() { |
180 bool is_call_site_target() { |
174 ciInstanceKlass* callsite_klass = CURRENT_ENV->CallSite_klass(); |
181 ciInstanceKlass* callsite_klass = CURRENT_ENV->CallSite_klass(); |
175 if (callsite_klass == NULL) |
182 if (callsite_klass == NULL) |
176 return false; |
183 return false; |