Skip to content

Commit d24879f

Browse files
committed
[GR-49874] Support for espresso exception interop type converters for common host JDK exceptions.
PullRequest: graal/15997
2 parents 20e401b + 57249f7 commit d24879f

File tree

8 files changed

+216
-66
lines changed

8 files changed

+216
-66
lines changed

espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/descriptors/Symbol.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -725,6 +725,7 @@ public static void ensureInitialized() {
725725
public static final Symbol<Type> java_lang_UnsupportedOperationException = StaticSymbols.putType("Ljava/lang/UnsupportedOperationException;");
726726
public static final Symbol<Type> java_lang_UnsupportedClassVersionError = StaticSymbols.putType("Ljava/lang/UnsupportedClassVersionError;");
727727
public static final Symbol<Type> java_lang_reflect_InvocationTargetException = StaticSymbols.putType("Ljava/lang/reflect/InvocationTargetException;");
728+
public static final Symbol<Type> java_lang_NumberFormatException = StaticSymbols.putType("Ljava/lang/NumberFormatException;");
728729

729730
public static final Symbol<Type> java_lang_Thread = StaticSymbols.putType("Ljava/lang/Thread;");
730731
public static final Symbol<Type> java_lang_Thread_FieldHolder = StaticSymbols.putType("Ljava/lang/Thread$FieldHolder;");

espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/impl/Klass.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -183,22 +183,23 @@ abstract static class ReadMember {
183183
static Object doShared(Klass receiver, String member,
184184
@CachedLibrary("receiver") InteropLibrary lib,
185185
@Bind("getLang(lib)") @SuppressWarnings("unused") EspressoLanguage language) throws UnknownIdentifierException {
186-
return readMember(receiver, member, LookupFieldNodeGen.getUncached(), LookupDeclaredMethodNodeGen.getUncached(), BranchProfile.getUncached(), lib);
186+
return readMember(receiver, member, LookupFieldNodeGen.getUncached(), LookupDeclaredMethodNodeGen.getUncached(), BranchProfile.getUncached(), lib, language);
187187
}
188188

189189
@Specialization
190190
static Object readMember(Klass receiver, String member,
191191
@Shared("lookupField") @Cached LookupFieldNode lookupFieldNode,
192192
@Shared("lookupMethod") @Cached LookupDeclaredMethod lookupMethod,
193193
@Shared("error") @Cached BranchProfile error,
194-
@CachedLibrary("receiver") InteropLibrary lib) throws UnknownIdentifierException {
194+
@CachedLibrary("receiver") InteropLibrary lib,
195+
@Bind("getLang(lib)") @SuppressWarnings("unused") EspressoLanguage language) throws UnknownIdentifierException {
195196
EspressoContext ctx = EspressoContext.get(lib);
196197
Meta meta = ctx.getMeta();
197198
Field field = lookupFieldNode.execute(receiver, member, true);
198199
if (field != null) {
199200
Object result = field.get(receiver.tryInitializeAndGetStatics());
200201
if (result instanceof StaticObject) {
201-
result = InteropUtils.unwrap((StaticObject) result, meta, lookupFieldNode);
202+
result = InteropUtils.unwrap(language, (StaticObject) result, meta);
202203
}
203204
return result;
204205
}
@@ -352,9 +353,10 @@ static Object invokeMember(Klass receiver, String member,
352353
}
353354
throw UnknownIdentifierException.create(member);
354355
} catch (EspressoException e) {
355-
if (receiver.getMeta().polyglot != null && e.getGuestException().getKlass() == receiver.getMeta().polyglot.ForeignException) {
356+
if (InteropUtils.isForeignException(e)) {
357+
Meta meta = e.getGuestException().getKlass().getMeta();
356358
// rethrow the original foreign exception when leaving espresso interop
357-
throw (AbstractTruffleException) receiver.getMeta().java_lang_Throwable_backtrace.getObject(e.getGuestException()).rawForeignObject(receiver.getLanguage());
359+
throw (AbstractTruffleException) meta.java_lang_Throwable_backtrace.getObject(e.getGuestException()).rawForeignObject(receiver.getLanguage());
358360
}
359361
throw e;
360362
}

espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/meta/Meta.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@ public Meta(EspressoContext context) {
130130
java_lang_Class_forName_String_boolean_ClassLoader = java_lang_Class.requireDeclaredMethod(Name.forName, Signature.Class_String_boolean_ClassLoader);
131131

132132
java_lang_String = knownKlass(Type.java_lang_String);
133+
java_lang_String_array = java_lang_String.array();
133134
java_lang_CharSequence = knownKlass(Type.java_lang_CharSequence);
134135

135136
// Primitives.
@@ -286,6 +287,8 @@ public Meta(EspressoContext context) {
286287
java_lang_NoSuchFieldException = knownKlass(Type.java_lang_NoSuchFieldException);
287288
java_lang_NoSuchMethodException = knownKlass(Type.java_lang_NoSuchMethodException);
288289
java_lang_UnsupportedOperationException = knownKlass(Type.java_lang_UnsupportedOperationException);
290+
java_util_NoSuchElementException = knownKlass(Type.java_util_NoSuchElementException);
291+
java_lang_NumberFormatException = knownKlass(Type.java_lang_NumberFormatException);
289292

290293
java_lang_StackOverflowError = knownKlass(Type.java_lang_StackOverflowError);
291294
java_lang_OutOfMemoryError = knownKlass(Type.java_lang_OutOfMemoryError);
@@ -885,8 +888,6 @@ public Meta(EspressoContext context) {
885888
java_math_MathContext = knownKlass(Type.java_math_MathContext);
886889
java_math_MathContext_init = java_math_MathContext.requireDeclaredMethod(Name._init_, Signature._void_int);
887890

888-
java_util_NoSuchElementException = knownKlass(Type.java_util_NoSuchElementException);
889-
890891
jdk_internal_misc_UnsafeConstants = diff() //
891892
.klass(higher(13), Type.jdk_internal_misc_UnsafeConstants) //
892893
.notRequiredKlass();
@@ -1054,6 +1055,7 @@ private DiffVersionLoadHelper diff() {
10541055
public final ArrayKlass java_lang_Object_array;
10551056

10561057
public final ObjectKlass java_lang_String;
1058+
public final ArrayKlass java_lang_String_array;
10571059
public final ObjectKlass java_lang_Class;
10581060
public final ObjectKlass java_lang_CharSequence;
10591061
public final Field HIDDEN_MIRROR_KLASS;
@@ -1258,6 +1260,8 @@ private DiffVersionLoadHelper diff() {
12581260
public final ObjectKlass java_lang_NoSuchFieldException;
12591261
public final ObjectKlass java_lang_NoSuchMethodException;
12601262
public final ObjectKlass java_lang_UnsupportedOperationException;
1263+
public final ObjectKlass java_util_NoSuchElementException;
1264+
public final ObjectKlass java_lang_NumberFormatException;
12611265

12621266
public final ObjectKlass java_lang_Throwable;
12631267
public final Method java_lang_Throwable_getStackTrace;
@@ -1584,8 +1588,6 @@ private DiffVersionLoadHelper diff() {
15841588
public final ObjectKlass java_math_MathContext;
15851589
public final Method java_math_MathContext_init;
15861590

1587-
public final ObjectKlass java_util_NoSuchElementException;
1588-
15891591
public final ObjectKlass jdk_internal_misc_UnsafeConstants;
15901592
public final Field jdk_internal_misc_UnsafeConstants_ADDRESS_SIZE0;
15911593
public final Field jdk_internal_misc_UnsafeConstants_PAGE_SIZE;

0 commit comments

Comments
 (0)