aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorAlex Lam S.L <alexlamsl@gmail.com>2019-12-31 13:10:05 +0800
committerGitHub <noreply@github.com>2019-12-31 13:10:05 +0800
commit99ac73a635d641935331e71d519c24297b50dd32 (patch)
tree20951dddabf14fc146adb80fd98e44deb2a3ee81 /lib
parenta2e4c2fd979782c1dd526fc1ac0b14490adb3344 (diff)
downloadtracifyjs-99ac73a635d641935331e71d519c24297b50dd32.tar.gz
tracifyjs-99ac73a635d641935331e71d519c24297b50dd32.zip
enhance `booleans` (#3661)
Diffstat (limited to 'lib')
-rw-r--r--lib/ast.js5
-rw-r--r--lib/compress.js29
2 files changed, 20 insertions, 14 deletions
diff --git a/lib/ast.js b/lib/ast.js
index 11d1f361..f2052350 100644
--- a/lib/ast.js
+++ b/lib/ast.js
@@ -964,12 +964,13 @@ TreeWalker.prototype = {
in_boolean_context: function() {
var self = this.self();
for (var i = 0, p; p = this.parent(i); i++) {
- if (p instanceof AST_SimpleStatement
- || p instanceof AST_Conditional && p.condition === self
+ if (p instanceof AST_Conditional && p.condition === self
|| p instanceof AST_DWLoop && p.condition === self
|| p instanceof AST_For && p.condition === self
|| p instanceof AST_If && p.condition === self
|| p instanceof AST_Return && p.in_bool
+ || p instanceof AST_Sequence && p.tail_node() !== self
+ || p instanceof AST_SimpleStatement
|| p instanceof AST_UnaryPrefix && p.operator == "!" && p.expression === self) {
return true;
}
diff --git a/lib/compress.js b/lib/compress.js
index 3f6bc893..38d09068 100644
--- a/lib/compress.js
+++ b/lib/compress.js
@@ -2021,6 +2021,7 @@ merge(Compressor.prototype, {
if (stat instanceof AST_If && stat.body instanceof AST_Return) {
var value = stat.body.value;
+ var in_bool = stat.body.in_bool || next instanceof AST_Return && next.in_bool;
//---
// pretty silly case, but:
// if (foo()) return; return; => foo(); return;
@@ -2034,7 +2035,7 @@ merge(Compressor.prototype, {
}
//---
// if (foo()) return x; return y; => return foo() ? x : y;
- if (value && !stat.alternative && next instanceof AST_Return && next.value) {
+ if ((in_bool || value) && !stat.alternative && next instanceof AST_Return) {
CHANGED = true;
stat = stat.clone();
stat.alternative = next;
@@ -2044,16 +2045,13 @@ merge(Compressor.prototype, {
}
//---
// if (foo()) return x; [ return ; ] => return foo() ? x : undefined;
- if (value && !stat.alternative
- && (!next && in_lambda && multiple_if_returns
- || next instanceof AST_Return)) {
+ if (!stat.alternative && !next && in_lambda && (in_bool || value && multiple_if_returns)) {
CHANGED = true;
stat = stat.clone();
- stat.alternative = next || make_node(AST_Return, stat, {
+ stat.alternative = make_node(AST_Return, stat, {
value: null
});
statements.splice(i, 1, stat.transform(compressor));
- if (next) statements.splice(j, 1);
continue;
}
//---
@@ -5104,13 +5102,17 @@ merge(Compressor.prototype, {
if (self.body instanceof AST_Exit
&& self.alternative instanceof AST_Exit
&& self.body.TYPE == self.alternative.TYPE) {
- return make_node(self.body.CTOR, self, {
+ var exit = make_node(self.body.CTOR, self, {
value: make_node(AST_Conditional, self, {
condition : self.condition,
consequent : self.body.value || make_node(AST_Undefined, self.body),
alternative : self.alternative.value || make_node(AST_Undefined, self.alternative)
- }).transform(compressor)
- }).optimize(compressor);
+ })
+ });
+ if (exit instanceof AST_Return) {
+ exit.in_bool = self.body.in_bool || self.alternative.in_bool;
+ }
+ return exit;
}
if (self.body instanceof AST_If
&& !self.body.alternative
@@ -7321,12 +7323,15 @@ merge(Compressor.prototype, {
&& node.expression instanceof AST_Constant
&& !node.expression.value);
}
- // AST_False or !1
+ // AST_False or !1 or void 0
function is_false(node) {
return node instanceof AST_False
|| in_bool
- && node instanceof AST_Constant
- && !node.value
+ && (node instanceof AST_Constant
+ && !node.value
+ || node instanceof AST_UnaryPrefix
+ && node.operator == "void"
+ && !node.expression.has_side_effects(compressor))
|| (node instanceof AST_UnaryPrefix
&& node.operator == "!"
&& node.expression instanceof AST_Constant