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 }