ERR/E4.1: trace.print_interpreter_frames() — Phase E4 complete
The last E4 item: a comptime call-frame dump. - New nullary `interp_print_frames` IR op (inst/print). The interpreter maintains a `call_chain` side-stack (push/pop a FuncId around each sx-bodied `call`, freed in deinit) and `printInterpFrames` appends the chain to its output — most-recent-last, with the dump frame itself skipped. emit_llvm makes the op a no-op: compiled code has no interpreter stack, and the only caller is `process.exit`'s dead `is_comptime()` branch. - Lowered from a name-recognized `__interp_print_frames()` builtin (tryLowerReflectionCall + inferExprType → void). - `trace.print_interpreter_frames()` wraps the builtin; wired into `process.exit`'s comptime branch (process.sx now imports trace.sx). - Frame source locations await IR-offset resolution (the comptime analog of DWARF), so only function names print today. examples/252-interp-frames.sx (top-level `#run` drives the dump; exit 0). Phase E4 (entry-point + stdlib error story) is now 100% complete.
This commit is contained in:
@@ -91,6 +91,11 @@ pub const Op = union(enum) {
|
||||
/// `false`. Lets stdlib (`process.exit`, `assert`) take a comptime-only
|
||||
/// diagnostic branch that dead-codes out of compiled binaries.
|
||||
is_comptime,
|
||||
/// ERR E4.1 — `trace.print_interpreter_frames()`. At comptime the interp
|
||||
/// walks its sx call-frame chain and appends it to the output; in compiled
|
||||
/// code it's a no-op (only ever reached from a dead `is_comptime()` branch,
|
||||
/// where there is no interpreter stack to walk).
|
||||
interp_print_frames,
|
||||
/// Comptime-only Type value. Carried as a `Value.type_tag(TypeId)`
|
||||
/// in the interpreter. NEVER emitted to LLVM — types are erased
|
||||
/// after lowering. `emit_llvm` bails loudly if it sees one,
|
||||
|
||||
Reference in New Issue
Block a user