Skip to content

Commit a97749e

Browse files
committed
getNativeArg, getArg and getArgs can return error
callFunc catches the error and throw a js exception.
1 parent b3eeb05 commit a97749e

File tree

1 file changed

+19
-7
lines changed

1 file changed

+19
-7
lines changed

src/engines/v8/generate.zig

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ fn getNativeArg(
127127
comptime T_refl: refl.Struct,
128128
comptime arg_T: refl.Type,
129129
js_value: v8.Value,
130-
) arg_T.T {
130+
) !arg_T.T {
131131
var value: arg_T.T = undefined;
132132

133133
// JS Null or Undefined value
@@ -163,13 +163,13 @@ fn getArg(
163163
js_val: ?v8.Value,
164164
isolate: v8.Isolate,
165165
js_ctx: v8.Context,
166-
) arg.T {
166+
) !arg.T {
167167
var value: arg.T = undefined;
168168

169169
if (arg.isNative()) {
170170

171171
// native types
172-
value = getNativeArg(gen.Types[arg.T_refl_index.?], arg, js_val.?);
172+
value = try getNativeArg(gen.Types[arg.T_refl_index.?], arg, js_val.?);
173173
} else if (arg.nested_index) |index| {
174174

175175
// nested types (ie. JS anonymous objects)
@@ -272,7 +272,7 @@ fn getArgs(
272272
raw_value: ?*const v8.C_Value,
273273
isolate: v8.Isolate,
274274
js_ctx: v8.Context,
275-
) func.args_T {
275+
) !func.args_T {
276276
var args: func.args_T = undefined;
277277

278278
const js_args_nb = cbk_info.length(raw_value);
@@ -322,7 +322,7 @@ fn getArgs(
322322

323323
// normal cases
324324
else => blk: {
325-
break :blk getArg(
325+
break :blk try getArg(
326326
alloc,
327327
nat_ctx,
328328
T_refl,
@@ -342,7 +342,7 @@ fn getArgs(
342342
const slice = alloc.alloc(arg_real.T, rest_nb) catch unreachable;
343343
var iter: usize = 0;
344344
while (iter < rest_nb) {
345-
const slice_value = getArg(
345+
const slice_value = try getArg(
346346
alloc,
347347
nat_ctx,
348348
T_refl,
@@ -779,7 +779,19 @@ fn callFunc(
779779
raw_value,
780780
isolate,
781781
js_ctx,
782-
);
782+
) catch |err| {
783+
// TODO: how to handle internal errors vs user errors
784+
const js_err = throwError(
785+
nat_ctx.alloc,
786+
nat_ctx,
787+
T_refl,
788+
func,
789+
err,
790+
isolate,
791+
);
792+
cbk_info.getReturnValue().setValueHandle(js_err.handle);
793+
return;
794+
};
783795

784796
// free memory if required
785797
defer freeArgs(nat_ctx.alloc, func, args) catch unreachable;

0 commit comments

Comments
 (0)