Merge branch 'master' into harmony-v3.0.20

This commit is contained in:
alexlamsl
2017-06-25 16:02:46 +08:00
25 changed files with 472 additions and 257 deletions

View File

@@ -104,34 +104,36 @@ regression_block_scope_resolves: {
};
input: {
(function () {
if(1) {
if (1) {
let x;
const y;
const y = 1;
class Zee {};
}
if(1) {
if (1) {
let ex;
const why;
const why = 2;
class Zi {};
}
console.log(x, y, Zee, ex, why, Zi);
console.log(typeof x, typeof y, typeof Zee, typeof ex, typeof why, typeof Zi);
}());
}
expect: {
(function () {
if (1) {
let o;
const n;
class c {};
let e;
const o = 1;
class t {};
}
if (1) {
let o;
const n;
class c {};
let e;
const o = 2;
class t {};
}
console.log(x, y, Zee, ex, why, Zi);
console.log(typeof x, typeof y, typeof Zee, typeof ex, typeof why, typeof Zi);
}());
}
expect_stdout: "undefined undefined undefined undefined undefined undefined"
node_version: ">=6"
}
switch_block_scope_mangler: {
@@ -153,25 +155,37 @@ switch_block_scope_mangler: {
console.log(cat);
}
};
fn(1);
fn(2);
fn(3);
}
expect: {
var fn = function(o) {
switch (o) {
var fn = function(e) {
switch (e) {
case 1:
let e = o + 1
let c = o + 4;
console.log(e, c);
let l = e + 1
let o = e + 4;
console.log(l, o);
break;
case 2:
let l = o + 2;
console.log(l);
let n = e + 2;
console.log(n);
break;
default:
let a = o + 3;
console.log(a);
let c = e + 3;
console.log(c);
}
};
fn(1);
fn(2);
fn(3);
}
expect_stdout: [
"2 5",
"4",
"6",
]
node_version: ">=6"
}

View File

@@ -425,8 +425,8 @@ mangle_destructuring_decl: {
expect: {
function test(t) {
let e = t.a || { e: 7, n: 8 };
let {t: n, e: o, n: s, s: a = 9, o: c, r: l} = e;
console.log(n, o, s, a, c, l);
let {t: n, e: o, n: s, s: l = 9, o: a, r: c} = e;
console.log(n, o, s, l, a, c);
}
test({ a: { t: 1, e: 2, n: 3, s: 4, o: 5, r: 6 } });
test({});
@@ -462,15 +462,15 @@ mangle_destructuring_assign_toplevel_true: {
test({});
}
expect: {
function n(n) {
let t, a, c;
let l = n.a || { e: 7, n: 8 };
({t: o, e, n: s, s: t = 9, o: a, r: c} = l);
console.log(o, e, s, t, a, c);
function e(e) {
let l, s, a;
let c = e.a || { e: 7, n: 8 };
({t: n, e: o, n: t, s: l = 9, o: s, r: a} = c);
console.log(n, o, t, l, s, a);
}
let o, e, s;
n({ a: { t: 1, e: 2, n: 3, s: 4, o: 5, r: 6 } });
n({});
let n, o, t;
e({ a: { t: 1, e: 2, n: 3, s: 4, o: 5, r: 6 } });
e({});
}
expect_stdout: [
"1 2 3 4 5 6",
@@ -504,10 +504,10 @@ mangle_destructuring_assign_toplevel_false: {
}
expect: {
function test(o) {
let s, a, c;
let l = o.a || { e: 7, n: 8 };
({t, e, n, s = 9, o: a, r: c} = l);
console.log(t, e, n, s, a, c);
let s, l, a;
let c = o.a || { e: 7, n: 8 };
({t, e, n, s = 9, o: l, r: a} = c);
console.log(t, e, n, s, l, a);
}
let t, e, n;
test({ a: { t: 1, e: 2, n: 3, s: 4, o: 5, r: 6 } });
@@ -588,8 +588,8 @@ arrow_func_with_destructuring_args: {
})({bar: 5 - 0}, [, 6]);
}
expect: {
(({foo: o = 1, bar: n = 2}, [a = 3, b = 4]) => {
console.log(o, n, a, b);
(({foo: o = 1, bar: a = 2}, [b = 3, l = 4]) => {
console.log(o, a, b, l);
})({bar: 5}, [, 6]);
}
expect_stdout: "1 5 3 6"

View File

@@ -33,10 +33,10 @@ issue_2038_2: {
export { LET, CONST, VAR };
}
expect: {
let a = 1;
const c = 2;
var n = 3;
export { a as LET, c as CONST, n as VAR };
let t = 1;
const e = 2;
var o = 3;
export { t as LET, e as CONST, o as VAR };
}
}
@@ -51,10 +51,10 @@ issue_2126: {
export { dog };
}
expect: {
import { foo as o, cat as f } from "stuff";
console.log(o, f);
import { foo as o, cat as s } from "stuff";
console.log(o, s);
export { o as qux };
export { f as dog };
export { s as dog };
}
}
@@ -166,9 +166,9 @@ redirection: {
export { foo as var } from "module.js";
}
expect: {
let o = 1, d = 2;
export { o as delete };
export { d as default };
let e = 1, o = 2;
export { e as delete };
export { o as default };
export { foo as var } from "module.js";
}
}

View File

@@ -265,7 +265,7 @@ issue_203: {
}
expect: {
var m = {};
var fn = Function("a", "b", "b.exports=42");
var fn = Function("n", "o", "o.exports=42");
fn(null, m, m.exports);
console.log(m.exports);
}

View File

@@ -63,15 +63,15 @@ class_name_can_be_mangled: {
function x() {
class Foo {
}
var class1 = Foo
var class2 = class Bar {}
var class1 = Foo;
var class2 = class Bar {};
}
}
expect: {
function x() {
class a { }
var n = a
var r = class a {}
var s = a;
var c = class a {};
}
}
}
@@ -290,12 +290,12 @@ import_statement_mangling: {
Whatever();
}
expect: {
import l from "foo";
import e, {Food as o} from "lel";
import o from "foo";
import m, {Food as r} from "lel";
import {What as f} from "lel";
l();
e();
o();
m();
r();
f();
}
}
@@ -469,10 +469,10 @@ issue_1898: {
expect: {
class Foo {
bar() {
for (const n of [ 6, 5 ])
for (const f of [ 6, 5 ])
for (let r of [ 4, 3 ])
for (var o of [ 2, 1 ])
console.log(n, r, o);
console.log(f, r, o);
}
}
new Foo().bar();
@@ -497,9 +497,9 @@ issue_1753: {
expect: {
class SomeClass {
constructor(r) {
let a = [];
for (let s = 0; s < 6; s++)
a.push({
let s = [];
for (let a = 0; a < 6; a++)
s.push({
mainDrawNumbers: [],
extraDrawNumbers: []
});
@@ -526,9 +526,9 @@ issue_1753_disable: {
expect: {
class SomeClass {
constructor(r) {
let a = [];
let s = [];
for (let r = 0; r < 6; r++)
a.push({
s.push({
mainDrawNumbers: [],
extraDrawNumbers: []
});

View File

@@ -10,9 +10,9 @@ issue_1321_no_debug: {
}
expect: {
var x = {};
x.b = 1;
x["a"] = 2 * x.b;
console.log(x.b, x["a"]);
x.o = 1;
x["a"] = 2 * x.o;
console.log(x.o, x["a"]);
}
expect_stdout: true
}
@@ -30,9 +30,9 @@ issue_1321_debug: {
}
expect: {
var x = {};
x.a = 1;
x["_$foo$_"] = 2 * x.a;
console.log(x.a, x["_$foo$_"]);
x.o = 1;
x["_$foo$_"] = 2 * x.o;
console.log(x.o, x["_$foo$_"]);
}
expect_stdout: true
}
@@ -49,9 +49,9 @@ issue_1321_with_quoted: {
}
expect: {
var x = {};
x.a = 1;
x["b"] = 2 * x.a;
console.log(x.a, x["b"]);
x.o = 1;
x["x"] = 2 * x.o;
console.log(x.o, x["x"]);
}
expect_stdout: true
}

View File

@@ -33,8 +33,8 @@ same_variable_in_multiple_for_loop: {
console.log(o, l);
for (let o = 0; o < 2; o++) {
console.log(o, l);
let c = 2;
console.log(c);
let e = 2;
console.log(e);
}
}
}
@@ -114,12 +114,12 @@ same_variable_in_multiple_forIn: {
}
expect: {
var test = [ "a", "b", "c" ];
for (let o in test) {
console.log(o);
let e;
e = [ "e", "f", "g" ];
for (let o in test)
console.log(o);
for (let e in test) {
console.log(e);
let t;
t = [ "e", "f", "g" ];
for (let e in test)
console.log(e);
}
}
expect_stdout: true
@@ -160,8 +160,8 @@ different_variable_in_multiple_for_loop: {
console.log(o, l);
for (let o = 0; o < 2; o++) {
console.log(o, l);
let c = 2;
console.log(c);
let e = 2;
console.log(e);
}
}
}
@@ -241,12 +241,12 @@ different_variable_in_multiple_forIn: {
}
expect: {
var test = [ "a", "b", "c" ];
for (let o in test) {
console.log(o);
let e;
e = [ "e", "f", "g" ];
for (let o in test)
console.log(o);
for (let e in test) {
console.log(e);
let t;
t = [ "e", "f", "g" ];
for (let e in test)
console.log(e);
}
}
expect_stdout: true
@@ -281,10 +281,10 @@ more_variable_in_multiple_for: {
}
expect: {
for (let o = 9, l = 0; l < 20; l += o) {
let c = o++ + l;
console.log(o, c, l);
for (let l = c, e = c * c, f = 0; f < 10; f++)
console.log(o, c, e, l, f);
let e = o++ + l;
console.log(o, e, l);
for (let l = e, t = e * e, c = 0; c < 10; c++)
console.log(o, e, t, l, c);
}
}
expect_stdout: true

View File

@@ -82,7 +82,7 @@ numeric_literal: {
' 42: 2,',
' "42": 3,',
' 37: 4,',
' a: 5,',
' o: 5,',
' 1e42: 6,',
' b: 7,',
' "1e+42": 8',
@@ -92,7 +92,7 @@ numeric_literal: {
'',
'console.log(obj[42], obj["42"]);',
'',
'console.log(obj[37], obj["a"], obj[37], obj["37"]);',
'console.log(obj[37], obj["o"], obj[37], obj["37"]);',
'',
'console.log(obj[1e42], obj["b"], obj["1e+42"]);',
]

View File

@@ -159,7 +159,7 @@ export_mangle_1: {
return one - two;
};
}
expect_exact: "export function foo(n,o){return n-o};"
expect_exact: "export function foo(o,n){return o-n};"
}
export_mangle_2: {
@@ -171,7 +171,7 @@ export_mangle_2: {
return one - two;
};
}
expect_exact: "export default function foo(n,o){return n-o};"
expect_exact: "export default function foo(o,t){return o-t};"
}
export_mangle_3: {
@@ -189,7 +189,7 @@ export_mangle_3: {
}
};
}
expect_exact: "export class C{go(n,r){return n-r+n}};"
expect_exact: "export class C{go(r,e){return r-e+r}};"
}
export_mangle_4: {
@@ -207,7 +207,7 @@ export_mangle_4: {
}
};
}
expect_exact: "export default class C{go(n,r){return n-r+n}};"
expect_exact: "export default class C{go(e,r){return e-r+e}};"
}
export_mangle_5: {
@@ -221,7 +221,7 @@ export_mangle_5: {
}
};
}
expect_exact: "export default{prop:function(n,r){return n-r}};"
expect_exact: "export default{prop:function(r,t){return r-t}};"
}
export_mangle_6: {
@@ -232,7 +232,7 @@ export_mangle_6: {
var baz = 2;
export let foo = 1, bar = baz;
}
expect_exact: "var a=2;export let foo=1,bar=a;"
expect_exact: "var o=2;export let foo=1,bar=o;"
}
export_toplevel_1: {

View File

@@ -8,7 +8,7 @@ compress_new_function: {
new Function("aa, bb", 'return aa;');
}
expect: {
Function("a", "b", "return a");
Function("n", "r", "return n");
}
}
@@ -27,9 +27,9 @@ compress_new_function_with_destruct: {
new Function("[[aa]], [{bb}]", 'return aa;');
}
expect: {
Function("a", "[b]", "return a");
Function("a", "{bb:b}", "return a");
Function("[[a]]", "[{bb:b}]", 'return a');
Function("n", "[r]", "return n");
Function("n", "{bb:b}", "return n");
Function("[[n]]", "[{bb:b}]", "return n");
}
}

View File

@@ -1,37 +1,41 @@
dont_reuse_prop: {
mangle_props = {
regex: /asd/
};
}
input: {
"aaaaaaaaaabbbbb";
var obj = {};
obj.a = 123;
obj.asd = 256;
console.log(obj.a);
}
expect: {
"aaaaaaaaaabbbbb";
var obj = {};
obj.a = 123;
obj.b = 256;
console.log(obj.a);
}
expect_stdout: "123"
}
unmangleable_props_should_always_be_reserved: {
mangle_props = {
regex: /asd/
};
}
input: {
"aaaaaaaaaabbbbb";
var obj = {};
obj.asd = 256;
obj.a = 123;
console.log(obj.a);
}
expect: {
"aaaaaaaaaabbbbb";
var obj = {};
obj.b = 256;
obj.a = 123;
console.log(obj.a);
}
}
expect_stdout: "123"
}

