src/share/vm/ci/ciField.cpp

changeset 1608
73b22f919c34
parent 1577
4ce7240d622c
child 1907
c18cbe5936b8
     1.1 --- a/src/share/vm/ci/ciField.cpp	Tue Jan 12 14:37:35 2010 -0800
     1.2 +++ b/src/share/vm/ci/ciField.cpp	Wed Jan 13 23:05:52 2010 -0800
     1.3 @@ -161,6 +161,18 @@
     1.4           "bootstrap classes must not create & cache unshared fields");
     1.5  }
     1.6  
     1.7 +static bool trust_final_non_static_fields(ciInstanceKlass* holder) {
     1.8 +  if (holder == NULL)
     1.9 +    return false;
    1.10 +  if (holder->name() == ciSymbol::java_lang_System())
    1.11 +    // Never trust strangely unstable finals:  System.out, etc.
    1.12 +    return false;
    1.13 +  // Even if general trusting is disabled, trust system-built closures in these packages.
    1.14 +  if (holder->is_in_package("java/dyn") || holder->is_in_package("sun/dyn"))
    1.15 +    return true;
    1.16 +  return TrustFinalNonStaticFields;
    1.17 +}
    1.18 +
    1.19  void ciField::initialize_from(fieldDescriptor* fd) {
    1.20    // Get the flags, offset, and canonical holder of the field.
    1.21    _flags = ciFlags(fd->access_flags());
    1.22 @@ -172,7 +184,7 @@
    1.23      if (!this->is_static()) {
    1.24        // A field can be constant if it's a final static field or if it's
    1.25        // a final non-static field of a trusted class ({java,sun}.dyn).
    1.26 -      if (_holder->is_in_package("java/dyn") || _holder->is_in_package("sun/dyn")) {
    1.27 +      if (trust_final_non_static_fields(_holder)) {
    1.28          _is_constant = true;
    1.29          return;
    1.30        }

mercurial