aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Jarred Sumner <jarred@jarredsumner.com> 2022-03-14 01:32:13 -0700
committerGravatar Jarred Sumner <jarred@jarredsumner.com> 2022-03-14 01:32:13 -0700
commit0e9056eca58be783c95773ba7e2c883fde318977 (patch)
treeec20958f83875af3ec56052b42a80cb74e3624a0 /src
parent4ab4ae77ac5ab51e0cc028c02d80613c817b8825 (diff)
downloadbun-0e9056eca58be783c95773ba7e2c883fde318977.tar.gz
bun-0e9056eca58be783c95773ba7e2c883fde318977.tar.zst
bun-0e9056eca58be783c95773ba7e2c883fde318977.zip
[bun.js] Implement `console.trace()`
Diffstat (limited to 'src')
-rw-r--r--src/javascript/jsc/bindings/exports.zig73
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 => {