Skip to content

Commit 56e9454

Browse files
authored
fix corner case with spread syntax (#5572)
1 parent d67daa8 commit 56e9454

File tree

3 files changed

+80
-44
lines changed

3 files changed

+80
-44
lines changed

lib/parse.js

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -552,16 +552,8 @@ function tokenizer($TEXT, filename, html5_comments, shebang) {
552552

553553
function handle_dot() {
554554
next();
555-
var ch = peek();
556-
if (ch == ".") {
557-
var op = ".";
558-
do {
559-
op += ".";
560-
next();
561-
} while (peek() == ".");
562-
return token("operator", op);
563-
}
564-
return is_digit(ch.charCodeAt(0)) ? read_num(".") : token("punc", ".");
555+
if (looking_at("..")) return token("operator", "." + next() + next());
556+
return is_digit(peek().charCodeAt(0)) ? read_num(".") : token("punc", ".");
565557
}
566558

567559
function read_word() {

test/compress/spreads.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,12 @@
1+
decimal: {
2+
input: {
3+
console.log({... 0.42});
4+
}
5+
expect_exact: "console.log({....42});"
6+
expect_stdout: "{}"
7+
node_version: ">=8.3.0"
8+
}
9+
110
collapse_vars_1: {
211
options = {
312
collapse_vars: true,

test/mozilla-ast.js

Lines changed: 69 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -61,12 +61,12 @@ function test(input, to_moz, description, skip_on_error, beautified) {
6161
var ast = UglifyJS.AST_Node.from_mozilla_ast(to_moz(input));
6262
} catch (e) {
6363
if (skip_on_error) return true;
64-
console.log("//=============================================================");
65-
console.log("//", description, "failed... round", round);
66-
console.log(e);
67-
console.log("// original code");
68-
if (beautified === true) console.log("// (beautified)");
69-
console.log(input.code);
64+
console.error("//=============================================================");
65+
console.error("//", description, "failed... round", round);
66+
console.error(e);
67+
console.error("// original code");
68+
if (beautified === true) console.error("// (beautified)");
69+
console.error(input.code);
7070
return false;
7171
}
7272
var transformed = validate(ast);
@@ -78,34 +78,34 @@ function test(input, to_moz, description, skip_on_error, beautified) {
7878
if (!test(beautified, to_moz, description, skip_on_error, true)) return false;
7979
}
8080
}
81-
console.log("//=============================================================");
82-
console.log("// !!!!!! Failed... round", round);
83-
console.log("// original code");
81+
console.error("//=============================================================");
82+
console.error("// !!!!!! Failed... round", round);
83+
console.error("// original code");
8484
if (beautified.error) {
85-
console.log("// !!! beautify failed !!!");
86-
console.log(beautified.error.stack);
85+
console.error("// !!! beautify failed !!!");
86+
console.error(beautified.error.stack);
8787
} else if (beautified === true) {
88-
console.log("// (beautified)");
88+
console.error("// (beautified)");
8989
}
90-
console.log(input.raw);
91-
console.log();
92-
console.log();
93-
console.log("//-------------------------------------------------------------");
94-
console.log("//", description);
90+
console.error(input.raw);
91+
console.error();
92+
console.error();
93+
console.error("//-------------------------------------------------------------");
94+
console.error("//", description);
9595
if (transformed.error) {
96-
console.log(transformed.error.stack);
96+
console.error(transformed.error.stack);
9797
} else {
9898
beautified = beautify(transformed.ast);
9999
if (beautified.error) {
100-
console.log("// !!! beautify failed !!!");
101-
console.log(beautified.error.stack);
102-
console.log(transformed.code);
100+
console.error("// !!! beautify failed !!!");
101+
console.error(beautified.error.stack);
102+
console.error(transformed.code);
103103
} else {
104-
console.log("// (beautified)");
105-
console.log(beautified.code);
104+
console.error("// (beautified)");
105+
console.error(beautified.code);
106106
}
107107
}
108-
console.log("!!!!!! Failed... round", round);
108+
console.error("!!!!!! Failed... round", round);
109109
return false;
110110
}
111111
return true;
@@ -119,10 +119,26 @@ for (var round = 1; round <= num_iterations; round++) {
119119
var code = ufuzz.createTopLevelCode();
120120
minify_options.forEach(function(options) {
121121
var ok = true;
122-
var input = UglifyJS.minify(options ? function(options) {
123-
options.module = ufuzz.module;
124-
return UglifyJS.minify(code, options).code;
125-
}(JSON.parse(options)) : code, {
122+
var minified;
123+
if (options) {
124+
var o = JSON.parse(options);
125+
o.module = ufuzz.module;
126+
minified = UglifyJS.minify(code, o);
127+
if (minified.error) {
128+
console.log("//=============================================================");
129+
console.log("// minify() failed... round", round);
130+
console.log("// original code");
131+
console.log(code);
132+
console.log();
133+
console.log();
134+
console.log("//-------------------------------------------------------------");
135+
console.log("minify(options):");
136+
console.log(JSON.stringify(o, null, 2));
137+
return;
138+
}
139+
minified = minified.code;
140+
}
141+
var input = UglifyJS.minify(minified || code, {
126142
compress: false,
127143
mangle: false,
128144
module: ufuzz.module,
@@ -133,11 +149,27 @@ for (var round = 1; round <= num_iterations; round++) {
133149
input.raw = options ? input.code : code;
134150
if (input.error) {
135151
ok = false;
136-
console.log("//=============================================================");
137-
console.log("// minify() failed... round", round);
138-
console.log(input.error);
139-
console.log("// original code");
140-
console.log(code);
152+
console.error("//=============================================================");
153+
console.error("// parse() failed... round", round);
154+
console.error("// original code");
155+
console.error(code);
156+
console.error();
157+
console.error();
158+
if (options) {
159+
console.error("//-------------------------------------------------------------");
160+
console.error("// minified code");
161+
console.error(minified);
162+
console.error();
163+
console.error();
164+
console.error("//-------------------------------------------------------------");
165+
console.error("minify(options):");
166+
console.error(JSON.stringify(o, null, 2));
167+
console.error();
168+
console.error();
169+
}
170+
console.error("//-------------------------------------------------------------");
171+
console.error("// parse() error");
172+
console.error(input.error);
141173
}
142174
if (ok) ok = test(input, function(input) {
143175
return input.ast.to_mozilla_ast();
@@ -149,7 +181,10 @@ for (var round = 1; round <= num_iterations; round++) {
149181
sourceType: "module",
150182
});
151183
}, "acorn.parse()", !ufuzz.verbose);
152-
if (!ok) process.exit(1);
184+
if (!ok && isFinite(num_iterations)) {
185+
console.log();
186+
process.exit(1);
187+
}
153188
});
154189
}
155190
console.log();

0 commit comments

Comments
 (0)