From: Alex Lam S.L Date: Thu, 9 Nov 2017 21:47:10 +0000 (+0800) Subject: fix object literal tracing in `reduce_vars` (#2461) X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=94525d859f5db559366f96b646aca84438b0f982;p=UglifyJS.git fix object literal tracing in `reduce_vars` (#2461) --- diff --git a/lib/compress.js b/lib/compress.js index d915e23e..24c5be21 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -609,8 +609,11 @@ merge(Compressor.prototype, { && parent.expression === node && (!(value instanceof AST_Function) || value.contains_this(parent))) { return true; - } else if (parent instanceof AST_Array || parent instanceof AST_Object) { + } else if (parent instanceof AST_Array) { return is_modified(parent, parent, level + 1); + } else if (parent instanceof AST_ObjectKeyVal && node === parent.value) { + var obj = tw.parent(level + 1); + return is_modified(obj, obj, level + 2); } else if (parent instanceof AST_PropAccess && parent.expression === node) { return !immutable && is_modified(parent, read_property(value, parent.property), level + 1); } @@ -626,8 +629,11 @@ merge(Compressor.prototype, { || parent instanceof AST_VarDef && node === parent.value) { d.escaped = true; return; - } else if (parent instanceof AST_Array || parent instanceof AST_Object) { + } else if (parent instanceof AST_Array) { mark_escaped(d, parent, parent, level + 1); + } else if (parent instanceof AST_ObjectKeyVal && node === parent.value) { + var obj = tw.parent(level + 1); + mark_escaped(d, obj, obj, level + 2); } else if (parent instanceof AST_PropAccess && node === parent.expression) { value = read_property(value, parent.property); mark_escaped(d, parent, value, level + 1); diff --git a/test/compress/reduce_vars.js b/test/compress/reduce_vars.js index d7c5601a..e84ac6cb 100644 --- a/test/compress/reduce_vars.js +++ b/test/compress/reduce_vars.js @@ -286,6 +286,7 @@ unsafe_evaluate_modified: { function inc() { this.p++; } console.log(function(){ var o={p:6}; inc.call(o); console.log(o.p); return o.p; }()); console.log(function(){ var o={p:7}; console.log([o][0].p++); return o.p; }()); + console.log(function(){ var o={p:8}; console.log({q:o}.q.p++); return o.p; }()); } expect: { console.log(function(){ var o={p:1}; o.p++; console.log(o.p); return o.p; }()); @@ -296,6 +297,7 @@ unsafe_evaluate_modified: { function inc() { this.p++; } console.log(function(){ var o={p:6}; inc.call(o); console.log(o.p); return o.p; }()); console.log(function(){ var o={p:7}; console.log([o][0].p++); return o.p; }()); + console.log(function(){ var o={p:8}; console.log({q:o}.q.p++); return o.p; }()); } expect_stdout: true } @@ -3269,7 +3271,7 @@ const_expr_2: { expect_stdout: "2 2" } -escaped_prop: { +escaped_prop_1: { options = { collapse_vars: true, evaluate: true, @@ -3298,6 +3300,40 @@ escaped_prop: { expect_stdout: "2" } +escaped_prop_2: { + options = { + reduce_vars: true, + toplevel: true, + unused: true, + } + input: { + var a; + function f(b) { + if (a) console.log(a === b.c); + a = b.c; + } + function g() {} + function h() { + f({ c: g }); + } + h(); + h(); + } + expect: { + var a; + function g() {} + function h() { + (function(b) { + if (a) console.log(a === b.c); + a = b.c; + })({ c: g }); + } + h(); + h(); + } + expect_stdout: "true" +} + issue_2420_1: { options = { reduce_vars: true,