Fix runtime stack trace computation (#11581)

Co-authored-by: paperdave <paperdave@users.noreply.github.com>
This commit is contained in:
dave caruso
2024-06-05 00:26:03 -07:00
committed by GitHub
parent 2580d199a4
commit bb8c0d97ba
21 changed files with 380 additions and 400 deletions

View File

@@ -97,6 +97,8 @@ const BuildMessage = JSC.BuildMessage;
const ResolveMessage = JSC.ResolveMessage;
const Async = bun.Async;
const Ordinal = bun.Ordinal;
pub const OpaqueCallback = *const fn (current: ?*anyopaque) callconv(.C) void;
pub fn OpaqueWrap(comptime Context: type, comptime Function: fn (this: *Context) void) OpaqueCallback {
return struct {
@@ -2834,8 +2836,8 @@ pub const VirtualMachine = struct {
if (this.source_mappings.resolveMapping(
sourceURL.slice(),
@max(frame.position.line, 0),
@max(frame.position.column_start, 0),
@max(frame.position.line.zeroBased(), 0),
@max(frame.position.column.zeroBased(), 0),
.no_source_contents,
)) |lookup| {
if (lookup.displaySourceURLIfNeeded(sourceURL.slice())) |source_url| {
@@ -2843,8 +2845,8 @@ pub const VirtualMachine = struct {
frame.source_url = source_url;
}
const mapping = lookup.mapping;
frame.position.line = mapping.original.lines;
frame.position.column_start = mapping.original.columns;
frame.position.line = Ordinal.fromZeroBased(mapping.original.lines);
frame.position.column = Ordinal.fromZeroBased(mapping.original.columns);
frame.remapped = true;
} else {
// we don't want it to be remapped again
@@ -2944,8 +2946,8 @@ pub const VirtualMachine = struct {
.mapping = .{
.generated = .{},
.original = .{
.lines = @max(top.position.line, 0),
.columns = @max(top.position.column_start, 0),
.lines = @max(top.position.line.zeroBased(), 0),
.columns = @max(top.position.column.zeroBased(), 0),
},
.source_index = 0,
},
@@ -2956,8 +2958,8 @@ pub const VirtualMachine = struct {
else
this.source_mappings.resolveMapping(
top_source_url.slice(),
@max(top.position.line, 0),
@max(top.position.column_start, 0),
@max(top.position.line.zeroBased(), 0),
@max(top.position.column.zeroBased(), 0),
.source_contents,
);
@@ -2986,18 +2988,13 @@ pub const VirtualMachine = struct {
};
source_code_slice.* = code;
top.position.line = mapping.original.lines;
top.position.line_start = mapping.original.lines;
top.position.line_stop = mapping.original.lines + 1;
top.position.column_start = mapping.original.columns;
top.position.column_stop = mapping.original.columns + 1;
top.position.line = Ordinal.fromZeroBased(mapping.original.lines);
top.position.column = Ordinal.fromZeroBased(mapping.original.columns);
exception.remapped = true;
top.remapped = true;
// This expression range is no longer accurate
top.position.expression_start = mapping.original.columns;
top.position.expression_stop = mapping.original.columns + 1;
const last_line = @max(top.position.line, 0);
const last_line = @max(top.position.line.zeroBased(), 0);
if (strings.getLinesInText(
code.slice(),
@intCast(last_line),
@@ -3020,13 +3017,6 @@ pub const VirtualMachine = struct {
}
exception.stack.source_lines_len = @as(u8, @truncate(lines.len));
top.position.column_stop = @as(i32, @intCast(source_lines[lines.len - 1].length()));
top.position.line_stop = top.position.column_stop;
// This expression range is no longer accurate
top.position.expression_start = mapping.original.columns;
top.position.expression_stop = top.position.column_stop;
}
}
@@ -3037,8 +3027,8 @@ pub const VirtualMachine = struct {
defer source_url.deinit();
if (this.source_mappings.resolveMapping(
source_url.slice(),
@max(frame.position.line, 0),
@max(frame.position.column_start, 0),
@max(frame.position.line.zeroBased(), 0),
@max(frame.position.column.zeroBased(), 0),
.no_source_contents,
)) |lookup| {
if (lookup.displaySourceURLIfNeeded(source_url.slice())) |src| {
@@ -3046,9 +3036,9 @@ pub const VirtualMachine = struct {
frame.source_url = src;
}
const mapping = lookup.mapping;
frame.position.line = mapping.original.lines;
frame.remapped = true;
frame.position.column_start = mapping.original.columns;
frame.position.line = Ordinal.fromZeroBased(mapping.original.lines);
frame.position.column = Ordinal.fromZeroBased(mapping.original.columns);
}
}
}
@@ -3197,8 +3187,8 @@ pub const VirtualMachine = struct {
.{ display_line, bun.fmt.fmtJavaScript(clamped, allow_ansi_color) },
);
if (clamped.len < max_line_length_with_divot or top.position.column_start > max_line_length_with_divot) {
const indent = max_line_number_pad + " | ".len + @as(u64, @intCast(top.position.column_start));
if (clamped.len < max_line_length_with_divot or top.position.column.zeroBased() > max_line_length_with_divot) {
const indent = max_line_number_pad + " | ".len + @as(u64, @intCast(top.position.column.zeroBased()));
try writer.writeByteNTimes(' ', indent);
try writer.print(comptime Output.prettyFmt(
@@ -3380,8 +3370,8 @@ pub const VirtualMachine = struct {
const file = bun.path.relative(dir, source_url.slice());
writer.print("\n::error file={s},line={d},col={d},title=", .{
file,
frame.position.line_start + 1,
frame.position.column_start,
frame.position.line.oneBased(),
frame.position.column.oneBased(),
}) catch {};
has_location = true;
}