Mercurial > hg > graal-jvmci-8
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; |