From 324f6fe16ea5539336de2b38d70a2f453ffd0b42 Mon Sep 17 00:00:00 2001 From: Karl Seguin Date: Fri, 30 Jan 2026 18:38:22 +0800 Subject: [PATCH] Handle catching exception error objects https://github.com/lightpanda-io/browser/issues/1443 --- src/browser/js/Object.zig | 4 ---- src/browser/js/TryCatch.zig | 30 ++++++++++++++++++++++++++++-- 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/src/browser/js/Object.zig b/src/browser/js/Object.zig index 4035eee7..ce814837 100644 --- a/src/browser/js/Object.zig +++ b/src/browser/js/Object.zig @@ -76,10 +76,6 @@ pub fn defineOwnProperty(self: Object, name: []const u8, value: js.Value, attr: } } -pub fn toString(self: Object) ![]const u8 { - return self.local.ctx.valueToString(self.toValue(), .{}); -} - pub fn toValue(self: Object) js.Value { return .{ .local = self.local, diff --git a/src/browser/js/TryCatch.zig b/src/browser/js/TryCatch.zig index 3b2e24f2..f96524c4 100644 --- a/src/browser/js/TryCatch.zig +++ b/src/browser/js/TryCatch.zig @@ -46,12 +46,38 @@ pub fn caught(self: TryCatch, allocator: Allocator) ?Caught { const exception: ?[]const u8 = blk: { const handle = v8.v8__TryCatch__Exception(&self.handle) orelse break :blk null; - break :blk js.String.toSliceWithAlloc(.{ .local = l, .handle = @ptrCast(handle) }, allocator) catch |err| @errorName(err); + var js_val = js.Value{ .local = l, .handle = handle }; + + // If it's an Error object, try to get the message property + if (js_val.isObject()) { + const js_obj = js_val.toObject(); + if (js_obj.has("message")) { + js_val = js_obj.get("message") catch break :blk null; + } + } + + if (js_val.isString()) |js_str| { + break :blk js_str.toSliceWithAlloc(allocator) catch |err| @errorName(err); + } + break :blk null; }; const stack: ?[]const u8 = blk: { const handle = v8.v8__TryCatch__StackTrace(&self.handle, l.handle) orelse break :blk null; - break :blk js.String.toSliceWithAlloc(.{ .local = l, .handle = @ptrCast(handle) }, allocator) catch |err| @errorName(err); + var js_val = js.Value{ .local = l, .handle = handle }; + + // If it's an Error object, try to get the stack property + if (js_val.isObject()) { + const js_obj = js_val.toObject(); + if (js_obj.has("stack")) { + js_val = js_obj.get("stack") catch break :blk null; + } + } + + if (js_val.isString()) |js_str| { + break :blk js_str.toSliceWithAlloc(allocator) catch |err| @errorName(err); + } + break :blk null; }; return .{