diff --git a/lib/compress.js b/lib/compress.js index cf79b559..3c6dc427 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -94,12 +94,9 @@ function Compressor(options, false_by_default) { var global_defs = this.options["global_defs"]; if (typeof global_defs == "object") for (var key in global_defs) { if (/^@/.test(key) && HOP(global_defs, key)) { - var ast = parse(global_defs[key]); - if (ast.body.length == 1 && ast.body[0] instanceof AST_SimpleStatement) { - global_defs[key.slice(1)] = ast.body[0].body; - } else throw new Error(string_template("Can't handle expression: {value}", { - value: global_defs[key] - })); + global_defs[key.slice(1)] = parse(global_defs[key], { + expression: true + }); } } var pure_funcs = this.options["pure_funcs"]; @@ -3284,7 +3281,7 @@ merge(Compressor.prototype, { // https://github.com/mishoo/UglifyJS2/issues/203 // if the code argument is a constant, then we can minify it. try { - var code = "NaN(function(" + self.args.slice(0, -1).map(function(arg) { + var code = "n(function(" + self.args.slice(0, -1).map(function(arg) { return arg.value; }).join(",") + "){" + self.args[self.args.length - 1].value + "})"; var ast = parse(code); @@ -3311,18 +3308,18 @@ merge(Compressor.prototype, { }) ]; } - var args = fun.argnames.map(function(arg, i) { - return make_node(AST_String, self.args[i], { - value: arg.print_to_string() - }); - }); var code = OutputStream(); AST_BlockStatement.prototype._codegen.call(fun, fun, code); - code = code.toString().replace(/^\{|\}$/g, ""); - args.push(make_node(AST_String, self.args[self.args.length - 1], { - value: code - })); - self.args = args; + self.args = [ + make_node(AST_String, self, { + value: fun.argnames.map(function(arg) { + return arg.print_to_string(); + }).join(",") + }), + make_node(AST_String, self.args[self.args.length - 1], { + value: code.get().replace(/^\{|\}$/g, "") + }) + ]; return self; } catch (ex) { if (ex instanceof JS_Parse_Error) { diff --git a/package.json b/package.json index 92f7045f..df480e6e 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "homepage": "https://github.com/mishoo/UglifyJS2/tree/harmony", "author": "Mihai Bazon (http://lisperator.net/)", "license": "BSD-2-Clause", - "version": "3.0.20", + "version": "3.0.21", "engines": { "node": ">=0.8.0" }, diff --git a/test/compress/functions.js b/test/compress/functions.js index 065d54db..677c36e8 100644 --- a/test/compress/functions.js +++ b/test/compress/functions.js @@ -265,7 +265,7 @@ issue_203: { } expect: { var m = {}; - var fn = Function("n", "o", "o.exports=42"); + var fn = Function("n,o", "o.exports=42"); fn(null, m, m.exports); console.log(m.exports); } diff --git a/test/compress/global_defs.js b/test/compress/global_defs.js index 30c3232f..dd8cd52f 100644 --- a/test/compress/global_defs.js +++ b/test/compress/global_defs.js @@ -174,3 +174,24 @@ issue_1986: { console.log(42); } } + +issue_2167: { + options = { + conditionals: true, + dead_code: true, + evaluate: true, + global_defs: { + "@isDevMode": "function(){}", + }, + side_effects: true, + } + input: { + if (isDevMode()) { + greetOverlord(); + } + doWork(); + } + expect: { + doWork(); + } +} diff --git a/test/compress/issue-203.js b/test/compress/issue-203.js index c5722273..a9f3dbf9 100644 --- a/test/compress/issue-203.js +++ b/test/compress/issue-203.js @@ -8,7 +8,7 @@ compress_new_function: { new Function("aa, bb", 'return aa;'); } expect: { - Function("n", "r", "return n"); + Function("n,r", "return n"); } } @@ -27,9 +27,9 @@ compress_new_function_with_destruct: { new Function("[[aa]], [{bb}]", 'return aa;'); } expect: { - Function("n", "[r]", "return n"); - Function("n", "{bb:b}", "return n"); - Function("[[n]]", "[{bb:b}]", "return n"); + Function("n,[r]", "return n"); + Function("n,{bb:b}", "return n"); + Function("[[n]],[{bb:b}]", "return n"); } } @@ -49,8 +49,8 @@ compress_new_function_with_destruct_arrows: { new Function("[[aa]], [{bb}]", 'return aa;'); } expect: { - Function("N", "[a]", 'return N'); - Function("b", "{bb:N}", 'return b'); - Function("[[b]]", "[{bb:N}]", 'return b'); + Function("n,[a]", "return n"); + Function("b,{bb:n}", "return b"); + Function("[[b]],[{bb:n}]", "return b"); } } diff --git a/test/mocha/minify.js b/test/mocha/minify.js index 638e79f7..b4722ce2 100644 --- a/test/mocha/minify.js +++ b/test/mocha/minify.js @@ -212,7 +212,7 @@ describe("minify", function() { }); var err = result.error; assert.ok(err instanceof Error); - assert.strictEqual(err.stack.split(/\n/)[0], "Error: Can't handle expression: debugger"); + assert.strictEqual(err.stack.split(/\n/)[0], "SyntaxError: Unexpected token: keyword (debugger)"); }); it("should skip inherited properties", function() { var foo = Object.create({ skip: this });