aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/bun.js/api/server.zig12
-rw-r--r--src/bun.js/bindings/bindings.cpp12
-rw-r--r--src/bun.js/bindings/bindings.zig1
-rw-r--r--src/bun.js/bindings/exports.zig2
-rw-r--r--src/bun.js/bindings/headers-handwritten.h2
-rw-r--r--src/bun.js/javascript.zig2
-rw-r--r--src/bun.js/node/syscall.zig20
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;
}