Skip to content

Commit e400a51

Browse files
committed
[GR-15290] Raise UnknownIdentifierException.on READ instead of letting RaiseException to propagate.
PullRequest: truffleruby/899
2 parents 67b01dc + b4325ee commit e400a51

File tree

2 files changed

+23
-1
lines changed

2 files changed

+23
-1
lines changed

src/main/java/org/truffleruby/core/exception/NameErrorLayout.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ Object[] build(
3030
@Nullable Object receiver,
3131
Object name);
3232

33+
boolean isNameError(DynamicObject object);
34+
3335
Object getName(DynamicObject object);
3436
void setName(DynamicObject object, Object value);
3537

src/main/java/org/truffleruby/interop/RubyObjectType.java

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import org.truffleruby.core.string.StringOperations;
3333
import org.truffleruby.core.string.StringUtils;
3434
import org.truffleruby.language.RubyGuards;
35+
import org.truffleruby.language.control.RaiseException;
3536
import org.truffleruby.language.dispatch.CallDispatchHeadNode;
3637
import org.truffleruby.language.dispatch.DoesRespondDispatchHeadNode;
3738

@@ -219,9 +220,28 @@ protected Object access(VirtualFrame frame, DynamicObject object) {
219220
public static abstract class ReadNode extends Node {
220221

221222
@Child private ForeignReadStringCachingHelperNode helperNode = ForeignReadStringCachingHelperNodeGen.create();
223+
private final ConditionProfile whichErrorProfile = ConditionProfile.createBinaryProfile();
222224

223225
protected Object access(VirtualFrame frame, DynamicObject object, Object name) {
224-
return helperNode.executeStringCachingHelper(frame, object, name);
226+
try {
227+
return helperNode.executeStringCachingHelper(frame, object, name);
228+
} catch (RaiseException ex) {
229+
if (whichErrorProfile.profile(Layouts.NAME_ERROR.isNameError(ex.getException()))) {
230+
try {
231+
return UnknownIdentifierException.raise(toString(name));
232+
} catch (Throwable unknownIdentifier) {
233+
unknownIdentifier.initCause(ex);
234+
throw unknownIdentifier;
235+
}
236+
} else {
237+
throw ex;
238+
}
239+
}
240+
}
241+
242+
@TruffleBoundary
243+
private static String toString(Object name) {
244+
return name.toString();
225245
}
226246

227247
}

0 commit comments

Comments
 (0)