diff options
author | kzc <zaxxon2011@gmail.com> | 2016-10-02 10:46:09 -0400 |
---|---|---|
committer | Richard van Velzen <rvanvelzen@experty.com> | 2016-10-06 13:50:11 +0200 |
commit | fc9804b90955d3b38ac6e6c903a8c0e3f7945913 (patch) | |
tree | d9863712ef4643b9796baabb25cd4fcf4aaf40bb | |
parent | 4761d07e0bc3d4c53e0c9c72fc9c322c95cb090e (diff) | |
download | tracifyjs-fc9804b90955d3b38ac6e6c903a8c0e3f7945913.tar.gz tracifyjs-fc9804b90955d3b38ac6e6c903a8c0e3f7945913.zip |
Fix (typeof side_effect()) in boolean context
Fixes #1289 with suggestion by @rvanvelzen
-rw-r--r-- | lib/compress.js | 6 | ||||
-rw-r--r-- | test/compress/typeof.js | 22 |
2 files changed, 28 insertions, 0 deletions
diff --git a/lib/compress.js b/lib/compress.js index 14fb8f1e..1845717c 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -2314,6 +2314,12 @@ merge(Compressor.prototype, { // typeof always returns a non-empty string, thus it's // always true in booleans compressor.warn("Boolean expression always true [{file}:{line},{col}]", self.start); + if (self.expression.has_side_effects(compressor)) { + return make_node(AST_Seq, self, { + car: self.expression, + cdr: make_node(AST_True, self) + }); + } return make_node(AST_True, self); } if (e instanceof AST_Binary && self.operator == "!") { diff --git a/test/compress/typeof.js b/test/compress/typeof.js index cefdd43c..fb391573 100644 --- a/test/compress/typeof.js +++ b/test/compress/typeof.js @@ -23,3 +23,25 @@ typeof_evaluation: { h='undefined'; } } + +typeof_in_boolean_context: { + options = { + booleans : true, + evaluate : true, + conditionals : true, + }; + input: { + function f1(x) { return typeof x ? "yes" : "no"; } + function f2() { return typeof g()? "Yes" : "No"; } + typeof 0 ? foo() : bar(); + !typeof console.log(1); + var a = !typeof console.log(2); + } + expect: { + function f1(x) { return "yes"; } + function f2() { return g(), "Yes"; } + foo(); + !(console.log(1), !0); + var a = !(console.log(2), !0); + } +} |