diff --git a/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/debug/PythonDebugTest.java b/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/debug/PythonDebugTest.java index f6cca17770..41140d446a 100644 --- a/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/debug/PythonDebugTest.java +++ b/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/debug/PythonDebugTest.java @@ -601,6 +601,37 @@ public void testSourceFileURI() throws Throwable { } } + @Test + public void testInlineEvaluationBreakpointBuiltin() throws Throwable { + final Source source = Source.newBuilder("python", """ + a = 1 + breakpoint() + b = 2 + breakpoint # not invoking, therefore no breakpoint inserted + """, "test_inline.py").buildLiteral(); + + try (DebuggerSession session = tester.startSession()) { + session.install(Breakpoint.newBuilder(DebuggerTester.getSourceImpl(source)).lineIs(1).build()); + session.install(Breakpoint.newBuilder(DebuggerTester.getSourceImpl(source)).lineIs(3).build()); + tester.startEval(source); + expectSuspended((SuspendedEvent event) -> { + DebugStackFrame frame = event.getTopStackFrame(); + assertEquals(1, frame.getSourceSection().getStartLine()); + event.prepareContinue(); + }); + expectSuspended((SuspendedEvent event) -> { + DebugStackFrame frame = event.getTopStackFrame(); + assertEquals(2, frame.getSourceSection().getStartLine()); + event.prepareContinue(); + }); + expectSuspended((SuspendedEvent event) -> { + DebugStackFrame frame = event.getTopStackFrame(); + assertEquals(3, frame.getSourceSection().getStartLine()); + event.prepareContinue(); + }); + } + } + private void expectSuspended(SuspendedCallback callback) { tester.expectSuspended(callback); } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/compiler/bytecode_dsl/RootNodeCompiler.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/compiler/bytecode_dsl/RootNodeCompiler.java index 5ec45f3742..c5e24dbdce 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/compiler/bytecode_dsl/RootNodeCompiler.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/compiler/bytecode_dsl/RootNodeCompiler.java @@ -57,6 +57,7 @@ import static com.oracle.graal.python.compiler.bytecode_dsl.BytecodeDSLCompilerUtils.hasDefaultArgs; import static com.oracle.graal.python.compiler.bytecode_dsl.BytecodeDSLCompilerUtils.hasDefaultKwargs; import static com.oracle.graal.python.compiler.bytecode_dsl.BytecodeDSLCompilerUtils.len; +import static com.oracle.graal.python.nodes.BuiltinNames.J_BREAKPOINT; import static com.oracle.graal.python.nodes.SpecialAttributeNames.J___CLASS__; import static com.oracle.graal.python.nodes.SpecialAttributeNames.J___TYPE_PARAMS__; import static com.oracle.graal.python.util.PythonUtils.codePointsToInternedTruffleString; @@ -156,6 +157,7 @@ import com.oracle.truffle.api.bytecode.BytecodeParser; import com.oracle.truffle.api.bytecode.BytecodeRootNodes; import com.oracle.truffle.api.bytecode.serialization.BytecodeSerializer; +import com.oracle.truffle.api.debug.DebuggerTags; import com.oracle.truffle.api.instrumentation.StandardTags.StatementTag; import com.oracle.truffle.api.source.Source; import com.oracle.truffle.api.strings.TruffleString; @@ -2188,8 +2190,18 @@ private void emitCall(ExprTy func, ExprTy[] args, KeywordTy[] keywords) { } else { assert len(keywords) == 0; + boolean isBreakpoint = func instanceof ExprTy.Name && ((ExprTy.Name) func).id.equals(J_BREAKPOINT); + + if (isBreakpoint) { + b.beginTag(DebuggerTags.AlwaysHalt.class); + } + func.accept(this); // callable visitArguments(func, args, numArgs); + + if (isBreakpoint) { + b.endTag(DebuggerTags.AlwaysHalt.class); + } } }