hotspot/src/share/vm/ci/ciField.cpp
changeset 8725 8c1e3dd5fe1b
parent 8676 9098d4e927e1
child 10008 d84de97ad847
equal deleted inserted replaced
8724:693c6b883b54 8725:8c1e3dd5fe1b
   211     //    field to be not constant.
   211     //    field to be not constant.
   212     // 2. The field is a *special* static&final field whose value
   212     // 2. The field is a *special* static&final field whose value
   213     //    may change.  The three examples are java.lang.System.in,
   213     //    may change.  The three examples are java.lang.System.in,
   214     //    java.lang.System.out, and java.lang.System.err.
   214     //    java.lang.System.out, and java.lang.System.err.
   215 
   215 
   216     Handle k = _holder->get_klassOop();
   216     KlassHandle k = _holder->get_klassOop();
   217     assert( SystemDictionary::System_klass() != NULL, "Check once per vm");
   217     assert( SystemDictionary::System_klass() != NULL, "Check once per vm");
   218     if( k() == SystemDictionary::System_klass() ) {
   218     if( k() == SystemDictionary::System_klass() ) {
   219       // Check offsets for case 2: System.in, System.out, or System.err
   219       // Check offsets for case 2: System.in, System.out, or System.err
   220       if( _offset == java_lang_System::in_offset_in_bytes()  ||
   220       if( _offset == java_lang_System::in_offset_in_bytes()  ||
   221           _offset == java_lang_System::out_offset_in_bytes() ||
   221           _offset == java_lang_System::out_offset_in_bytes() ||
   223         _is_constant = false;
   223         _is_constant = false;
   224         return;
   224         return;
   225       }
   225       }
   226     }
   226     }
   227 
   227 
       
   228     Handle mirror = k->java_mirror();
       
   229 
   228     _is_constant = true;
   230     _is_constant = true;
   229     switch(type()->basic_type()) {
   231     switch(type()->basic_type()) {
   230     case T_BYTE:
   232     case T_BYTE:
   231       _constant_value = ciConstant(type()->basic_type(), k->byte_field(_offset));
   233       _constant_value = ciConstant(type()->basic_type(), mirror->byte_field(_offset));
   232       break;
   234       break;
   233     case T_CHAR:
   235     case T_CHAR:
   234       _constant_value = ciConstant(type()->basic_type(), k->char_field(_offset));
   236       _constant_value = ciConstant(type()->basic_type(), mirror->char_field(_offset));
   235       break;
   237       break;
   236     case T_SHORT:
   238     case T_SHORT:
   237       _constant_value = ciConstant(type()->basic_type(), k->short_field(_offset));
   239       _constant_value = ciConstant(type()->basic_type(), mirror->short_field(_offset));
   238       break;
   240       break;
   239     case T_BOOLEAN:
   241     case T_BOOLEAN:
   240       _constant_value = ciConstant(type()->basic_type(), k->bool_field(_offset));
   242       _constant_value = ciConstant(type()->basic_type(), mirror->bool_field(_offset));
   241       break;
   243       break;
   242     case T_INT:
   244     case T_INT:
   243       _constant_value = ciConstant(type()->basic_type(), k->int_field(_offset));
   245       _constant_value = ciConstant(type()->basic_type(), mirror->int_field(_offset));
   244       break;
   246       break;
   245     case T_FLOAT:
   247     case T_FLOAT:
   246       _constant_value = ciConstant(k->float_field(_offset));
   248       _constant_value = ciConstant(mirror->float_field(_offset));
   247       break;
   249       break;
   248     case T_DOUBLE:
   250     case T_DOUBLE:
   249       _constant_value = ciConstant(k->double_field(_offset));
   251       _constant_value = ciConstant(mirror->double_field(_offset));
   250       break;
   252       break;
   251     case T_LONG:
   253     case T_LONG:
   252       _constant_value = ciConstant(k->long_field(_offset));
   254       _constant_value = ciConstant(mirror->long_field(_offset));
   253       break;
   255       break;
   254     case T_OBJECT:
   256     case T_OBJECT:
   255     case T_ARRAY:
   257     case T_ARRAY:
   256       {
   258       {
   257         oop o = k->obj_field(_offset);
   259         oop o = mirror->obj_field(_offset);
   258 
   260 
   259         // A field will be "constant" if it is known always to be
   261         // A field will be "constant" if it is known always to be
   260         // a non-null reference to an instance of a particular class,
   262         // a non-null reference to an instance of a particular class,
   261         // or to a particular array.  This can happen even if the instance
   263         // or to a particular array.  This can happen even if the instance
   262         // or array is not perm.  In such a case, an "unloaded" ciArray
   264         // or array is not perm.  In such a case, an "unloaded" ciArray