Semantic Diff

#9163 Replace the %debugger extension with a debugger() function

2 commits

0800cb42b8f279c41e2edc57c67763628ea0bdb4..pr-9163

86101e9dd · cknitt + Claude · Nov 01, 2026, 08:28 UTC

Replace the %debugger extension with a debugger() function

Why

%debugger was a language feature selected by an extension name (#8624), but it only ever lowered to an external with the %debugger primitive. The standard library can declare that external, and an external call is inlined, so the statement stays in the caller's frame.

modifiedJS debugger()

let add = (a, b) => {  debugger()  a + b}
js
After
function add(a, b) {  debugger;  return a + b | 0;}

addedDiagnostic %debugger

let f = x => {  %debugger  x}
diagnostic
After
Syntax error!The %debugger extension has been removed. Use debugger() instead.
43dc5c5ac · cknitt + Claude · Nov 01, 2026, 11:28 UTC

Evaluate the argument of debugger() before the statement

Why

debugger() is a function now, so any unit-valued expression can be its argument, but the Pdebugger case of the JS backend ignored its arguments, so effects such as a log call were dropped silently. %debugger always passed a literal unit, which hid this (Codex review on #9163).

modifiedJS debugger with an argument

let f = () => debugger(Console.log("before pause"))
js
Before
After
function f() {function f() { console.log("before pause"); debugger; debugger;}}