|
283 | 283 | import com.oracle.truffle.api.exception.AbstractTruffleException; |
284 | 284 | import com.oracle.truffle.api.frame.Frame; |
285 | 285 | import com.oracle.truffle.api.frame.FrameDescriptor; |
| 286 | +import com.oracle.truffle.api.frame.FrameSlotTypeException; |
286 | 287 | import com.oracle.truffle.api.frame.MaterializedFrame; |
287 | 288 | import com.oracle.truffle.api.frame.VirtualFrame; |
288 | 289 | import com.oracle.truffle.api.nodes.DirectCallNode; |
|
291 | 292 | import com.oracle.truffle.api.nodes.RootNode; |
292 | 293 | import com.oracle.truffle.api.nodes.UnexpectedResultException; |
293 | 294 | import com.oracle.truffle.api.object.DynamicObject; |
| 295 | +import com.oracle.truffle.api.profiles.InlinedBranchProfile; |
294 | 296 | import com.oracle.truffle.api.profiles.InlinedConditionProfile; |
295 | 297 | import com.oracle.truffle.api.source.Source; |
296 | 298 | import com.oracle.truffle.api.source.SourceSection; |
@@ -3545,59 +3547,57 @@ static void doInteropException(AbstractTruffleException exception) { |
3545 | 3547 | * This operation makes use of Truffle's boxing overloads. When an operation tries to quicken |
3546 | 3548 | * this one for boxing elimination, the correct overload will be selected. |
3547 | 3549 | */ |
3548 | | - @Operation(storeBytecodeIndex = true) |
| 3550 | + @Operation(storeBytecodeIndex = false) |
3549 | 3551 | @ConstantOperand(type = LocalAccessor.class) |
3550 | 3552 | @ConstantOperand(type = int.class) |
3551 | 3553 | public static final class CheckAndLoadLocal { |
3552 | | - |
3553 | | - @Specialization(rewriteOn = UnexpectedResultException.class) |
| 3554 | + @Specialization(rewriteOn = {FrameSlotTypeException.class, UnexpectedResultException.class}) |
3554 | 3555 | public static int doInt(VirtualFrame frame, LocalAccessor accessor, int index, |
3555 | 3556 | @Bind BytecodeNode bytecodeNode) throws UnexpectedResultException { |
3556 | 3557 | return accessor.getInt(bytecodeNode, frame); |
3557 | 3558 | } |
3558 | 3559 |
|
3559 | | - @Specialization(rewriteOn = UnexpectedResultException.class) |
3560 | | - public static boolean doBoolean(VirtualFrame frame, LocalAccessor accessor, int index, |
3561 | | - @Bind BytecodeNode bytecodeNode) throws UnexpectedResultException { |
3562 | | - return accessor.getBoolean(bytecodeNode, frame); |
3563 | | - } |
3564 | | - |
3565 | | - @Specialization(replaces = {"doInt", "doBoolean"}, guards = "!accessor.isCleared(bytecodeNode, frame)") |
| 3560 | + @Specialization(replaces = "doInt", rewriteOn = FrameSlotTypeException.class) |
3566 | 3561 | public static Object doObject(VirtualFrame frame, LocalAccessor accessor, int index, |
3567 | 3562 | @Bind BytecodeNode bytecodeNode) { |
3568 | 3563 | return accessor.getObject(bytecodeNode, frame); |
3569 | 3564 | } |
3570 | 3565 |
|
3571 | | - @Fallback |
3572 | | - public static Object doFallback(VirtualFrame frame, LocalAccessor accessor, int index, |
3573 | | - @Bind BytecodeNode bytecodeNode, @Bind Node inliningTarget) { |
3574 | | - throw raiseUnbound(bytecodeNode, inliningTarget, index); |
| 3566 | + @StoreBytecodeIndex |
| 3567 | + @Specialization(replaces = "doObject") |
| 3568 | + public static Object doObjectOrUnbound(VirtualFrame frame, LocalAccessor accessor, int index, |
| 3569 | + @Bind BytecodeNode bytecodeNode) { |
| 3570 | + try { |
| 3571 | + return accessor.getObject(bytecodeNode, frame); |
| 3572 | + } catch (FrameSlotTypeException e) { |
| 3573 | + throw raiseUnbound(bytecodeNode, index); |
| 3574 | + } |
3575 | 3575 | } |
3576 | 3576 | } |
3577 | 3577 |
|
3578 | | - @Operation(storeBytecodeIndex = true) |
| 3578 | + @Operation(storeBytecodeIndex = false) |
3579 | 3579 | @ConstantOperand(type = LocalAccessor.class) |
3580 | 3580 | @ConstantOperand(type = int.class) |
3581 | 3581 | public static final class DeleteLocal { |
3582 | 3582 |
|
3583 | 3583 | @Specialization(guards = "!accessor.isCleared(bytecodeNode, frame)") |
3584 | 3584 | public static void doObject(VirtualFrame frame, LocalAccessor accessor, int index, |
3585 | | - @Bind BytecodeNode bytecodeNode, |
3586 | | - @Bind Node inliningTarget) { |
| 3585 | + @Bind BytecodeNode bytecodeNode) { |
3587 | 3586 | accessor.clear(bytecodeNode, frame); |
3588 | 3587 | } |
3589 | 3588 |
|
| 3589 | + @StoreBytecodeIndex |
3590 | 3590 | @Fallback |
3591 | 3591 | public static void doFallback(VirtualFrame frame, LocalAccessor accessor, int index, |
3592 | | - @Bind BytecodeNode bytecodeNode, @Bind Node inliningTarget) { |
3593 | | - throw raiseUnbound(bytecodeNode, inliningTarget, index); |
| 3592 | + @Bind BytecodeNode bytecodeNode) { |
| 3593 | + throw raiseUnbound(bytecodeNode, index); |
3594 | 3594 | } |
3595 | 3595 | } |
3596 | 3596 |
|
3597 | 3597 | @TruffleBoundary |
3598 | | - private static PException raiseUnbound(BytecodeNode bytecodeNode, Node inliningTarget, int index) { |
| 3598 | + private static PException raiseUnbound(BytecodeNode bytecodeNode, int index) { |
3599 | 3599 | TruffleString localName = ((PBytecodeDSLRootNode) bytecodeNode.getRootNode()).getCodeUnit().varnames[index]; |
3600 | | - throw PRaiseNode.raiseStatic(inliningTarget, PythonBuiltinClassType.UnboundLocalError, ErrorMessages.LOCAL_VAR_REFERENCED_BEFORE_ASSIGMENT, localName); |
| 3600 | + throw PRaiseNode.raiseStatic(bytecodeNode, PythonBuiltinClassType.UnboundLocalError, ErrorMessages.LOCAL_VAR_REFERENCED_BEFORE_ASSIGMENT, localName); |
3601 | 3601 | } |
3602 | 3602 |
|
3603 | 3603 | @Operation(storeBytecodeIndex = true) |
|
0 commit comments