diff options
author | 2021-09-02 19:24:35 -0700 | |
---|---|---|
committer | 2021-09-02 19:24:35 -0700 | |
commit | f23d7c5259b9cfe6874484cecb7add5a18255c34 (patch) | |
tree | cfc0ce6d054634843dabd8fee8203f5102d31347 /src | |
parent | d009e02c1db0f93b24a9c1b539135a25347f1027 (diff) | |
download | bun-f23d7c5259b9cfe6874484cecb7add5a18255c34.tar.gz bun-f23d7c5259b9cfe6874484cecb7add5a18255c34.tar.zst bun-f23d7c5259b9cfe6874484cecb7add5a18255c34.zip |
Fix bug with spread properties in function arguments
Former-commit-id: 661fa35a8a0fbd9277682f6bd31cdf85c29481af
Diffstat (limited to 'src')
-rw-r--r-- | src/js_parser/js_parser.zig | 23 |
1 files changed, 11 insertions, 12 deletions
diff --git a/src/js_parser/js_parser.zig b/src/js_parser/js_parser.zig index 92f709557..957da2857 100644 --- a/src/js_parser/js_parser.zig +++ b/src/js_parser/js_parser.zig @@ -3645,7 +3645,7 @@ pub fn NewParser( } // p.markSyntaxFeature(Destructing) - var items = List(js_ast.ArrayBinding).init(p.allocator); + var items = List(js_ast.ArrayBinding).initCapacity(p.allocator, ex.items.len) catch unreachable; var is_spread = true; for (ex.items) |_, i| { var item = ex.items[i]; @@ -3656,18 +3656,18 @@ pub fn NewParser( } const res = p.convertExprToBindingAndInitializer(&item, invalid_loc, is_spread); - items.append(js_ast.ArrayBinding{ + items.appendAssumeCapacity(js_ast.ArrayBinding{ // It's valid for it to be missing // An example: // Promise.all(promises).then(([, len]) => true); // ^ Binding is missing there .binding = res.binding orelse p.b(B.Missing{}, item.loc), .default_value = res.override_expr, - }) catch unreachable; + }); } return p.b(B.Array{ - .items = items.toOwnedSlice(), + .items = items.items, .has_spread = ex.comma_after_spread != null, .is_single_line = ex.is_single_line, }, expr.loc); @@ -3682,7 +3682,7 @@ pub fn NewParser( } // p.markSyntaxFeature(compat.Destructuring, p.source.RangeOfOperatorAfter(expr.Loc, "{")) - var properties = List(B.Property).init(p.allocator); + var properties = List(B.Property).initCapacity(p.allocator, ex.properties.len) catch unreachable; for (ex.properties) |item| { if (item.flags.is_method or item.kind == .get or item.kind == .set) { invalid_loc.append(item.key.?.loc) catch unreachable; @@ -3691,21 +3691,20 @@ pub fn NewParser( var value = &(item.value orelse unreachable); const tup = p.convertExprToBindingAndInitializer(value, invalid_loc, false); const initializer = tup.expr orelse item.initializer; - - properties.append(B.Property{ + const is_spread = item.kind == .spread or item.flags.is_spread; + properties.appendAssumeCapacity(B.Property{ .flags = Flags.Property{ - .is_spread = item.kind == .spread or item.flags.is_spread, + .is_spread = is_spread, .is_computed = item.flags.is_computed, }, - - .key = item.key orelse p.panic("Internal error: Expected {s} to have a key.", .{item}), + .key = (if (is_spread) item.value orelse item.key else item.key) orelse p.panic("Internal error: Expected {s} to have a key.", .{item}), .value = tup.binding orelse p.panic("Internal error: Expected {s} to have a binding.", .{tup}), .default_value = initializer, - }) catch unreachable; + }); } return p.b(B.Object{ - .properties = properties.toOwnedSlice(), + .properties = properties.items, .is_single_line = ex.is_single_line, }, expr.loc); }, |