diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/js_ast.zig | 15 | ||||
-rw-r--r-- | src/js_parser.zig | 2 |
2 files changed, 12 insertions, 5 deletions
diff --git a/src/js_ast.zig b/src/js_ast.zig index 3b17240c0..8b745742b 100644 --- a/src/js_ast.zig +++ b/src/js_ast.zig @@ -7278,8 +7278,9 @@ pub const Macro = struct { exception_holder = Zig.ZigException.Holder.init(); var js_args: []JSC.JSValue = &.{}; + var js_processed_args_len: usize = 0; defer { - for (js_args[0 .. js_args.len - @as(usize, @intFromBool(!javascript_object.isEmpty()))]) |arg| { + for (js_args[0..js_processed_args_len -| @as(usize, @intFromBool(!javascript_object.isEmpty()))]) |arg| { arg.unprotect(); } @@ -7292,12 +7293,18 @@ pub const Macro = struct { .e_call => |call| { const call_args: []Expr = call.args.slice(); js_args = try allocator.alloc(JSC.JSValue, call_args.len + @as(usize, @intFromBool(!javascript_object.isEmpty()))); + js_processed_args_len = js_args.len; - for (call_args, js_args[0..call_args.len]) |in, *out| { - const value = try in.toJS( + for (0.., call_args, js_args[0..call_args.len]) |i, in, *out| { + const value = in.toJS( allocator, globalObject, - ); + ) catch |e| { + // Keeping a separate variable instead of modifying js_args.len + // due to allocator.free call in defer + js_processed_args_len = i; + return e; + }; value.protect(); out.* = value; } diff --git a/src/js_parser.zig b/src/js_parser.zig index fce928a6e..f569f515f 100644 --- a/src/js_parser.zig +++ b/src/js_parser.zig @@ -16389,7 +16389,7 @@ fn NewParser_( p.log.addError(p.source, expr.loc, "macro threw exception") catch unreachable; } } else { - p.log.addErrorFmt(p.source, expr.loc, p.allocator, "{s} error in macro", .{@errorName(err)}) catch unreachable; + p.log.addErrorFmt(p.source, expr.loc, p.allocator, "\"{s}\" error in macro", .{@errorName(err)}) catch unreachable; } return expr; }; |