hotspot/src/share/vm/ci/ciField.hpp
changeset 39421 a9652c919db8
parent 38030 93f24e7b3c43
equal deleted inserted replaced
39420:987528901b83 39421:a9652c919db8
    46   ciSymbol*        _name;
    46   ciSymbol*        _name;
    47   ciSymbol*        _signature;
    47   ciSymbol*        _signature;
    48   ciType*          _type;
    48   ciType*          _type;
    49   int              _offset;
    49   int              _offset;
    50   bool             _is_constant;
    50   bool             _is_constant;
    51   ciInstanceKlass* _known_to_link_with_put;
    51   ciMethod*        _known_to_link_with_put;
    52   ciInstanceKlass* _known_to_link_with_get;
    52   ciInstanceKlass* _known_to_link_with_get;
    53   ciConstant       _constant_value;
    53   ciConstant       _constant_value;
    54 
    54 
    55   ciType* compute_type();
    55   ciType* compute_type();
    56   ciType* compute_type_impl();
    56   ciType* compute_type_impl();
   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;