diff options
author | 2022-03-14 01:32:13 -0700 | |
---|---|---|
committer | 2022-03-14 01:32:13 -0700 | |
commit | 0e9056eca58be783c95773ba7e2c883fde318977 (patch) | |
tree | ec20958f83875af3ec56052b42a80cb74e3624a0 /src/javascript | |
parent | 4ab4ae77ac5ab51e0cc028c02d80613c817b8825 (diff) | |
download | bun-0e9056eca58be783c95773ba7e2c883fde318977.tar.gz bun-0e9056eca58be783c95773ba7e2c883fde318977.tar.zst bun-0e9056eca58be783c95773ba7e2c883fde318977.zip |
[bun.js] Implement `console.trace()`
Diffstat (limited to 'src/javascript')
-rw-r--r-- | src/javascript/jsc/bindings/exports.zig | 73 |
1 files changed, 57 insertions, 16 deletions
diff --git a/src/javascript/jsc/bindings/exports.zig b/src/javascript/jsc/bindings/exports.zig index 6dfcb82d4..eefc45022 100644 --- a/src/javascript/jsc/bindings/exports.zig +++ b/src/javascript/jsc/bindings/exports.zig @@ -234,15 +234,24 @@ pub const ResolvedSource = extern struct { }; }; +const Mimalloc = @import("../../../allocators/mimalloc.zig"); + export fn ZigString__free(ptr: [*]const u8, len: usize, allocator_: ?*anyopaque) void { var allocator: std.mem.Allocator = @ptrCast(*std.mem.Allocator, @alignCast(@alignOf(*std.mem.Allocator), allocator_ orelse return)).*; - + if (comptime Environment.allow_assert) { + std.debug.assert(Mimalloc.mi_check_owned(ptr)); + } var str = ptr[0..len]; + allocator.free(str); } export fn ZigString__free_global(ptr: [*]const u8, len: usize) void { var str = ptr[0..len]; + if (comptime Environment.allow_assert) { + std.debug.assert(Mimalloc.mi_check_owned(ptr)); + } + default_allocator.free(str); } @@ -907,18 +916,50 @@ pub const ZigConsoleClient = struct { var writer = buffered_writer.writer(); const Writer = @TypeOf(writer); - format( - level, - global, - vals, - len, - @TypeOf(buffered_writer.unbuffered_writer.context), - Writer, - writer, - enable_colors, - true, - true, - ); + if (len > 0) + format( + level, + global, + vals, + len, + @TypeOf(buffered_writer.unbuffered_writer.context), + Writer, + writer, + enable_colors, + true, + true, + ) + else if (message_type != .Trace) + writer.writeAll("undefined\n") catch unreachable; + + if (message_type == .Trace) { + writeTrace(Writer, writer, global); + buffered_writer.flush() catch unreachable; + } + } + + pub fn writeTrace(comptime Writer: type, writer: Writer, global: *JSGlobalObject) void { + var holder = ZigException.Holder.init(); + + var exception = holder.zigException(); + var err = ZigString.init("trace output").toErrorInstance(global); + err.toZigException(global, exception); + JS.VirtualMachine.vm.remapZigException(exception, err, null); + + if (Output.enable_ansi_colors_stderr) + JS.VirtualMachine.printStackTrace( + Writer, + writer, + exception.stack, + true, + ) catch unreachable + else + JS.VirtualMachine.printStackTrace( + Writer, + writer, + exception.stack, + false, + ) catch unreachable; } pub fn format( @@ -1639,9 +1680,9 @@ pub const ZigConsoleClient = struct { response.writeFormat(this, writer_, enable_ansi_colors) catch {}; return; }, - .Headers => { - var obj = priv_data.as(JSC.WebCore.Headers); - obj.writeFormat(this, writer_, enable_ansi_colors) catch {}; + @field(JSPrivateDataPtr.Tag, @typeName(JSC.WebCore.Headers.RefCountedHeaders)) => { + var obj = priv_data.as(JSC.WebCore.Headers.RefCountedHeaders); + obj.leak().writeFormat(this, writer_, enable_ansi_colors) catch {}; return; }, .Request => { |