hotspot/src/share/vm/ci/ciField.cpp
changeset 19770 7cb9f982ea81
parent 14828 bb9dffedf46c
child 20017 81eba62e9048
equal deleted inserted replaced
19768:239cc27c7524 19770:7cb9f982ea81
   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   }