Merge pull request #1422 from lightpanda-io/log-on-call-err

always log try/catch error on call function
This commit is contained in:
Karl Seguin
2026-01-28 18:45:02 +08:00
committed by GitHub

View File

@@ -20,6 +20,8 @@ const std = @import("std");
const js = @import("js.zig"); const js = @import("js.zig");
const v8 = js.v8; const v8 = js.v8;
const log = @import("../../log.zig");
const Allocator = std.mem.Allocator; const Allocator = std.mem.Allocator;
const Function = @This(); const Function = @This();
@@ -69,25 +71,30 @@ pub fn newInstance(self: *const Function, caught: *js.TryCatch.Caught) !js.Objec
pub fn call(self: *const Function, comptime T: type, args: anytype) !T { pub fn call(self: *const Function, comptime T: type, args: anytype) !T {
var caught: js.TryCatch.Caught = undefined; var caught: js.TryCatch.Caught = undefined;
return self._tryCallWithThis(T, self.getThis(), args, &caught, false); return self._tryCallWithThis(T, self.getThis(), args, &caught) catch |err| {
log.warn(.js, "call caught", .{ .err = err, .caught = caught });
return err;
};
} }
pub fn callWithThis(self: *const Function, comptime T: type, this: anytype, args: anytype) !T { pub fn callWithThis(self: *const Function, comptime T: type, this: anytype, args: anytype) !T {
var caught: js.TryCatch.Caught = undefined; var caught: js.TryCatch.Caught = undefined;
return self._tryCallWithThis(T, this, args, &caught, false); return self._tryCallWithThis(T, this, args, &caught) catch |err| {
log.warn(.js, "callWithThis caught", .{ .err = err, .caught = caught });
return err;
};
} }
pub fn tryCall(self: *const Function, comptime T: type, args: anytype, caught: *js.TryCatch.Caught) !T { pub fn tryCall(self: *const Function, comptime T: type, args: anytype, caught: *js.TryCatch.Caught) !T {
caught.* = .{}; return self._tryCallWithThis(T, self.getThis(), args, caught);
return self._tryCallWithThis(T, self.getThis(), args, caught, true);
} }
pub fn tryCallWithThis(self: *const Function, comptime T: type, this: anytype, args: anytype, caught: *js.TryCatch.Caught) !T { pub fn tryCallWithThis(self: *const Function, comptime T: type, this: anytype, args: anytype, caught: *js.TryCatch.Caught) !T {
caught.* = .{}; return self._tryCallWithThis(T, this, args, caught);
return self._tryCallWithThis(T, this, args, caught, true);
} }
pub fn _tryCallWithThis(self: *const Function, comptime T: type, this: anytype, args: anytype, caught: *js.TryCatch.Caught, comptime need_caught: bool) !T { pub fn _tryCallWithThis(self: *const Function, comptime T: type, this: anytype, args: anytype, caught: *js.TryCatch.Caught) !T {
caught.* = .{};
const local = self.local; const local = self.local;
// When we're calling a function from within JavaScript itself, this isn't // When we're calling a function from within JavaScript itself, this isn't
@@ -140,11 +147,7 @@ pub fn _tryCallWithThis(self: *const Function, comptime T: type, this: anytype,
defer try_catch.deinit(); defer try_catch.deinit();
const handle = v8.v8__Function__Call(self.handle, local.handle, js_this.handle, @as(c_int, @intCast(js_args.len)), c_args) orelse { const handle = v8.v8__Function__Call(self.handle, local.handle, js_this.handle, @as(c_int, @intCast(js_args.len)), c_args) orelse {
if (comptime need_caught) {
// relatively expensive, so if the caller knows caught won't be needed,
// we can leave it uninitialized.
caught.* = try_catch.caughtOrError(local.call_arena, error.JSExecCallback); caught.* = try_catch.caughtOrError(local.call_arena, error.JSExecCallback);
}
return error.JSExecCallback; return error.JSExecCallback;
}; };