diff options
author | Alex Lam S.L <alexlamsl@gmail.com> | 2020-11-21 00:57:59 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-11-21 08:57:59 +0800 |
commit | cf120c7cea2721626caa67767d720431becf7f62 (patch) | |
tree | e39a6d8f70385c02726bfdafdc20913a2239c595 /lib/compress.js | |
parent | 8d30902ba9e8a08945c8ae7cac0cb2feb27bb93c (diff) | |
download | tracifyjs-cf120c7cea2721626caa67767d720431becf7f62.tar.gz tracifyjs-cf120c7cea2721626caa67767d720431becf7f62.zip |
fix corner case in `merge_vars` & `reduce_vars` (#4313)
fixes #4312
Diffstat (limited to 'lib/compress.js')
-rw-r--r-- | lib/compress.js | 33 |
1 files changed, 25 insertions, 8 deletions
diff --git a/lib/compress.js b/lib/compress.js index 601f39f0..1161f3b6 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -752,14 +752,18 @@ merge(Compressor.prototype, { def(AST_Call, function(tw, descend) { tw.find_parent(AST_Scope).may_call_this(); var exp = this.expression; - if (exp instanceof AST_Function) { + var tail = exp.tail_node(); + if (tail instanceof AST_Function) { + if (exp !== tail) exp.expressions.slice(0, -1).forEach(function(node) { + node.walk(tw); + }); this.args.forEach(function(arg) { arg.walk(tw); }); - exp.walk(tw); + tail.walk(tw); return true; - } else if (exp instanceof AST_SymbolRef) { - var def = exp.definition(); + } else if (tail instanceof AST_SymbolRef) { + var def = tail.definition(); if (this.TYPE == "Call" && tw.in_boolean_context()) def.bool_fn++; if (!(def.fixed instanceof AST_Defun)) return; var defun = mark_defun(tw, def); @@ -768,11 +772,11 @@ merge(Compressor.prototype, { defun.walk(tw); return true; } else if (this.TYPE == "Call" - && exp instanceof AST_Assign - && exp.operator == "=" - && exp.left instanceof AST_SymbolRef + && tail instanceof AST_Assign + && tail.operator == "=" + && tail.left instanceof AST_SymbolRef && tw.in_boolean_context()) { - exp.left.definition().bool_fn++; + tail.left.definition().bool_fn++; } }); def(AST_Conditional, function(tw) { @@ -4681,6 +4685,19 @@ merge(Compressor.prototype, { if (!(target instanceof AST_IterationStatement)) insert(target); return true; } + if (node instanceof AST_Call) { + var exp = node.expression; + var tail = exp.tail_node(); + if (!(tail instanceof AST_Function)) return; + if (exp !== tail) exp.expressions.slice(0, -1).forEach(function(node) { + node.walk(tw); + }); + node.args.forEach(function(arg) { + arg.walk(tw); + }); + tail.walk(tw); + return true; + } if (node instanceof AST_Conditional) { node.condition.walk(tw); push(); |