View File

@@ -105,7 +105,7 @@ getter_setter_mangler: {
};
}
}
expect_exact: "function f(n,t){return{get:n,set:t,get g(){},set s(n){},c,a:1,m(){}}}"
expect_exact: "function f(t,e){return{get:t,set:e,get g(){},set s(t){},c,a:1,m(){}}}"
}
use_shorthand_opportunity: {
@@ -297,7 +297,7 @@ concise_methods_and_mangle_props: {
expect: {
function x() {
obj = {
a() { return 1; }
o() { return 1; }
}
}
}

View File

@@ -135,11 +135,11 @@ mangle_properties: {
a['run']({color: "blue", foo: "baz"});
}
expect: {
a["a"] = "bar";
a.b = "red";
x = {c: 10};
a.d(x.c, a.a);
a['d']({b: "blue", a: "baz"});
a["o"] = "bar";
a.a = "red";
x = {r: 10};
a.b(x.r, a.o);
a['b']({a: "blue", o: "baz"});
}
}
@@ -178,16 +178,16 @@ mangle_unquoted_properties: {
function f1() {
a["foo"] = "bar";
a.color = "red";
a.b = 2;
x = {"bar": 10, c: 7};
a.c = 9;
a.o = 2;
x = {"bar": 10, f: 7};
a.f = 9;
}
function f2() {
a.foo = "bar";
a['color'] = "red";
x = {bar: 10, c: 7};
a.c = 9;
a.b = 3;
x = {bar: 10, f: 7};
a.f = 9;
a.o = 3;
}
}
}

