@@ -316,13 +316,14 @@ public JavaConstant readValue(MetaAccessProvider metaAccess, JavaConstant receiv
316316 private JavaConstant computeValue (MetaAccessProvider metaAccess , JavaConstant receiver ) {
317317 SnippetReflectionProvider originalSnippetReflection = GraalAccess .getOriginalSnippetReflection ();
318318 JavaConstant result ;
319+ Object originalValue ;
319320 switch (kind ) {
321+ case NewInstanceWhenNotNull :
322+ originalValue = fetchOriginalValue (metaAccess , receiver , originalSnippetReflection );
323+ result = originalValue == null ? originalSnippetReflection .forObject (null ) : createNewInstance (originalSnippetReflection );
324+ break ;
320325 case NewInstance :
321- try {
322- result = originalSnippetReflection .forObject (ReflectionUtil .newInstance (targetClass ));
323- } catch (ReflectionUtilError ex ) {
324- throw VMError .shouldNotReachHere ("Error performing field recomputation for alias " + annotated .format ("%H.%n" ), ex .getCause ());
325- }
326+ result = createNewInstance (originalSnippetReflection );
326327 break ;
327328 case AtomicFieldUpdaterOffset :
328329 result = computeAtomicFieldUpdaterOffset (metaAccess , receiver );
@@ -336,13 +337,7 @@ private JavaConstant computeValue(MetaAccessProvider metaAccess, JavaConstant re
336337 if (customValueProvider instanceof CustomFieldValueComputer ) {
337338 newValue = ((CustomFieldValueComputer ) customValueProvider ).compute (metaAccess , original , annotated , receiverValue );
338339 } else if (customValueProvider instanceof CustomFieldValueTransformer ) {
339- JavaConstant originalValueConstant = ReadableJavaField .readFieldValue (metaAccess , GraalAccess .getOriginalProviders ().getConstantReflection (), original , receiver );
340- Object originalValue ;
341- if (originalValueConstant .getJavaKind ().isPrimitive ()) {
342- originalValue = originalValueConstant .asBoxedPrimitive ();
343- } else {
344- originalValue = originalSnippetReflection .asObject (Object .class , originalValueConstant );
345- }
340+ originalValue = fetchOriginalValue (metaAccess , receiver , originalSnippetReflection );
346341 newValue = ((CustomFieldValueTransformer ) customValueProvider ).transform (metaAccess , original , annotated , receiverValue , originalValue );
347342 } else {
348343 throw UserError .abort ("The custom field value computer class %s does not implement %s or %s" , targetClass .getName (),
@@ -360,6 +355,27 @@ private JavaConstant computeValue(MetaAccessProvider metaAccess, JavaConstant re
360355 return result ;
361356 }
362357
358+ private JavaConstant createNewInstance (SnippetReflectionProvider originalSnippetReflection ) {
359+ JavaConstant result ;
360+ try {
361+ result = originalSnippetReflection .forObject (ReflectionUtil .newInstance (targetClass ));
362+ } catch (ReflectionUtilError ex ) {
363+ throw VMError .shouldNotReachHere ("Error performing field recomputation for alias " + annotated .format ("%H.%n" ), ex .getCause ());
364+ }
365+ return result ;
366+ }
367+
368+ private Object fetchOriginalValue (MetaAccessProvider metaAccess , JavaConstant receiver , SnippetReflectionProvider originalSnippetReflection ) {
369+ JavaConstant originalValueConstant = ReadableJavaField .readFieldValue (metaAccess , GraalAccess .getOriginalProviders ().getConstantReflection (), original , receiver );
370+ Object originalValue ;
371+ if (originalValueConstant .getJavaKind ().isPrimitive ()) {
372+ originalValue = originalValueConstant .asBoxedPrimitive ();
373+ } else {
374+ originalValue = originalSnippetReflection .asObject (Object .class , originalValueConstant );
375+ }
376+ return originalValue ;
377+ }
378+
363379 private void putCached (JavaConstant receiver , JavaConstant result ) {
364380 if (disableCaching ) {
365381 return ;
0 commit comments