comparison jvmci/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotConstantReflectionProvider.java @ 22760:4cf1946f59fc

must not fold accesses to @Stable fields if -XX:-FoldStableValues (GRAAL-58)
author Doug Simon <doug.simon@oracle.com>
date Sat, 26 Dec 2015 15:00:55 +0100
parents a130b51efb07
children 87394b31a42e
comparison
equal deleted inserted replaced
22759:577a4a8caa72 22760:4cf1946f59fc
236 /** 236 /**
237 * Determines if a static field is constant for the purpose of 237 * Determines if a static field is constant for the purpose of
238 * {@link #readConstantFieldValue(ResolvedJavaField, JavaConstant)}. 238 * {@link #readConstantFieldValue(ResolvedJavaField, JavaConstant)}.
239 */ 239 */
240 protected boolean isStaticFieldConstant(HotSpotResolvedJavaField staticField) { 240 protected boolean isStaticFieldConstant(HotSpotResolvedJavaField staticField) {
241 if (staticField.isFinal() || staticField.isStable()) { 241 if (staticField.isFinal() || (staticField.isStable() && runtime.getConfig().foldStableValues)) {
242 ResolvedJavaType holder = staticField.getDeclaringClass(); 242 ResolvedJavaType holder = staticField.getDeclaringClass();
243 if (holder.isInitialized() && !holder.getName().equals(SystemClassName)) { 243 if (holder.isInitialized() && !holder.getName().equals(SystemClassName)) {
244 return true; 244 return true;
245 } 245 }
246 } 246 }
300 JavaConstant value = readFieldValue(field, receiver); 300 JavaConstant value = readFieldValue(field, receiver);
301 if (isFinalInstanceFieldValueConstant(value, object.getClass())) { 301 if (isFinalInstanceFieldValueConstant(value, object.getClass())) {
302 return value; 302 return value;
303 } 303 }
304 } 304 }
305 } else if (hotspotField.isStable()) { 305 } else if (hotspotField.isStable() && runtime.getConfig().foldStableValues) {
306 if (hotspotField.isInObject(object)) { 306 if (hotspotField.isInObject(object)) {
307 JavaConstant value = readFieldValue(field, receiver); 307 JavaConstant value = readFieldValue(field, receiver);
308 if (isStableInstanceFieldValueConstant(value, object.getClass())) { 308 if (isStableInstanceFieldValueConstant(value, object.getClass())) {
309 return value; 309 return value;
310 } 310 }
317 317
318 public JavaConstant readFieldValue(ResolvedJavaField field, JavaConstant receiver) { 318 public JavaConstant readFieldValue(ResolvedJavaField field, JavaConstant receiver) {
319 HotSpotResolvedJavaField hotspotField = (HotSpotResolvedJavaField) field; 319 HotSpotResolvedJavaField hotspotField = (HotSpotResolvedJavaField) field;
320 if (!hotspotField.isStable()) { 320 if (!hotspotField.isStable()) {
321 return readNonStableFieldValue(field, receiver); 321 return readNonStableFieldValue(field, receiver);
322 } else { 322 } else if (runtime.getConfig().foldStableValues) {
323 return readStableFieldValue(field, receiver, hotspotField.isDefaultStable()); 323 return readStableFieldValue(field, receiver, hotspotField.isDefaultStable());
324 } else {
325 return null;
324 } 326 }
325 } 327 }
326 328
327 private JavaConstant readNonStableFieldValue(ResolvedJavaField field, JavaConstant receiver) { 329 private JavaConstant readNonStableFieldValue(ResolvedJavaField field, JavaConstant receiver) {
328 HotSpotResolvedJavaField hotspotField = (HotSpotResolvedJavaField) field; 330 HotSpotResolvedJavaField hotspotField = (HotSpotResolvedJavaField) field;