@@ -10,7 +10,7 @@ var info = require("../package.json");
|
|||||||
var path = require("path");
|
var path = require("path");
|
||||||
var UglifyJS = require("../tools/node");
|
var UglifyJS = require("../tools/node");
|
||||||
|
|
||||||
var skip_keys = [ "cname", "inlined", "parent_scope", "scope", "uses_eval", "uses_with" ];
|
var skip_keys = [ "cname", "fixed", "inlined", "parent_scope", "scope", "uses_eval", "uses_with" ];
|
||||||
var files = {};
|
var files = {};
|
||||||
var options = {};
|
var options = {};
|
||||||
var short_forms = {
|
var short_forms = {
|
||||||
@@ -360,14 +360,14 @@ function run() {
|
|||||||
}
|
}
|
||||||
print(JSON.stringify(result.ast, function(key, value) {
|
print(JSON.stringify(result.ast, function(key, value) {
|
||||||
if (value) switch (key) {
|
if (value) switch (key) {
|
||||||
case "thedef":
|
|
||||||
return symdef(value);
|
|
||||||
case "enclosed":
|
case "enclosed":
|
||||||
return value.length ? value.map(symdef) : undefined;
|
return value.length ? value.map(symdef) : undefined;
|
||||||
case "variables":
|
|
||||||
case "functions":
|
case "functions":
|
||||||
case "globals":
|
case "globals":
|
||||||
|
case "variables":
|
||||||
return value.size() ? value.map(symdef) : undefined;
|
return value.size() ? value.map(symdef) : undefined;
|
||||||
|
case "thedef":
|
||||||
|
return symdef(value);
|
||||||
}
|
}
|
||||||
if (skip_key(key)) return;
|
if (skip_key(key)) return;
|
||||||
if (value instanceof UglifyJS.AST_Token) return;
|
if (value instanceof UglifyJS.AST_Token) return;
|
||||||
|
|||||||
@@ -757,7 +757,9 @@ merge(Compressor.prototype, {
|
|||||||
var value = iife.args[i];
|
var value = iife.args[i];
|
||||||
scan_declaration(tw, compressor, arg, function() {
|
scan_declaration(tw, compressor, arg, function() {
|
||||||
var j = fn.argnames.indexOf(arg);
|
var j = fn.argnames.indexOf(arg);
|
||||||
return (j < 0 ? value : iife.args[j]) || make_node(AST_Undefined, iife);
|
var arg = j < 0 ? value : iife.args[j];
|
||||||
|
if (arg instanceof AST_Sequence && arg.expressions.length < 2) arg = arg.expressions[0];
|
||||||
|
return arg || make_node(AST_Undefined, iife);
|
||||||
}, visit);
|
}, visit);
|
||||||
});
|
});
|
||||||
if (fn.rest) scan_declaration(tw, compressor, fn.rest, compressor.option("rests") && function() {
|
if (fn.rest) scan_declaration(tw, compressor, fn.rest, compressor.option("rests") && function() {
|
||||||
@@ -3644,7 +3646,7 @@ merge(Compressor.prototype, {
|
|||||||
// methods to determine if an expression has a numeric result type
|
// methods to determine if an expression has a numeric result type
|
||||||
(function(def) {
|
(function(def) {
|
||||||
def(AST_Node, return_false);
|
def(AST_Node, return_false);
|
||||||
var binary = makePredicate("- * / % & | ^ << >> >>>");
|
var binary = makePredicate("- * / % ** & | ^ << >> >>>");
|
||||||
def(AST_Assign, function(compressor) {
|
def(AST_Assign, function(compressor) {
|
||||||
return binary[this.operator.slice(0, -1)]
|
return binary[this.operator.slice(0, -1)]
|
||||||
|| this.operator == "=" && this.right.is_number(compressor);
|
|| this.operator == "=" && this.right.is_number(compressor);
|
||||||
|
|||||||
@@ -56,3 +56,31 @@ evaluate: {
|
|||||||
expect_stdout: "5"
|
expect_stdout: "5"
|
||||||
node_version: ">=8"
|
node_version: ">=8"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_4664: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
new function(a) {
|
||||||
|
console.log(typeof f, a, typeof this);
|
||||||
|
}((A = 0, (NaN ^ 1) * 2 ** 30), 0);
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function f() {
|
||||||
|
new function(a) {
|
||||||
|
console.log(typeof f, 2 ** 30, typeof this);
|
||||||
|
}(0, A = 0);
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_stdout: "function 1073741824 object"
|
||||||
|
node_version: ">=8"
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user