src/share/vm/ci/ciField.cpp
Index
Unified diffs
Context diffs
Sdiffs
Patch
New
Old
Previous File
Next File
*** old/src/share/vm/ci/ciField.cpp Fri Mar 18 14:59:11 2011
--- new/src/share/vm/ci/ciField.cpp Fri Mar 18 14:59:11 2011
*** 211,221 ****
--- 211,221 ----
// field to be not constant.
// 2. The field is a *special* static&final field whose value
// may change. The three examples are java.lang.System.in,
// java.lang.System.out, and java.lang.System.err.
! KlassHandle k = _holder->get_klassOop();
assert( SystemDictionary::System_klass() != NULL, "Check once per vm");
if( k() == SystemDictionary::System_klass() ) {
// Check offsets for case 2: System.in, System.out, or System.err
if( _offset == java_lang_System::in_offset_in_bytes() ||
_offset == java_lang_System::out_offset_in_bytes() ||
*** 223,262 ****
--- 223,264 ----
_is_constant = false;
return;
}
}
+ Handle mirror = k->java_mirror();
+
_is_constant = true;
switch(type()->basic_type()) {
case T_BYTE:
! _constant_value = ciConstant(type()->basic_type(), k->byte_field(_offset));
! _constant_value = ciConstant(type()->basic_type(), mirror->byte_field(_offset));
break;
case T_CHAR:
! _constant_value = ciConstant(type()->basic_type(), k->char_field(_offset));
! _constant_value = ciConstant(type()->basic_type(), mirror->char_field(_offset));
break;
case T_SHORT:
! _constant_value = ciConstant(type()->basic_type(), k->short_field(_offset));
! _constant_value = ciConstant(type()->basic_type(), mirror->short_field(_offset));
break;
case T_BOOLEAN:
! _constant_value = ciConstant(type()->basic_type(), k->bool_field(_offset));
! _constant_value = ciConstant(type()->basic_type(), mirror->bool_field(_offset));
break;
case T_INT:
! _constant_value = ciConstant(type()->basic_type(), k->int_field(_offset));
! _constant_value = ciConstant(type()->basic_type(), mirror->int_field(_offset));
break;
case T_FLOAT:
! _constant_value = ciConstant(k->float_field(_offset));
! _constant_value = ciConstant(mirror->float_field(_offset));
break;
case T_DOUBLE:
! _constant_value = ciConstant(k->double_field(_offset));
! _constant_value = ciConstant(mirror->double_field(_offset));
break;
case T_LONG:
! _constant_value = ciConstant(k->long_field(_offset));
! _constant_value = ciConstant(mirror->long_field(_offset));
break;
case T_OBJECT:
case T_ARRAY:
{
! oop o = k->obj_field(_offset);
! oop o = mirror->obj_field(_offset);
// A field will be "constant" if it is known always to be
// a non-null reference to an instance of a particular class,
// or to a particular array. This can happen even if the instance
// or array is not perm. In such a case, an "unloaded" ciArray
src/share/vm/ci/ciField.cpp
Index
Unified diffs
Context diffs
Sdiffs
Patch
New
Old
Previous File
Next File