@@ -336,7 +336,7 @@ public static WordBase getFieldWord(Object obj, InterpreterResolvedJavaField wor
336336 public static boolean getFieldBoolean (Object obj , InterpreterResolvedJavaField field ) {
337337 assert obj != null ;
338338 if (field .isUnmaterializedConstant ()) {
339- return field . getUnmaterializedConstant ().asBoolean ();
339+ return getUnmaterializedConstant (field ).asBoolean ();
340340 }
341341 if (field .isVolatile ()) {
342342 return U .getBooleanVolatile (obj , field .getOffset ());
@@ -348,7 +348,7 @@ public static boolean getFieldBoolean(Object obj, InterpreterResolvedJavaField f
348348 public static int getFieldInt (Object obj , InterpreterResolvedJavaField field ) {
349349 assert obj != null ;
350350 if (field .isUnmaterializedConstant ()) {
351- return field . getUnmaterializedConstant ().asInt ();
351+ return getUnmaterializedConstant (field ).asInt ();
352352 }
353353 if (field .isVolatile ()) {
354354 return U .getIntVolatile (obj , field .getOffset ());
@@ -360,7 +360,7 @@ public static int getFieldInt(Object obj, InterpreterResolvedJavaField field) {
360360 public static long getFieldLong (Object obj , InterpreterResolvedJavaField field ) {
361361 assert obj != null ;
362362 if (field .isUnmaterializedConstant ()) {
363- return field . getUnmaterializedConstant ().asLong ();
363+ return getUnmaterializedConstant (field ).asLong ();
364364 }
365365 if (field .isVolatile ()) {
366366 return U .getLongVolatile (obj , field .getOffset ());
@@ -372,7 +372,7 @@ public static long getFieldLong(Object obj, InterpreterResolvedJavaField field)
372372 public static byte getFieldByte (Object obj , InterpreterResolvedJavaField field ) {
373373 assert obj != null ;
374374 if (field .isUnmaterializedConstant ()) {
375- return (byte ) field . getUnmaterializedConstant ().asInt ();
375+ return (byte ) getUnmaterializedConstant (field ).asInt ();
376376 }
377377 if (field .isVolatile ()) {
378378 return U .getByteVolatile (obj , field .getOffset ());
@@ -384,7 +384,7 @@ public static byte getFieldByte(Object obj, InterpreterResolvedJavaField field)
384384 public static short getFieldShort (Object obj , InterpreterResolvedJavaField field ) {
385385 assert obj != null ;
386386 if (field .isUnmaterializedConstant ()) {
387- return (short ) field . getUnmaterializedConstant ().asInt ();
387+ return (short ) getUnmaterializedConstant (field ).asInt ();
388388 }
389389 if (field .isVolatile ()) {
390390 return U .getShortVolatile (obj , field .getOffset ());
@@ -396,7 +396,7 @@ public static short getFieldShort(Object obj, InterpreterResolvedJavaField field
396396 public static float getFieldFloat (Object obj , InterpreterResolvedJavaField field ) {
397397 assert obj != null ;
398398 if (field .isUnmaterializedConstant ()) {
399- return field . getUnmaterializedConstant ().asFloat ();
399+ return getUnmaterializedConstant (field ).asFloat ();
400400 }
401401 if (field .isVolatile ()) {
402402 return U .getFloatVolatile (obj , field .getOffset ());
@@ -408,7 +408,7 @@ public static float getFieldFloat(Object obj, InterpreterResolvedJavaField field
408408 public static double getFieldDouble (Object obj , InterpreterResolvedJavaField field ) {
409409 assert obj != null ;
410410 if (field .isUnmaterializedConstant ()) {
411- return field . getUnmaterializedConstant ().asDouble ();
411+ return getUnmaterializedConstant (field ).asDouble ();
412412 }
413413 if (field .isVolatile ()) {
414414 return U .getDoubleVolatile (obj , field .getOffset ());
@@ -420,7 +420,7 @@ public static double getFieldDouble(Object obj, InterpreterResolvedJavaField fie
420420 public static Object getFieldObject (Object obj , InterpreterResolvedJavaField field ) {
421421 assert obj != null ;
422422 if (field .isUnmaterializedConstant ()) {
423- JavaConstant constant = field . getUnmaterializedConstant ();
423+ JavaConstant constant = getUnmaterializedConstant (field );
424424 if (JavaConstant .NULL_POINTER .equals (constant )) {
425425 return null ;
426426 }
@@ -438,7 +438,7 @@ public static Object getFieldObject(Object obj, InterpreterResolvedJavaField fie
438438 public static char getFieldChar (Object obj , InterpreterResolvedJavaField field ) {
439439 assert obj != null ;
440440 if (field .isUnmaterializedConstant ()) {
441- return (char ) field . getUnmaterializedConstant ().asInt ();
441+ return (char ) getUnmaterializedConstant (field ).asInt ();
442442 }
443443 if (field .isVolatile ()) {
444444 return U .getCharVolatile (obj , field .getOffset ());
@@ -447,7 +447,17 @@ public static char getFieldChar(Object obj, InterpreterResolvedJavaField field)
447447 }
448448 }
449449
450+ private static JavaConstant getUnmaterializedConstant (InterpreterResolvedJavaField field ) {
451+ JavaConstant constant = field .getUnmaterializedConstant ();
452+ if (constant == null ) {
453+ throw VMError .shouldNotReachHere ("Cannot load unmaterialized field " + field );
454+ }
455+ return constant ;
456+ }
457+
450458 public static void setFieldBoolean (boolean value , Object obj , InterpreterResolvedJavaField field ) {
459+ assert obj != null ;
460+ ensureMaterialized (field );
451461 if (field .isVolatile ()) {
452462 U .putBooleanVolatile (obj , field .getOffset (), value );
453463 } else {
@@ -457,6 +467,7 @@ public static void setFieldBoolean(boolean value, Object obj, InterpreterResolve
457467
458468 public static void setFieldByte (byte value , Object obj , InterpreterResolvedJavaField field ) {
459469 assert obj != null ;
470+ ensureMaterialized (field );
460471 if (field .isVolatile ()) {
461472 U .putByteVolatile (obj , field .getOffset (), value );
462473 } else {
@@ -466,6 +477,7 @@ public static void setFieldByte(byte value, Object obj, InterpreterResolvedJavaF
466477
467478 public static void setFieldChar (char value , Object obj , InterpreterResolvedJavaField field ) {
468479 assert obj != null ;
480+ ensureMaterialized (field );
469481 if (field .isVolatile ()) {
470482 U .putCharVolatile (obj , field .getOffset (), value );
471483 } else {
@@ -475,6 +487,7 @@ public static void setFieldChar(char value, Object obj, InterpreterResolvedJavaF
475487
476488 public static void setFieldShort (short value , Object obj , InterpreterResolvedJavaField field ) {
477489 assert obj != null ;
490+ ensureMaterialized (field );
478491 if (field .isVolatile ()) {
479492 U .putShortVolatile (obj , field .getOffset (), value );
480493 } else {
@@ -484,6 +497,7 @@ public static void setFieldShort(short value, Object obj, InterpreterResolvedJav
484497
485498 public static void setFieldInt (int value , Object obj , InterpreterResolvedJavaField field ) {
486499 assert obj != null ;
500+ ensureMaterialized (field );
487501 assert field .getJavaKind () == JavaKind .Int || field .isWordStorage ();
488502 if (field .isVolatile ()) {
489503 U .putIntVolatile (obj , field .getOffset (), value );
@@ -494,6 +508,7 @@ public static void setFieldInt(int value, Object obj, InterpreterResolvedJavaFie
494508
495509 public static void setFieldLong (long value , Object obj , InterpreterResolvedJavaField field ) {
496510 assert obj != null ;
511+ ensureMaterialized (field );
497512 assert field .getJavaKind () == JavaKind .Long || field .isWordStorage ();
498513 if (field .isVolatile ()) {
499514 U .putLongVolatile (obj , field .getOffset (), value );
@@ -504,6 +519,7 @@ public static void setFieldLong(long value, Object obj, InterpreterResolvedJavaF
504519
505520 public static void setFieldWord (WordBase value , Object obj , InterpreterResolvedJavaField field ) {
506521 assert obj != null ;
522+ ensureMaterialized (field );
507523 switch (wordJavaKind ()) {
508524 case Int -> setFieldInt ((int ) value .rawValue (), obj , field );
509525 case Long -> setFieldLong (value .rawValue (), obj , field );
@@ -513,6 +529,7 @@ public static void setFieldWord(WordBase value, Object obj, InterpreterResolvedJ
513529
514530 public static void setFieldFloat (float value , Object obj , InterpreterResolvedJavaField field ) {
515531 assert obj != null ;
532+ ensureMaterialized (field );
516533 if (field .isVolatile ()) {
517534 U .putFloatVolatile (obj , field .getOffset (), value );
518535 } else {
@@ -522,6 +539,7 @@ public static void setFieldFloat(float value, Object obj, InterpreterResolvedJav
522539
523540 public static void setFieldDouble (double value , Object obj , InterpreterResolvedJavaField field ) {
524541 assert obj != null ;
542+ ensureMaterialized (field );
525543 if (field .isVolatile ()) {
526544 U .putDoubleVolatile (obj , field .getOffset (), value );
527545 } else {
@@ -531,13 +549,22 @@ public static void setFieldDouble(double value, Object obj, InterpreterResolvedJ
531549
532550 public static void setFieldObject (Object value , Object obj , InterpreterResolvedJavaField field ) {
533551 assert obj != null ;
552+ ensureMaterialized (field );
534553 if (field .isVolatile ()) {
535554 U .putReferenceVolatile (obj , field .getOffset (), value );
536555 } else {
537556 U .putReference (obj , field .getOffset (), value );
538557 }
539558 }
540559
560+ private static void ensureMaterialized (InterpreterResolvedJavaField field ) {
561+ if (RuntimeClassLoading .isSupported () && field .isUnmaterializedConstant ()) {
562+ throw VMError .shouldNotReachHere ("Cannot set unmaterialized field " + field );
563+ } else {
564+ InterpreterUtil .assertion (field .getOffset () >= 0 , "Bad field offset" );
565+ }
566+ }
567+
541568 /**
542569 * Subtyping among Array Types The following rules define the direct supertype relation among
543570 * array types:
0 commit comments