From c16c1f86bcf785db1809f27e4722edb4be01252c Mon Sep 17 00:00:00 2001 From: Pierre Tachoire Date: Thu, 18 Jan 2024 16:09:17 +0100 Subject: [PATCH] getNativeArg: return a TypeError if js value is not an object --- src/engines/v8/generate.zig | 12 ++++++++++-- src/tests/types_native_test.zig | 3 +-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/engines/v8/generate.zig b/src/engines/v8/generate.zig index e37d902..4877845 100644 --- a/src/engines/v8/generate.zig +++ b/src/engines/v8/generate.zig @@ -22,6 +22,10 @@ const TPL = @import("v8.zig").TPL; // Utils functions // --------------- +const JSError = error{ + InvalidArgument, +}; + fn throwBasicError(msg: []const u8, isolate: v8.Isolate) v8.Value { const except_msg = v8.String.initUtf8(isolate, msg); const exception = v8.Exception.initError(except_msg); @@ -36,6 +40,11 @@ fn throwError( err: anyerror, isolate: v8.Isolate, ) v8.Value { + // well known error. + switch (err) { + JSError.InvalidArgument => return throwTypeError("invalid argument", isolate), + else => {}, + } const ret = func.return_type; // Is the returned Type a custom Exception error? @@ -136,10 +145,9 @@ fn getNativeArg( if (comptime arg_T.underOpt() != null) { return null; } - // TODO: else return error "Argument x is not an object" } - if (!js_value.isObject()) unreachable; // TODO: throw js exception + if (!js_value.isObject()) return JSError.InvalidArgument; // JS object const ptr = getNativeObject( diff --git a/src/tests/types_native_test.zig b/src/tests/types_native_test.zig index 144b1c6..8e31440 100644 --- a/src/tests/types_native_test.zig +++ b/src/tests/types_native_test.zig @@ -293,8 +293,7 @@ pub fn exec( // not. // https://github.com/lightpanda-io/jsruntime-lib/issues/185 var bug_native_obj = [_]tests.Case{ - .{ .src = "let car = new Car();", .ex = "undefined" }, - .{ .src = "car.changeBrand('foo');", .ex = "true" }, + .{ .src = "try { car.changeBrand('foo'); false; } catch(e) { e instanceof TypeError; }", .ex = "true" }, }; try tests.checkCases(js_env, &bug_native_obj); }