Skip to content

Commit b69ae8f

Browse files
authoredAug 6, 2023
fix(es/compat): Fix loose mode of the spread pass (#7760)
1 parent 97289b4 commit b69ae8f

File tree

4 files changed

+77
-2
lines changed

4 files changed

+77
-2
lines changed
 
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
{
2+
"jsc": {
3+
"parser": {
4+
"syntax": "ecmascript",
5+
"jsx": false
6+
},
7+
"target": "es5",
8+
"loose": true
9+
},
10+
"isModule": false
11+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
[
2+
1,
3+
2,
4+
...['foo', 3],
5+
4,
6+
...['bar', 5],
7+
['baz', 6],
8+
7,
9+
8,
10+
9,
11+
]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
[].concat([
2+
1,
3+
2
4+
], [
5+
"foo",
6+
3
7+
], [
8+
4
9+
], [
10+
"bar",
11+
5
12+
], [
13+
[
14+
"baz",
15+
6
16+
],
17+
7,
18+
8,
19+
9
20+
]);

‎crates/swc_ecma_transforms_compat/src/es2015/spread.rs

+35-2
Original file line numberDiff line numberDiff line change
@@ -251,12 +251,45 @@ impl Spread {
251251
};
252252
}
253253

254-
// shorthand [].concat(arr1, arr2) shoule be used under loose mode
254+
// Shorthand [].concat(arr1, arr2) should be used under loose mode.
255+
// Array.prototype.concat has the lovely feature by which arrays passed
256+
// to it are depth-1 flattened. This effectively implements the loose
257+
// spread. But if any arrays that are not being spread are present, they
258+
// will be incorrectly flattened. The solution is to wrap every
259+
// contiguous slice of non-spread args in an array, which will protect
260+
// array args from being flattened.
255261
if self.c.loose {
256262
let mut arg_list = vec![];
263+
let mut current_elems = vec![];
257264
for arg in args.flatten() {
258265
let expr = arg.expr;
259-
arg_list.push(expr.as_arg());
266+
match arg.spread {
267+
Some(_) => {
268+
if !current_elems.is_empty() {
269+
arg_list.push(
270+
ArrayLit {
271+
span: DUMMY_SP,
272+
elems: current_elems,
273+
}
274+
.as_arg(),
275+
);
276+
current_elems = vec![];
277+
}
278+
arg_list.push(expr.as_arg());
279+
}
280+
None => {
281+
current_elems.push(Some(expr.as_arg()));
282+
}
283+
}
284+
}
285+
if !current_elems.is_empty() {
286+
arg_list.push(
287+
ArrayLit {
288+
span: DUMMY_SP,
289+
elems: current_elems,
290+
}
291+
.as_arg(),
292+
);
260293
}
261294

262295
return Expr::Call(CallExpr {

1 commit comments

Comments
 (1)

github-actions[bot] commented on Aug 7, 2023

@github-actions[bot]

Benchmark

Benchmark suite Current: b69ae8f Previous: e50cfde Ratio
es/full/bugs-1 291452 ns/iter (± 8129) 304611 ns/iter (± 6064) 0.96
es/full/minify/libraries/antd 1310136475 ns/iter (± 12818778) 1351980626 ns/iter (± 13265254) 0.97
es/full/minify/libraries/d3 283337256 ns/iter (± 4852130) 287109775 ns/iter (± 5171984) 0.99
es/full/minify/libraries/echarts 1062681650 ns/iter (± 7669528) 1113357930 ns/iter (± 15877315) 0.95
es/full/minify/libraries/jquery 84881586 ns/iter (± 200370) 85627841 ns/iter (± 292509) 0.99
es/full/minify/libraries/lodash 98815755 ns/iter (± 297775) 99406274 ns/iter (± 440203) 0.99
es/full/minify/libraries/moment 49988976 ns/iter (± 89177) 50170311 ns/iter (± 169746) 1.00
es/full/minify/libraries/react 18000209 ns/iter (± 42022) 18179381 ns/iter (± 88470) 0.99
es/full/minify/libraries/terser 220096590 ns/iter (± 2163411) 226528784 ns/iter (± 2479283) 0.97
es/full/minify/libraries/three 388068368 ns/iter (± 1542129) 409311239 ns/iter (± 8795904) 0.95
es/full/minify/libraries/typescript 2688971799 ns/iter (± 11255499) 2755793001 ns/iter (± 11567024) 0.98
es/full/minify/libraries/victory 564446598 ns/iter (± 4384572) 585847601 ns/iter (± 13282001) 0.96
es/full/minify/libraries/vue 120673841 ns/iter (± 332847) 122059951 ns/iter (± 675238) 0.99
es/full/codegen/es3 33913 ns/iter (± 111) 34313 ns/iter (± 69) 0.99
es/full/codegen/es5 33812 ns/iter (± 104) 34197 ns/iter (± 117) 0.99
es/full/codegen/es2015 33884 ns/iter (± 104) 34277 ns/iter (± 111) 0.99
es/full/codegen/es2016 33858 ns/iter (± 110) 34221 ns/iter (± 66) 0.99
es/full/codegen/es2017 33908 ns/iter (± 89) 34265 ns/iter (± 162) 0.99
es/full/codegen/es2018 33897 ns/iter (± 122) 34256 ns/iter (± 88) 0.99
es/full/codegen/es2019 33864 ns/iter (± 138) 34285 ns/iter (± 103) 0.99
es/full/codegen/es2020 33902 ns/iter (± 146) 34229 ns/iter (± 88) 0.99
es/full/all/es3 172669283 ns/iter (± 1284687) 173302261 ns/iter (± 669232) 1.00
es/full/all/es5 163572272 ns/iter (± 966224) 164834820 ns/iter (± 2076179) 0.99
es/full/all/es2015 123757811 ns/iter (± 744978) 125405254 ns/iter (± 985763) 0.99
es/full/all/es2016 122415457 ns/iter (± 777498) 124114410 ns/iter (± 1021988) 0.99
es/full/all/es2017 121754354 ns/iter (± 828884) 123728469 ns/iter (± 472193) 0.98
es/full/all/es2018 119469435 ns/iter (± 745330) 121482747 ns/iter (± 876580) 0.98
es/full/all/es2019 119001900 ns/iter (± 1012503) 121123844 ns/iter (± 1003417) 0.98
es/full/all/es2020 113711561 ns/iter (± 906171) 116068942 ns/iter (± 795746) 0.98
es/full/parser 530895 ns/iter (± 5980) 538508 ns/iter (± 6570) 0.99
es/full/base/fixer 18144 ns/iter (± 190) 17190 ns/iter (± 73) 1.06
es/full/base/resolver_and_hygiene 81024 ns/iter (± 245) 80343 ns/iter (± 93) 1.01
serialization of serde 300 ns/iter (± 2) 294 ns/iter (± 0) 1.02
css/minify/libraries/bootstrap 28137144 ns/iter (± 155328) 30159893 ns/iter (± 304748) 0.93
css/visitor/compare/clone 1629180 ns/iter (± 2363) 1644030 ns/iter (± 4263) 0.99
css/visitor/compare/visit_mut_span 1774596 ns/iter (± 9783) 1768789 ns/iter (± 5336) 1.00
css/visitor/compare/visit_mut_span_panic 1854224 ns/iter (± 6123) 1854257 ns/iter (± 5601) 1.00
css/visitor/compare/fold_span 2609360 ns/iter (± 16198) 2588600 ns/iter (± 13902) 1.01
css/visitor/compare/fold_span_panic 2765746 ns/iter (± 17962) 2765447 ns/iter (± 17797) 1.00
css/lexer/bootstrap_5_1_3 4400582 ns/iter (± 3559) 4545648 ns/iter (± 11648) 0.97
css/lexer/foundation_6_7_4 3699952 ns/iter (± 2222) 3839590 ns/iter (± 2693) 0.96
css/lexer/tailwind_3_1_1 703566 ns/iter (± 341) 724657 ns/iter (± 840) 0.97
css/parser/bootstrap_5_1_3 19654874 ns/iter (± 27145) 18826427 ns/iter (± 43795) 1.04
css/parser/foundation_6_7_4 15885087 ns/iter (± 22168) 15128825 ns/iter (± 336787) 1.05
css/parser/tailwind_3_1_1 3031988 ns/iter (± 5598) 2930432 ns/iter (± 7372) 1.03
es/codegen/colors 739125 ns/iter (± 406214) 736931 ns/iter (± 404624) 1.00
es/codegen/large 2901337 ns/iter (± 1528604) 3142810 ns/iter (± 1677548) 0.92
es/codegen/with-parser/colors 45074 ns/iter (± 181) 45417 ns/iter (± 482) 0.99
es/codegen/with-parser/large 496948 ns/iter (± 1908) 483585 ns/iter (± 1150) 1.03
es/minify/libraries/antd 1151406924 ns/iter (± 14087365) 1194922172 ns/iter (± 14047234) 0.96
es/minify/libraries/d3 244792279 ns/iter (± 1664646) 244916359 ns/iter (± 2415276) 1.00
es/minify/libraries/echarts 924180348 ns/iter (± 15870465) 951955854 ns/iter (± 13297754) 0.97
es/minify/libraries/jquery 74212079 ns/iter (± 176122) 74710698 ns/iter (± 1083377) 0.99
es/minify/libraries/lodash 89968283 ns/iter (± 184435) 89000965 ns/iter (± 294654) 1.01
es/minify/libraries/moment 43814745 ns/iter (± 280635) 43839026 ns/iter (± 212452) 1.00
es/minify/libraries/react 16025188 ns/iter (± 17682) 16144960 ns/iter (± 56754) 0.99
es/minify/libraries/terser 189154695 ns/iter (± 1118452) 191433556 ns/iter (± 3337827) 0.99
es/minify/libraries/three 336427364 ns/iter (± 4404057) 330535480 ns/iter (± 4183569) 1.02
es/minify/libraries/typescript 2297939915 ns/iter (± 15860531) 2331996731 ns/iter (± 23379655) 0.99
es/minify/libraries/victory 477804203 ns/iter (± 5844066) 495862824 ns/iter (± 8265547) 0.96
es/minify/libraries/vue 107797097 ns/iter (± 263752) 109825185 ns/iter (± 1035668) 0.98
es/visitor/compare/clone 1921777 ns/iter (± 6900) 1967309 ns/iter (± 5985) 0.98
es/visitor/compare/visit_mut_span 2262674 ns/iter (± 7858) 2286596 ns/iter (± 8099) 0.99
es/visitor/compare/visit_mut_span_panic 2300957 ns/iter (± 4725) 2339690 ns/iter (± 4159) 0.98
es/visitor/compare/fold_span 3330062 ns/iter (± 6090) 3390957 ns/iter (± 9847) 0.98
es/visitor/compare/fold_span_panic 3459331 ns/iter (± 8030) 3545470 ns/iter (± 14466) 0.98
es/lexer/colors 13040 ns/iter (± 41) 13289 ns/iter (± 28) 0.98
es/lexer/angular 6039514 ns/iter (± 2304) 6095098 ns/iter (± 5032) 0.99
es/lexer/backbone 778081 ns/iter (± 1327) 795510 ns/iter (± 478) 0.98
es/lexer/jquery 4397251 ns/iter (± 4151) 4512857 ns/iter (± 7061) 0.97
es/lexer/jquery mobile 6757569 ns/iter (± 6888) 6894191 ns/iter (± 3812) 0.98
es/lexer/mootools 3494119 ns/iter (± 3869) 3568940 ns/iter (± 4574) 0.98
es/lexer/underscore 650005 ns/iter (± 415) 675493 ns/iter (± 797) 0.96
es/lexer/three 20948970 ns/iter (± 17199) 21417600 ns/iter (± 24584) 0.98
es/lexer/yui 3777819 ns/iter (± 1694) 3867867 ns/iter (± 4699) 0.98
es/parser/colors 27258 ns/iter (± 70) 27114 ns/iter (± 47) 1.01
es/parser/angular 13630019 ns/iter (± 55096) 13638878 ns/iter (± 94419) 1.00
es/parser/backbone 2030416 ns/iter (± 8188) 2000314 ns/iter (± 11183) 1.02
es/parser/jquery 10990422 ns/iter (± 45832) 10962032 ns/iter (± 89225) 1.00
es/parser/jquery mobile 16872763 ns/iter (± 44358) 16794036 ns/iter (± 171872) 1.00
es/parser/mootools 8479248 ns/iter (± 22512) 8418050 ns/iter (± 31758) 1.01
es/parser/underscore 1747614 ns/iter (± 8997) 1730913 ns/iter (± 11081) 1.01
es/parser/three 47758185 ns/iter (± 461081) 48206891 ns/iter (± 435035) 0.99
es/parser/yui 8310818 ns/iter (± 51604) 8270789 ns/iter (± 35678) 1.00
es/preset-env/usage/builtin_type 137957 ns/iter (± 32106) 138288 ns/iter (± 32666) 1.00
es/preset-env/usage/property 16489 ns/iter (± 62) 16637 ns/iter (± 35) 0.99
es/resolver/typescript 89002822 ns/iter (± 1138258) 90815550 ns/iter (± 1030956) 0.98
es/fixer/typescript 64636956 ns/iter (± 549887) 65088772 ns/iter (± 732016) 0.99
es/hygiene/typescript 130328161 ns/iter (± 1247508) 133423600 ns/iter (± 1019738) 0.98
es/resolver_with_hygiene/typescript 243721284 ns/iter (± 1390082) 248468567 ns/iter (± 3262527) 0.98
es/visitor/base-perf/module_clone 60220 ns/iter (± 283) 58671 ns/iter (± 140) 1.03
es/visitor/base-perf/fold_empty 63992 ns/iter (± 488) 62376 ns/iter (± 237) 1.03
es/visitor/base-perf/fold_noop_impl_all 64098 ns/iter (± 1428) 63209 ns/iter (± 640) 1.01
es/visitor/base-perf/fold_noop_impl_vec 63239 ns/iter (± 247) 63020 ns/iter (± 423) 1.00
es/visitor/base-perf/boxing_boxed_clone 56 ns/iter (± 0) 58 ns/iter (± 0) 0.97
es/visitor/base-perf/boxing_unboxed_clone 39 ns/iter (± 0) 39 ns/iter (± 0) 1
es/visitor/base-perf/boxing_boxed 106 ns/iter (± 0) 109 ns/iter (± 0) 0.97
es/visitor/base-perf/boxing_unboxed 75 ns/iter (± 0) 77 ns/iter (± 0) 0.97
es/visitor/base-perf/visit_empty 0 ns/iter (± 0) 0 ns/iter (± 0) NaN
es/visitor/base-perf/visit_contains_this 2523 ns/iter (± 14) 2536 ns/iter (± 10) 0.99
es/base/parallel/resolver/typescript 3783977692 ns/iter (± 224010862) 4190055955 ns/iter (± 196233678) 0.90
es/base/parallel/hygiene/typescript 1451130430 ns/iter (± 10839597) 1462052990 ns/iter (± 15382848) 0.99
misc/visitors/time-complexity/time 5 136 ns/iter (± 2) 156 ns/iter (± 5) 0.87
misc/visitors/time-complexity/time 10 375 ns/iter (± 5) 404 ns/iter (± 15) 0.93
misc/visitors/time-complexity/time 15 671 ns/iter (± 8) 901 ns/iter (± 26) 0.74
misc/visitors/time-complexity/time 20 1053 ns/iter (± 21) 1496 ns/iter (± 88) 0.70
misc/visitors/time-complexity/time 40 3600 ns/iter (± 158) 4359 ns/iter (± 274) 0.83
misc/visitors/time-complexity/time 60 8233 ns/iter (± 4) 11120 ns/iter (± 669) 0.74
es/full-target/es2016 230231 ns/iter (± 807) 232627 ns/iter (± 405) 0.99
es/full-target/es2017 219617 ns/iter (± 812) 222057 ns/iter (± 873) 0.99
es/full-target/es2018 209698 ns/iter (± 746) 209120 ns/iter (± 675) 1.00
es2020_nullish_coalescing 68969 ns/iter (± 352) 70224 ns/iter (± 226) 0.98
es2020_optional_chaining 76588 ns/iter (± 169) 81869 ns/iter (± 344) 0.94
es2022_class_properties 117553 ns/iter (± 325) 119609 ns/iter (± 334) 0.98
es2018_object_rest_spread 72707 ns/iter (± 215) 76278 ns/iter (± 504) 0.95
es2019_optional_catch_binding 62273 ns/iter (± 228) 64075 ns/iter (± 193) 0.97
es2017_async_to_generator 62540 ns/iter (± 271) 64376 ns/iter (± 178) 0.97
es2016_exponentiation 66262 ns/iter (± 299) 69222 ns/iter (± 231) 0.96
es2015_arrow 69843 ns/iter (± 206) 72477 ns/iter (± 195) 0.96
es2015_block_scoped_fn 66947 ns/iter (± 217) 68117 ns/iter (± 276) 0.98
es2015_block_scoping 117722 ns/iter (± 745) 123642 ns/iter (± 637) 0.95

This comment was automatically generated by workflow using github-action-benchmark.

Please sign in to comment.