Skip to content

Commit 457a758

Browse files
[GR-72470] Crema: Add a better error message for issues with unmaterialized field
PullRequest: graal/23009
2 parents cae1e08 + c24c435 commit 457a758

1 file changed

Lines changed: 36 additions & 9 deletions

File tree

substratevm/src/com.oracle.svm.interpreter/src/com/oracle/svm/interpreter/InterpreterToVM.java

Lines changed: 36 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)