diff options
-rw-r--r-- | src/bun.js/base.zig | 30 | ||||
-rw-r--r-- | test/js/bun/ffi/ffi.test.js | 10 |
2 files changed, 22 insertions, 18 deletions
diff --git a/src/bun.js/base.zig b/src/bun.js/base.zig index 7fe37dd97..9ebc7f594 100644 --- a/src/bun.js/base.zig +++ b/src/bun.js/base.zig @@ -2736,8 +2736,10 @@ pub fn wrapWithHasContainer( exception: js.ExceptionRef, ) js.JSObjectRef { var iter = JSC.Node.ArgumentsSlice.from(ctx.bunVM(), arguments); + defer iter.deinit(); var args: Args = undefined; + comptime var passed_exception_ref = false; comptime var i: usize = 0; inline while (i < FunctionTypeInfo.params.len) : (i += 1) { const ArgType = comptime FunctionTypeInfo.params[i].type.?; @@ -2752,12 +2754,10 @@ pub fn wrapWithHasContainer( JSC.Node.StringOrBuffer => { const arg = iter.nextEat() orelse { exception.* = JSC.toInvalidArguments("expected string or buffer", .{}, ctx).asObjectRef(); - iter.deinit(); return null; }; args[i] = JSC.Node.StringOrBuffer.fromJS(ctx.ptr(), iter.arena.allocator(), arg, exception) orelse { exception.* = JSC.toInvalidArguments("expected string or buffer", .{}, ctx).asObjectRef(); - iter.deinit(); return null; }; }, @@ -2766,7 +2766,6 @@ pub fn wrapWithHasContainer( if (!arg.isEmptyOrUndefinedOrNull()) { args[i] = JSC.Node.StringOrBuffer.fromJS(ctx.ptr(), iter.arena.allocator(), arg, exception) orelse { exception.* = JSC.toInvalidArguments("expected string or buffer", .{}, ctx).asObjectRef(); - iter.deinit(); return null; }; } else { @@ -2781,7 +2780,6 @@ pub fn wrapWithHasContainer( if (!arg.isEmptyOrUndefinedOrNull()) { args[i] = JSC.Node.SliceOrBuffer.fromJS(ctx.ptr(), iter.arena.allocator(), arg, exception) orelse { exception.* = JSC.toInvalidArguments("expected string or buffer", .{}, ctx).asObjectRef(); - iter.deinit(); return null; }; } else { @@ -2795,12 +2793,10 @@ pub fn wrapWithHasContainer( if (iter.nextEat()) |arg| { args[i] = arg.asArrayBuffer(ctx.ptr()) orelse { exception.* = JSC.toInvalidArguments("expected TypedArray", .{}, ctx).asObjectRef(); - iter.deinit(); return null; }; } else { exception.* = JSC.toInvalidArguments("expected TypedArray", .{}, ctx).asObjectRef(); - iter.deinit(); return null; } }, @@ -2809,7 +2805,6 @@ pub fn wrapWithHasContainer( if (!arg.isEmptyOrUndefinedOrNull()) { args[i] = arg.asArrayBuffer(ctx.ptr()) orelse { exception.* = JSC.toInvalidArguments("expected TypedArray", .{}, ctx).asObjectRef(); - iter.deinit(); return null; }; } else { @@ -2822,13 +2817,11 @@ pub fn wrapWithHasContainer( ZigString => { var string_value = eater(&iter) orelse { JSC.throwInvalidArguments("Missing argument", .{}, ctx, exception); - iter.deinit(); return null; }; if (string_value.isUndefinedOrNull()) { JSC.throwInvalidArguments("Expected string", .{}, ctx, exception); - iter.deinit(); return null; } @@ -2857,11 +2850,9 @@ pub fn wrapWithHasContainer( *Request => { args[i] = (eater(&iter) orelse { JSC.throwInvalidArguments("Missing Request object", .{}, ctx, exception); - iter.deinit(); return null; }).as(Request) orelse { JSC.throwInvalidArguments("Expected Request object", .{}, ctx, exception); - iter.deinit(); return null; }; }, @@ -2869,17 +2860,16 @@ pub fn wrapWithHasContainer( args[i] = thisObject; if (!JSValue.fromRef(thisObject).isCell() or !JSValue.fromRef(thisObject).isObject()) { JSC.throwInvalidArguments("Expected object", .{}, ctx, exception); - iter.deinit(); return null; } }, js.ExceptionRef => { args[i] = exception; + passed_exception_ref = true; }, JSValue => { const val = eater(&iter) orelse { JSC.throwInvalidArguments("Missing argument", .{}, ctx, exception); - iter.deinit(); return null; }; args[i] = val; @@ -2892,9 +2882,15 @@ pub fn wrapWithHasContainer( } var result: JSValue = @call(.auto, @field(Container, name), args); - if (exception.* != null) { - iter.deinit(); - return null; + if (comptime passed_exception_ref) { + if (exception.* != null) { + return null; + } + } else { + if (result.isError()) { + exception.* = result.asObjectRef(); + return null; + } } if (comptime maybe_async) { @@ -2905,8 +2901,6 @@ pub fn wrapWithHasContainer( } } - iter.deinit(); - if (result == .zero) { return null; } diff --git a/test/js/bun/ffi/ffi.test.js b/test/js/bun/ffi/ffi.test.js index 8b31280c9..c54a3d3d9 100644 --- a/test/js/bun/ffi/ffi.test.js +++ b/test/js/bun/ffi/ffi.test.js @@ -616,3 +616,13 @@ if (ok) { } else { it.skip("run ffi", () => {}); } + +it("dlopen throws an error instead of returning it", () => { + let err; + try { + dlopen("nonexistent", { x: {} }); + } catch (error) { + err = error; + } + expect(err).toBeTruthy(); +}); |