Skip to content

Commit 1a9da78

Browse files
Align espresso's JVMCI behvaiour regarding resolution errors to hotspot
The following methods don't throw exceptions that can happen during resolution and rather return and unresolved result. * `lookupField` * `lookupMethod` * `lookupType` * `lookupConstant` for class entries * `loadReferencedType`
1 parent 0978c46 commit 1a9da78

File tree

2 files changed

+41
-24
lines changed

2 files changed

+41
-24
lines changed

espresso/src/com.oracle.truffle.espresso.jvmci/src/com/oracle/truffle/espresso/jvmci/meta/EspressoConstantPool.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,13 @@ public void loadReferencedType(int cpi, int opcode, boolean initialize) {
7575

7676
@Override
7777
public JavaField lookupField(int cpi, ResolvedJavaMethod method, int opcode) {
78-
EspressoResolvedJavaField field = lookupResolvedField(cpi, (EspressoResolvedJavaMethod) method, opcode);
78+
EspressoResolvedJavaField field;
79+
try {
80+
field = lookupResolvedField(cpi, (EspressoResolvedJavaMethod) method, opcode);
81+
} catch (Throwable t) {
82+
// ignore errors that can happen during type resolution
83+
field = null;
84+
}
7985
if (field != null) {
8086
return field;
8187
}
@@ -90,7 +96,13 @@ public JavaField lookupField(int cpi, ResolvedJavaMethod method, int opcode) {
9096

9197
@Override
9298
public JavaMethod lookupMethod(int cpi, int opcode, ResolvedJavaMethod caller) {
93-
EspressoResolvedJavaMethod method = lookupResolvedMethod(cpi, opcode, (EspressoResolvedJavaMethod) caller);
99+
EspressoResolvedJavaMethod method;
100+
try {
101+
method = lookupResolvedMethod(cpi, opcode, (EspressoResolvedJavaMethod) caller);
102+
} catch (Throwable t) {
103+
// ignore errors that can happen during type resolution
104+
method = null;
105+
}
94106
if (method != null) {
95107
return method;
96108
}

espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/substitutions/jvmci/Target_com_oracle_truffle_espresso_jvmci_meta_EspressoConstantPool.java

Lines changed: 27 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@
5050
import static com.oracle.truffle.espresso.substitutions.jvmci.Target_com_oracle_truffle_espresso_jvmci_meta_EspressoResolvedInstanceType.toJVMCIField;
5151
import static com.oracle.truffle.espresso.substitutions.jvmci.Target_com_oracle_truffle_espresso_jvmci_meta_EspressoResolvedInstanceType.toJVMCIMethod;
5252

53+
import java.util.logging.Level;
54+
5355
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
5456
import com.oracle.truffle.espresso.classfile.ConstantPool;
5557
import com.oracle.truffle.espresso.classfile.JavaKind;
@@ -77,6 +79,7 @@
7779
import com.oracle.truffle.espresso.meta.Meta;
7880
import com.oracle.truffle.espresso.nodes.methodhandle.MHInvokeGenericNode;
7981
import com.oracle.truffle.espresso.runtime.EspressoContext;
82+
import com.oracle.truffle.espresso.runtime.EspressoException;
8083
import com.oracle.truffle.espresso.runtime.EspressoLinkResolver;
8184
import com.oracle.truffle.espresso.runtime.MethodHandleIntrinsics;
8285
import com.oracle.truffle.espresso.runtime.staticobject.StaticObject;
@@ -209,13 +212,12 @@ private static Field tryResolveField(int fieldIndex, Klass symbolicHolder, Runti
209212
RuntimeConstantPool constantPool = getRuntimeConstantPool(self, meta);
210213
if (safeTagAt(constantPool, cpi, meta) == ConstantPool.Tag.CLASS) {
211214
ResolvedConstant resolvedConstant = constantPool.peekResolvedOrNull(cpi, meta);
212-
if (resolvedConstant != null) {
213-
Klass klass = (Klass) resolvedConstant.value();
214-
LOGGER.finer(() -> "ECP.lookupType found " + klass);
215-
return toJVMCIObjectType(klass, meta);
216-
} else {
215+
if (resolvedConstant == null || !resolvedConstant.isSuccess()) {
217216
return toJVMCIUnresolvedType(TypeSymbols.nameToType(constantPool.className(cpi)), meta);
218217
}
218+
Klass klass = (Klass) resolvedConstant.value();
219+
LOGGER.finer(() -> "ECP.lookupType found " + klass);
220+
return toJVMCIObjectType(klass, meta);
219221
}
220222
if (safeTagAt(constantPool, cpi, meta) == ConstantPool.Tag.UTF8) {
221223
return toJVMCIUnresolvedType(TypeSymbols.nameToType(constantPool.utf8At(cpi)), meta);
@@ -367,13 +369,12 @@ private static Method tryResolveMethod(int methodIndex, Klass symbolicHolder, Ru
367369
case LDC2_W:
368370
if (safeTagAt(constantPool, cpi, meta) == ConstantPool.Tag.CLASS) {
369371
ResolvedConstant resolvedConstant = constantPool.peekResolvedOrNull(cpi, meta);
370-
if (resolvedConstant != null) {
371-
Klass klass = (Klass) resolvedConstant.value();
372-
LOGGER.finer(() -> "ECP.lookupReferencedType found " + klass);
373-
return toJVMCIObjectType(klass, meta);
374-
} else {
372+
if (resolvedConstant == null || !resolvedConstant.isSuccess()) {
375373
return toJVMCIUnresolvedType(TypeSymbols.nameToType(constantPool.className(cpi)), meta);
376374
}
375+
Klass klass = (Klass) resolvedConstant.value();
376+
LOGGER.finer(() -> "ECP.lookupReferencedType found " + klass);
377+
return toJVMCIObjectType(klass, meta);
377378
}
378379
break;
379380
case GETSTATIC:
@@ -386,14 +387,20 @@ private static Method tryResolveMethod(int methodIndex, Klass symbolicHolder, Ru
386387
case INVOKEINTERFACE:
387388
if (safeTagAt(constantPool, cpi, meta).isMember()) {
388389
int holderClassIndex = constantPool.memberClassIndex(cpi);
389-
Klass holderKlass = findObjectType(holderClassIndex, constantPool, false, meta);
390-
if (holderKlass != null) {
391-
LOGGER.finer(() -> "ECP.lookupReferencedType found " + holderKlass);
392-
return toJVMCIObjectType(holderKlass, meta);
393-
} else {
390+
Klass holderKlass;
391+
try {
392+
holderKlass = findObjectType(holderClassIndex, constantPool, false, meta);
393+
} catch (EspressoException e) {
394+
LOGGER.log(Level.FINE, "ECP.lookupReferencedType exception during lookup", e);
395+
holderKlass = null;
396+
}
397+
if (holderKlass == null) {
394398
Symbol<Name> holderName = constantPool.memberClassName(cpi);
395399
return toJVMCIUnresolvedType(TypeSymbols.nameToType(holderName), meta);
396400
}
401+
Klass finalHolderKlass = holderKlass;
402+
LOGGER.finer(() -> "ECP.lookupReferencedType found " + finalHolderKlass);
403+
return toJVMCIObjectType(holderKlass, meta);
397404
}
398405
break;
399406
}
@@ -499,15 +506,13 @@ public static boolean loadReferencedType0(StaticObject self, int cpi, int opcode
499506
}
500507
switch (tag) {
501508
case CLASS -> {
502-
if (resolvedConstantOrNull != null) {
503-
Klass klass = (Klass) resolvedConstantOrNull.value();
504-
LOGGER.finer(() -> "ECP.lookupConstant found " + klass);
505-
return toJVMCIObjectType(klass, meta);
506-
} else if (resolve) {
507-
throw EspressoError.shouldNotReachHere();
508-
} else {
509+
if (resolvedConstantOrNull == null || !resolvedConstantOrNull.isSuccess()) {
510+
EspressoError.guarantee(!resolve || resolvedConstantOrNull != null, "Should have been resolved");
509511
return toJVMCIUnresolvedType(TypeSymbols.nameToType(constantPool.className(cpi)), meta);
510512
}
513+
Klass klass = (Klass) resolvedConstantOrNull.value();
514+
LOGGER.finer(() -> "ECP.lookupConstant found " + klass);
515+
return toJVMCIObjectType(klass, meta);
511516
}
512517
case STRING -> {
513518
return wrapEspressoObjectConstant(constantPool.resolvedStringAt(cpi), meta);

0 commit comments

Comments
 (0)