View File

@@ -241,3 +241,147 @@ issue_2110_2: {
}
expect_stdout: "function"
}
set_immutable_1: {
options = {
collapse_vars: true,
evaluate: true,
pure_getters: "strict",
reduce_vars: true,
toplevel: true,
unused: true,
}
input: {
var a = 1;
a.foo += "";
if (a.foo) console.log("FAIL");
else console.log("PASS");
}
expect: {
1..foo += "";
if (1..foo) console.log("FAIL");
else console.log("PASS");
}
expect_stdout: "PASS"
}
set_immutable_2: {
options = {
cascade: true,
conditionals: true,
pure_getters: "strict",
reduce_vars: true,
sequences: true,
side_effects: true,
toplevel: true,
}
input: {
var a = 1;
a.foo += "";
if (a.foo) console.log("FAIL");
else console.log("PASS");
}
expect: {
var a = 1;
a.foo += "", a.foo ? console.log("FAIL") : console.log("PASS");
}
expect_stdout: "PASS"
}
set_immutable_3: {
options = {
collapse_vars: true,
evaluate: true,
pure_getters: "strict",
reduce_vars: true,
toplevel: true,
unused: true,
}
input: {
"use strict";
var a = 1;
a.foo += "";
if (a.foo) console.log("FAIL");
else console.log("PASS");
}
expect: {
"use strict";
1..foo += "";
if (1..foo) console.log("FAIL");
else console.log("PASS");
}
expect_stdout: true
}
set_immutable_4: {
options = {
cascade: true,
conditionals: true,
pure_getters: "strict",
reduce_vars: true,
sequences: true,
side_effects: true,
toplevel: true,
}
input: {
"use strict";
var a = 1;
a.foo += "";
if (a.foo) console.log("FAIL");
else console.log("PASS");
}
expect: {
"use strict";
var a = 1;
a.foo += "", a.foo ? console.log("FAIL") : console.log("PASS");
}
expect_stdout: true
}
set_mutable_1: {
options = {
collapse_vars: true,
evaluate: true,
pure_getters: "strict",
reduce_vars: true,
unused: true,
}
input: {
!function a() {
a.foo += "";
if (a.foo) console.log("PASS");
else console.log("FAIL");
}();
}
expect: {
!function a() {
if (a.foo += "") console.log("PASS");
else console.log("FAIL");
}();
}
expect_stdout: "PASS"
}
set_mutable_2: {
options = {
cascade: true,
conditionals: true,
pure_getters: "strict",
reduce_vars: true,
sequences: true,
side_effects: true,
}
input: {
!function a() {
a.foo += "";
if (a.foo) console.log("PASS");
else console.log("FAIL");
}();
}
expect: {
!function a() {
(a.foo += "") ? console.log("PASS") : console.log("FAIL");
}();
}
expect_stdout: "PASS"
}

