ERR/E3.0 (slice 3c): source snippet + caret in traces
Each trace frame now shows the offending source line with a `^` caret under the column — in the catch-handler formatter, the failable-main C reporter, and the comptime path. The source line is embedded at compile time as a 5th Frame field (line_text), not read from disk at runtime: the file field is a basename and a runtime read would add a filesystem dependency that fails under the test harness and on locked-down targets. - errors.lineAt(src, offset): shared helper for the whole source line. - Frame gains line_text (mirrored in emit_llvm getFrameStructType, trace.sx Frame, sx_trace.c SxFrame). emitTraceFrame embeds it; the interp .trace_resolve extracts it from the source map. - trace.sx (new spaces helper) and the C reporter render the line + a col-aligned caret, guarded on a non-empty line_text. Snapshots 243/244/247/253 regenerated. Gates: zig build, zig build test, run_examples.sh -> 291 passed.
This commit is contained in:
@@ -677,18 +677,21 @@ pub const Interpreter = struct {
|
||||
const file = std.fs.path.basename(file_full);
|
||||
var line: i64 = 1;
|
||||
var col: i64 = 1;
|
||||
var line_text: []const u8 = "";
|
||||
if (self.source_map) |sm| {
|
||||
if (sm.get(file_full)) |src| {
|
||||
const loc = errors.SourceLoc.compute(src, offset);
|
||||
line = @intCast(loc.line);
|
||||
col = @intCast(loc.col);
|
||||
line_text = errors.lineAt(src, offset);
|
||||
}
|
||||
}
|
||||
const fields = self.alloc.alloc(Value, 4) catch return .{ .value = .undef };
|
||||
const fields = self.alloc.alloc(Value, 5) catch return .{ .value = .undef };
|
||||
fields[0] = .{ .string = file };
|
||||
fields[1] = .{ .int = line };
|
||||
fields[2] = .{ .int = col };
|
||||
fields[3] = .{ .string = func_name };
|
||||
fields[4] = .{ .string = line_text };
|
||||
return .{ .value = .{ .aggregate = fields } };
|
||||
},
|
||||
.const_type => |tid| return .{ .value = .{ .type_tag = tid } },
|
||||
|
||||
Reference in New Issue
Block a user