diff options
author | Alex Lam S.L <alexlamsl@gmail.com> | 2017-06-16 21:18:43 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-06-16 21:18:43 +0800 |
commit | 931daa85bf72f6799dca83c1e1ac9b339d85b70b (patch) | |
tree | 3c445bc48a85a8492a82cd246ebc81ada3331b6d | |
parent | 00e4f7b3c15437df90cf06dabb096fd0576e1814 (diff) | |
download | tracifyjs-931daa85bf72f6799dca83c1e1ac9b339d85b70b.tar.gz tracifyjs-931daa85bf72f6799dca83c1e1ac9b339d85b70b.zip |
fix loss of context in `collapse_vars` & `cascade` (#2112)
fixes #2110
-rw-r--r-- | lib/compress.js | 2 | ||||
-rw-r--r-- | test/compress/pure_getters.js | 63 |
2 files changed, 65 insertions, 0 deletions
diff --git a/lib/compress.js b/lib/compress.js index 3bf54da0..309b87ce 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -722,6 +722,7 @@ merge(Compressor.prototype, { // Stop immediately if these node types are encountered var parent = tt.parent(); if (node instanceof AST_Assign && node.operator != "=" && lhs.equivalent_to(node.left) + || node instanceof AST_Call && lhs instanceof AST_PropAccess && lhs.equivalent_to(node.expression) || node instanceof AST_Debugger || node instanceof AST_IterationStatement && !(node instanceof AST_For) || node instanceof AST_SymbolRef && node.undeclared() @@ -3349,6 +3350,7 @@ merge(Compressor.prototype, { field = "left"; } } else if (cdr instanceof AST_Call + && !(left instanceof AST_PropAccess && cdr.expression.equivalent_to(left)) || cdr instanceof AST_PropAccess || cdr instanceof AST_Unary && !unary_side_effects(cdr.operator)) { field = "expression"; diff --git a/test/compress/pure_getters.js b/test/compress/pure_getters.js index 0ca6a804..81a96b73 100644 --- a/test/compress/pure_getters.js +++ b/test/compress/pure_getters.js @@ -178,3 +178,66 @@ impure_getter_2: { } expect: {} } + +issue_2110_1: { + options = { + cascade: true, + pure_getters: "strict", + sequences: true, + side_effects: true, + reduce_vars: true, + unused: true, + } + input: { + function f() { + function f() {} + function g() { + return this; + } + f.g = g; + return f.g(); + } + console.log(typeof f()); + } + expect: { + function f() { + function f() {} + return f.g = function() { + return this; + }, f.g(); + } + console.log(typeof f()); + } + expect_stdout: "function" +} + +issue_2110_2: { + options = { + collapse_vars: true, + pure_getters: "strict", + reduce_vars: true, + unused: true, + } + input: { + function f() { + function f() {} + function g() { + return this; + } + f.g = g; + return f.g(); + } + console.log(typeof f()); + } + expect: { + function f() { + function f() {} + f.g = function() { + return this; + }; + return f.g(); + } + console.log(typeof f()); + } + expect_stdout: "function" +} |