equal
deleted
inserted
replaced
187 _flags = ciFlags(fd->access_flags()); |
187 _flags = ciFlags(fd->access_flags()); |
188 _offset = fd->offset(); |
188 _offset = fd->offset(); |
189 _holder = CURRENT_ENV->get_instance_klass(fd->field_holder()); |
189 _holder = CURRENT_ENV->get_instance_klass(fd->field_holder()); |
190 |
190 |
191 // Check to see if the field is constant. |
191 // Check to see if the field is constant. |
192 if (_holder->is_initialized() && this->is_final()) { |
192 bool is_final = this->is_final(); |
|
193 bool is_stable = FoldStableValues && this->is_stable(); |
|
194 if (_holder->is_initialized() && (is_final || is_stable)) { |
193 if (!this->is_static()) { |
195 if (!this->is_static()) { |
194 // A field can be constant if it's a final static field or if |
196 // A field can be constant if it's a final static field or if |
195 // it's a final non-static field of a trusted class (classes in |
197 // it's a final non-static field of a trusted class (classes in |
196 // java.lang.invoke and sun.invoke packages and subpackages). |
198 // java.lang.invoke and sun.invoke packages and subpackages). |
197 if (trust_final_non_static_fields(_holder)) { |
199 if (is_stable || trust_final_non_static_fields(_holder)) { |
198 _is_constant = true; |
200 _is_constant = true; |
199 return; |
201 return; |
200 } |
202 } |
201 _is_constant = false; |
203 _is_constant = false; |
202 return; |
204 return; |
225 } |
227 } |
226 } |
228 } |
227 |
229 |
228 Handle mirror = k->java_mirror(); |
230 Handle mirror = k->java_mirror(); |
229 |
231 |
230 _is_constant = true; |
|
231 switch(type()->basic_type()) { |
232 switch(type()->basic_type()) { |
232 case T_BYTE: |
233 case T_BYTE: |
233 _constant_value = ciConstant(type()->basic_type(), mirror->byte_field(_offset)); |
234 _constant_value = ciConstant(type()->basic_type(), mirror->byte_field(_offset)); |
234 break; |
235 break; |
235 case T_CHAR: |
236 case T_CHAR: |
270 } else { |
271 } else { |
271 _constant_value = ciConstant(type()->basic_type(), CURRENT_ENV->get_object(o)); |
272 _constant_value = ciConstant(type()->basic_type(), CURRENT_ENV->get_object(o)); |
272 assert(_constant_value.as_object() == CURRENT_ENV->get_object(o), "check interning"); |
273 assert(_constant_value.as_object() == CURRENT_ENV->get_object(o), "check interning"); |
273 } |
274 } |
274 } |
275 } |
|
276 } |
|
277 if (is_stable && _constant_value.is_null_or_zero()) { |
|
278 // It is not a constant after all; treat it as uninitialized. |
|
279 _is_constant = false; |
|
280 } else { |
|
281 _is_constant = true; |
275 } |
282 } |
276 } else { |
283 } else { |
277 _is_constant = false; |
284 _is_constant = false; |
278 } |
285 } |
279 } |
286 } |
371 tty->print("."); |
378 tty->print("."); |
372 _name->print_symbol(); |
379 _name->print_symbol(); |
373 tty->print(" signature="); |
380 tty->print(" signature="); |
374 _signature->print_symbol(); |
381 _signature->print_symbol(); |
375 tty->print(" offset=%d type=", _offset); |
382 tty->print(" offset=%d type=", _offset); |
376 if (_type != NULL) _type->print_name(); |
383 if (_type != NULL) |
377 else tty->print("(reference)"); |
384 _type->print_name(); |
|
385 else |
|
386 tty->print("(reference)"); |
|
387 tty->print(" flags=%04x", flags().as_int()); |
378 tty->print(" is_constant=%s", bool_to_str(_is_constant)); |
388 tty->print(" is_constant=%s", bool_to_str(_is_constant)); |
379 if (_is_constant && is_static()) { |
389 if (_is_constant && is_static()) { |
380 tty->print(" constant_value="); |
390 tty->print(" constant_value="); |
381 _constant_value.print(); |
391 _constant_value.print(); |
382 } |
392 } |