diff options
author | 2022-10-23 22:29:23 -0700 | |
---|---|---|
committer | 2022-10-23 22:29:23 -0700 | |
commit | b3434a8b883ee98324cea2c7d14dd988e6bb8adc (patch) | |
tree | 48113b984416cdffb15198dbef60852cad520cf3 | |
parent | 223ce77ecafe16bf7b314817e06780182dc88c3c (diff) | |
download | bun-b3434a8b883ee98324cea2c7d14dd988e6bb8adc.tar.gz bun-b3434a8b883ee98324cea2c7d14dd988e6bb8adc.tar.zst bun-b3434a8b883ee98324cea2c7d14dd988e6bb8adc.zip |
Add `fd` to `SystemError` and fix 2 cases with invalid tagged union
cc @sno2
-rw-r--r-- | src/bun.js/api/server.zig | 12 | ||||
-rw-r--r-- | src/bun.js/bindings/bindings.cpp | 12 | ||||
-rw-r--r-- | src/bun.js/bindings/bindings.zig | 1 | ||||
-rw-r--r-- | src/bun.js/bindings/exports.zig | 2 | ||||
-rw-r--r-- | src/bun.js/bindings/headers-handwritten.h | 2 | ||||
-rw-r--r-- | src/bun.js/javascript.zig | 2 | ||||
-rw-r--r-- | src/bun.js/node/syscall.zig | 20 |
7 files changed, 42 insertions, 9 deletions
diff --git a/src/bun.js/api/server.zig b/src/bun.js/api/server.zig index 5d851bcc6..5b7394bde 100644 --- a/src/bun.js/api/server.zig +++ b/src/bun.js/api/server.zig @@ -1142,11 +1142,7 @@ fn NewRequestContext(comptime ssl_enabled: bool, comptime debug_mode: bool, comp const stat: std.os.Stat = switch (JSC.Node.Syscall.fstat(fd)) { .result => |result| result, .err => |err| { - var out = std.ArrayList(u8).initCapacity(this.allocator, 16) catch unreachable; - std.fmt.format(out.writer(), "{}", .{file.pathlike}) catch {}; - var zig_string = ZigString.init(out.items); - zig_string.mark(); - this.runErrorHandler(err.withPath(zig_string.toSliceFast(this.allocator).slice()).toSystemError().toErrorInstance( + this.runErrorHandler(err.withPathLike(file.pathlike).toSystemError().toErrorInstance( this.server.globalThis, )); if (auto_close) { @@ -1164,10 +1160,9 @@ fn NewRequestContext(comptime ssl_enabled: bool, comptime debug_mode: bool, comp var err = JSC.Node.Syscall.Error{ .errno = @intCast(JSC.Node.Syscall.Error.Int, @enumToInt(std.os.E.INVAL)), - .path = file.pathlike.path.slice(), .syscall = .sendfile, }; - var sys = err.toSystemError(); + var sys = err.withPathLike(file.pathlike).toSystemError(); sys.message = ZigString.init("MacOS does not support sending non-regular files"); this.runErrorHandler(sys.toErrorInstance( this.server.globalThis, @@ -1184,10 +1179,9 @@ fn NewRequestContext(comptime ssl_enabled: bool, comptime debug_mode: bool, comp var err = JSC.Node.Syscall.Error{ .errno = @intCast(JSC.Node.Syscall.Error.Int, @enumToInt(std.os.E.INVAL)), - .path = file.pathlike.path.slice(), .syscall = .sendfile, }; - var sys = err.toSystemError(); + var sys = err.withPathLike(file.pathlike).toSystemError(); sys.message = ZigString.init("File must be regular or FIFO"); this.runErrorHandler(sys.toErrorInstance( this.server.globalThis, diff --git a/src/bun.js/bindings/bindings.cpp b/src/bun.js/bindings/bindings.cpp index d0de85849..3500c32e5 100644 --- a/src/bun.js/bindings/bindings.cpp +++ b/src/bun.js/bindings/bindings.cpp @@ -417,6 +417,12 @@ JSC__JSValue SystemError__toErrorInstance(const SystemError* arg0, JSC::PropertyAttribute::DontDelete | 0); } + if (err.fd != -1) { + JSC::JSValue fd = JSC::JSValue(jsNumber(err.fd)); + result->putDirect(vm, JSC::Identifier::fromString(vm, "fd"_s), fd, + JSC::PropertyAttribute::DontDelete | 0); + } + if (err.syscall.len > 0) { JSC::JSValue syscall = JSC::JSValue(Zig::toJSString(err.syscall, globalObject)); result->putDirect(vm, clientData->builtinNames().syscallPublicName(), syscall, @@ -2392,6 +2398,12 @@ static void fromErrorInstance(ZigException* except, JSC::JSGlobalObject* global, except->path = Zig::toZigString(path, global); } + if (JSC::JSValue fd = obj->getIfPropertyExists(global, Identifier::fromString(global->vm(), "fd"_s))) { + if (fd.isAnyInt()) { + except->fd = fd.toInt32(global); + } + } + if (JSC::JSValue errno_ = obj->getIfPropertyExists(global, clientData->builtinNames().errnoPublicName())) { except->errno_ = errno_.toInt32(global); } diff --git a/src/bun.js/bindings/bindings.zig b/src/bun.js/bindings/bindings.zig index a8737dd54..6a89db7b9 100644 --- a/src/bun.js/bindings/bindings.zig +++ b/src/bun.js/bindings/bindings.zig @@ -1092,6 +1092,7 @@ pub const SystemError = extern struct { message: ZigString = ZigString.init(""), path: ZigString = ZigString.init(""), syscall: ZigString = ZigString.init(""), + fd: i32 = -1, pub fn Maybe(comptime Result: type) type { return union(enum) { diff --git a/src/bun.js/bindings/exports.zig b/src/bun.js/bindings/exports.zig index 566af6f19..fb2d45c45 100644 --- a/src/bun.js/bindings/exports.zig +++ b/src/bun.js/bindings/exports.zig @@ -767,6 +767,8 @@ pub const ZigException = extern struct { remapped: bool = false, + fd: i32 = -1, + pub const shim = Shimmer("Zig", "Exception", @This()); pub const name = "ZigException"; pub const namespace = shim.namespace; diff --git a/src/bun.js/bindings/headers-handwritten.h b/src/bun.js/bindings/headers-handwritten.h index c1ae195de..4843802f7 100644 --- a/src/bun.js/bindings/headers-handwritten.h +++ b/src/bun.js/bindings/headers-handwritten.h @@ -42,6 +42,7 @@ typedef struct SystemError { ZigString message; ZigString path; ZigString syscall; + int fd; } SystemError; typedef void* ArrayBufferSink; @@ -101,6 +102,7 @@ typedef struct ZigException { ZigStackTrace stack; void* exception; bool remapped; + int fd; } ZigException; typedef uint8_t JSErrorCode; diff --git a/src/bun.js/javascript.zig b/src/bun.js/javascript.zig index 9ba69aaa2..a5297e90c 100644 --- a/src/bun.js/javascript.zig +++ b/src/bun.js/javascript.zig @@ -2009,6 +2009,7 @@ pub const VirtualMachine = struct { syscall: bool = false, errno: bool = false, path: bool = false, + fd: bool = false, }; var show = Show{ @@ -2016,6 +2017,7 @@ pub const VirtualMachine = struct { .syscall = exception.syscall.len > 0, .errno = exception.errno < 0, .path = exception.path.len > 0, + .fd = exception.fd != -1, }; if (show.path) { diff --git a/src/bun.js/node/syscall.zig b/src/bun.js/node/syscall.zig index fddd0a8df..c2d13ea59 100644 --- a/src/bun.js/node/syscall.zig +++ b/src/bun.js/node/syscall.zig @@ -565,6 +565,7 @@ pub const Error = struct { errno: Int, syscall: Syscall.Tag = @intToEnum(Syscall.Tag, 0), path: []const u8 = "", + fd: i32 = -1, pub inline fn isRetry(this: *const Error) bool { return this.getErrno() == .AGAIN; @@ -598,6 +599,21 @@ pub const Error = struct { }; } + pub inline fn withFd(this: Error, fd: anytype) Error { + return Error{ + .errno = this.errno, + .syscall = this.syscall, + .fd = @intCast(i32, fd), + }; + } + + pub inline fn withPathLike(this: Error, pathlike: anytype) Error { + return switch (pathlike) { + .fd => |fd| this.withFd(fd), + .path => |path| this.withPath(path.slice()), + }; + } + pub inline fn withSyscall(this: Error, syscall: Syscall) Error { return Error{ .errno = this.errno, @@ -628,6 +644,10 @@ pub const Error = struct { err.path = JSC.ZigString.init(this.path); } + if (this.fd != -1) { + err.fd = this.fd; + } + return err; } |