From: Alex Lam S.L Date: Wed, 17 Jan 2018 13:33:13 +0000 (+0800) Subject: fix `AST_Scope.clone()` (#2803) X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=07e4b64f3a8439a9491cc7a277872e0a5d79a29b;p=UglifyJS.git fix `AST_Scope.clone()` (#2803) fixes #2799 --- diff --git a/lib/ast.js b/lib/ast.js index 4e41659c..19f6bfb5 100644 --- a/lib/ast.js +++ b/lib/ast.js @@ -308,6 +308,13 @@ var AST_Scope = DEFNODE("Scope", "variables functions uses_with uses_eval parent enclosed: "[SymbolDef*/S] a list of all symbol definitions that are accessed from this scope or any subscopes", cname: "[integer/S] current index for mangling variables (used internally by the mangler)", }, + clone: function(deep) { + var node = this._clone(deep); + if (this.variables) node.variables = this.variables.clone(); + if (this.functions) node.functions = this.functions.clone(); + if (this.enclosed) node.enclosed = this.enclosed.slice(); + return node; + } }, AST_Block); var AST_Toplevel = DEFNODE("Toplevel", "globals", { diff --git a/lib/utils.js b/lib/utils.js index dab7f566..9121fa93 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -303,6 +303,13 @@ Dictionary.prototype = { ret.push(f(this._values[i], i.substr(1))); return ret; }, + clone: function() { + var ret = new Dictionary(); + for (var i in this._values) + ret._values[i] = this._values[i]; + ret._size = this._size; + return ret; + }, toObject: function() { return this._values } }; Dictionary.fromObject = function(obj) { diff --git a/test/compress/reduce_vars.js b/test/compress/reduce_vars.js index ec0471a8..33175d1b 100644 --- a/test/compress/reduce_vars.js +++ b/test/compress/reduce_vars.js @@ -5302,3 +5302,61 @@ issue_2774: { } expect_stdout: "undefined" } + +issue_2799_1: { + options = { + reduce_funcs: true, + reduce_vars: true, + unused: true, + } + input: { + console.log(function() { + return f; + function f(n) { + function g(i) { + return i && i + g(i - 1); + } + function h(j) { + return g(j); + } + return h(n); + } + }()(5)); + } + expect: { + console.log(function() { + return function(n) { + return function(j) { + return function g(i) { + return i && i + g(i - 1); + }(j); + }(n); + } + }()(5)); + } + expect_stdout: "15" +} + +issue_2799_2: { + options = { + reduce_vars: true, + unsafe_proto: true, + unused: true, + } + input: { + (function() { + function foo() { + Function.prototype.call.apply(console.log, [ null, "PASS" ]); + } + foo(); + })(); + } + expect: { + (function() { + (function() { + (function() {}).call.apply(console.log, [ null, "PASS" ]); + })(); + })(); + } + expect_stdout: "PASS" +}