Skip to content

Commit 50c2978

Browse files
committed
[GR-51100] Fix type converter combination for foreign exceptions and custom type converters.
PullRequest: graal/16460
2 parents 62765c2 + 90c3b93 commit 50c2978

File tree

1 file changed

+33
-2
lines changed
  • espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/nodes/interop

1 file changed

+33
-2
lines changed

espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/nodes/interop/ToReference.java

+33-2
Original file line numberDiff line numberDiff line change
@@ -1076,18 +1076,45 @@ StaticObject doForeignString(Object value,
10761076

10771077
@Specialization(guards = {
10781078
"interop.isException(value)",
1079+
"!isTypeMappingEnabled(context)",
10791080
"!isStaticObject(value)",
10801081
"!interop.isNull(value)",
10811082
"!isHostString(value)",
10821083
"!isEspressoException(value)",
10831084
"!isBoxedPrimitive(value)"
10841085
})
1085-
StaticObject doForeignException(Object value,
1086+
StaticObject doForeignExceptionNoTypeMapping(Object value,
10861087
@Cached.Shared("value") @CachedLibrary(limit = "LIMIT") InteropLibrary interop,
10871088
@SuppressWarnings("unused") @Bind("getContext()") EspressoContext context) {
10881089
return StaticObject.createForeignException(context, value, interop);
10891090
}
10901091

1092+
@Specialization(guards = {
1093+
"interop.isException(value)",
1094+
"isTypeMappingEnabled(context)",
1095+
"!isStaticObject(value)",
1096+
"!interop.isNull(value)",
1097+
"!isHostString(value)",
1098+
"!isEspressoException(value)",
1099+
"!isBoxedPrimitive(value)"
1100+
})
1101+
StaticObject doForeignExceptionTypeMapping(Object value,
1102+
@Cached.Shared("value") @CachedLibrary(limit = "LIMIT") InteropLibrary interop,
1103+
@SuppressWarnings("unused") @Bind("getContext()") EspressoContext context,
1104+
@Cached BranchProfile errorProfile,
1105+
@Cached LookupProxyKlassNode lookupProxyKlassNode,
1106+
@Cached LookupTypeConverterNode lookupTypeConverterNode,
1107+
@Cached LookupInternalTypeConverterNode lookupInternalTypeConverterNode,
1108+
@Cached ToReference.DynamicToReference converterToEspresso,
1109+
@Bind("getMeta()") Meta meta) {
1110+
try {
1111+
return tryTypeConversion(value, interop, lookupProxyKlassNode, lookupTypeConverterNode, lookupInternalTypeConverterNode, converterToEspresso, errorProfile, meta);
1112+
} catch (@SuppressWarnings("unused") UnsupportedTypeException ex) {
1113+
// no meta object available, but we know it's a foreign exception so simply wrap
1114+
return StaticObject.createForeignException(context, value, interop);
1115+
}
1116+
}
1117+
10911118
@Specialization(guards = {
10921119
"interop.hasArrayElements(value)",
10931120
"!isTypeMappingEnabled(context)",
@@ -1225,7 +1252,11 @@ private StaticObject tryTypeConversion(Object value, InteropLibrary interop, Loo
12251252
} else {
12261253
PolyglotTypeMappings.TypeConverter converter = lookupTypeConverterNode.execute(metaName);
12271254
if (converter != null) {
1228-
return (StaticObject) converter.convert(StaticObject.createForeign(getLanguage(), meta.java_lang_Object, value, interop));
1255+
if (interop.isException(value)) {
1256+
return (StaticObject) converter.convert(StaticObject.createForeignException(getContext(), value, interop));
1257+
} else {
1258+
return (StaticObject) converter.convert(StaticObject.createForeign(getLanguage(), meta.java_lang_Object, value, interop));
1259+
}
12291260
}
12301261

12311262
// check if foreign exception

0 commit comments

Comments
 (0)