204 } else {
205 _type = ciType::make(field_type);
206 }
207
208 initialize_from(fd);
209
210 // Either (a) it is marked shared, or else (b) we are done bootstrapping.
211 assert(is_shared() || ciObjectFactory::is_initialized(),
212 "bootstrap classes must not create & cache unshared fields");
213 }
214
215 static bool trust_final_non_static_fields(ciInstanceKlass* holder) {
216 if (holder == NULL)
217 return false;
218 if (holder->name() == ciSymbol::java_lang_System())
219 // Never trust strangely unstable finals: System.out, etc.
220 return false;
221 // Even if general trusting is disabled, trust system-built closures in these packages.
222 if (holder->is_in_package("java/lang/invoke") || holder->is_in_package("sun/invoke") ||
223 holder->is_in_package("jdk/internal/foreign") || holder->is_in_package("jdk/incubator/foreign") ||
224 holder->is_in_package("java/lang"))
225 return true;
226 // Trust VM unsafe anonymous classes. They are private API (jdk.internal.misc.Unsafe)
227 // and can't be serialized, so there is no hacking of finals going on with them.
228 if (holder->is_unsafe_anonymous())
229 return true;
230 // Trust final fields in all boxed classes
231 if (holder->is_box_klass())
232 return true;
233 // Trust final fields in String
234 if (holder->name() == ciSymbol::java_lang_String())
235 return true;
236 // Trust Atomic*FieldUpdaters: they are very important for performance, and make up one
237 // more reason not to use Unsafe, if their final fields are trusted. See more in JDK-8140483.
238 if (holder->name() == ciSymbol::java_util_concurrent_atomic_AtomicIntegerFieldUpdater_Impl() ||
239 holder->name() == ciSymbol::java_util_concurrent_atomic_AtomicLongFieldUpdater_CASUpdater() ||
240 holder->name() == ciSymbol::java_util_concurrent_atomic_AtomicLongFieldUpdater_LockedUpdater() ||
241 holder->name() == ciSymbol::java_util_concurrent_atomic_AtomicReferenceFieldUpdater_Impl()) {
242 return true;
243 }
|
204 } else {
205 _type = ciType::make(field_type);
206 }
207
208 initialize_from(fd);
209
210 // Either (a) it is marked shared, or else (b) we are done bootstrapping.
211 assert(is_shared() || ciObjectFactory::is_initialized(),
212 "bootstrap classes must not create & cache unshared fields");
213 }
214
215 static bool trust_final_non_static_fields(ciInstanceKlass* holder) {
216 if (holder == NULL)
217 return false;
218 if (holder->name() == ciSymbol::java_lang_System())
219 // Never trust strangely unstable finals: System.out, etc.
220 return false;
221 // Even if general trusting is disabled, trust system-built closures in these packages.
222 if (holder->is_in_package("java/lang/invoke") || holder->is_in_package("sun/invoke") ||
223 holder->is_in_package("jdk/internal/foreign") || holder->is_in_package("jdk/incubator/foreign") ||
224 holder->is_in_package("jdk/internal/vm/vector") || holder->is_in_package("jdk/incubator/vector") ||
225 holder->is_in_package("java/lang"))
226 return true;
227 // Trust VM unsafe anonymous classes. They are private API (jdk.internal.misc.Unsafe)
228 // and can't be serialized, so there is no hacking of finals going on with them.
229 if (holder->is_unsafe_anonymous())
230 return true;
231 // Trust final fields in all boxed classes
232 if (holder->is_box_klass())
233 return true;
234 // Trust final fields in String
235 if (holder->name() == ciSymbol::java_lang_String())
236 return true;
237 // Trust Atomic*FieldUpdaters: they are very important for performance, and make up one
238 // more reason not to use Unsafe, if their final fields are trusted. See more in JDK-8140483.
239 if (holder->name() == ciSymbol::java_util_concurrent_atomic_AtomicIntegerFieldUpdater_Impl() ||
240 holder->name() == ciSymbol::java_util_concurrent_atomic_AtomicLongFieldUpdater_CASUpdater() ||
241 holder->name() == ciSymbol::java_util_concurrent_atomic_AtomicLongFieldUpdater_LockedUpdater() ||
242 holder->name() == ciSymbol::java_util_concurrent_atomic_AtomicReferenceFieldUpdater_Impl()) {
243 return true;
244 }
|