View File

@@ -2625,3 +2625,28 @@ issue_2090_2: {
expect_stdout: "1"
node_version: ">=4"
}
for_in_prop: {
options = {
reduce_vars: true,
}
input: {
var a = {
foo: function() {
for (this.b in [1, 2]);
}
};
a.foo();
console.log(a.b);
}
expect: {
var a = {
foo: function() {
for (this.b in [1, 2]);
}
};
a.foo();
console.log(a.b);
}
expect_stdout: "1"
}

View File

@@ -0,0 +1,4 @@
var a, b = [1, 2];
for (1, 2, a in b) {
console.log(a, b[a]);
}

View File

@@ -0,0 +1,4 @@
var c = [1, 2];
for (var a, b in c) {
console.log(a, c[a]);
}

View File

@@ -611,6 +611,36 @@ describe("bin/uglifyjs", function () {
done();
});
});
it("Should throw syntax error (for-in init)", function(done) {
var command = uglifyjscmd + ' test/input/invalid/for-in_1.js';
exec(command, function (err, stdout, stderr) {
assert.ok(err);
assert.strictEqual(stdout, "");
assert.strictEqual(stderr.split(/\n/).slice(0, 4).join("\n"), [
"Parse error at test/input/invalid/for-in_1.js:2,5",
"for (1, 2, a in b) {",
" ^",
"ERROR: Invalid left-hand side in for..in loop"
].join("\n"));
done();
});
});
it("Should throw syntax error (for-in var)", function(done) {
var command = uglifyjscmd + ' test/input/invalid/for-in_2.js';
exec(command, function (err, stdout, stderr) {
assert.ok(err);
assert.strictEqual(stdout, "");
assert.strictEqual(stderr.split(/\n/).slice(0, 4).join("\n"), [
"Parse error at test/input/invalid/for-in_2.js:2,5",
"for (var a, b in c) {",
" ^",
"ERROR: Only one variable declaration allowed in for..in loop"
].join("\n"));
done();
});
});
it("Should handle literal string as source map input", function(done) {
var command = [
uglifyjscmd,

View File

@@ -2,29 +2,37 @@ var Uglify = require('../../');
var assert = require("assert");
describe("let", function() {
it("Should not produce `let` as a variable name in mangle", function(done) {
it("Should not produce reserved keywords as variable name in mangle", function(done) {
this.timeout(10000);
// Produce a lot of variables in a function and run it through mangle.
var s = '"use strict"; function foo() {';
for (var i = 0; i < 21000; ++i) {
var s = '"dddddeeeeelllllooooottttt"; function foo() {';
for (var i = 0; i < 18000; i++) {
s += "var v" + i + "=0;";
}
s += '}';
var result = Uglify.minify(s, {compress: false});
// Verify that select keywords and reserved keywords not produced
assert.strictEqual(result.code.indexOf("var let="), -1);
assert.strictEqual(result.code.indexOf("var do="), -1);
assert.strictEqual(result.code.indexOf("var var="), -1);
[
"do",
"let",
"var",
].forEach(function(name) {
assert.strictEqual(result.code.indexOf("var " + name + "="), -1);
});
// Verify that the variable names that appeared immediately before
// and after the erroneously generated `let` variable name still exist
// and after the erroneously generated variable name still exist
// to show the test generated enough symbols.
assert(result.code.indexOf("var ket=") >= 0);
assert(result.code.indexOf("var met=") >= 0);
[
"to", "eo",
"eet", "fet",
"rar", "oar",
].forEach(function(name) {
assert.ok(result.code.indexOf("var " + name + "=") >= 0);
});
done();
});
});

View File

@@ -86,7 +86,6 @@ function run_compress_tests() {
log_start_file(file);
function test_case(test) {
log_test(test.name);
U.base54.reset();
var output_options = test.beautify || {};
var expect;
if (test.expect) {
@@ -101,9 +100,6 @@ function run_compress_tests() {
quote_style: 3,
keep_quoted_props: true
});
if (test.mangle_props) {
input = U.mangle_properties(input, test.mangle_props);
}
var options = U.defaults(test.options, {
warnings: false
});
@@ -118,10 +114,16 @@ function run_compress_tests() {
var cmp = new U.Compressor(options, true);
var output = cmp.compress(input);
output.figure_out_scope(test.mangle);
if (test.mangle) {
if (test.mangle || test.mangle_props) {
U.base54.reset();
output.compute_char_frequency(test.mangle);
}
if (test.mangle) {
output.mangle_names(test.mangle);
}
if (test.mangle_props) {
output = U.mangle_properties(output, test.mangle_props);
}
output = make_code(output, output_options);
if (expect != output) {
log("!!! failed\n---INPUT---\n{input}\n---OUTPUT---\n{output}\n---EXPECTED---\n{expected}\n\n", {