| | |
| | | defaults, |
| | | HOP, |
| | | make_node, |
| | | make_void_0, |
| | | makePredicate, |
| | | MAP, |
| | | remove, |
| | |
| | | set_flag(exp.expression, SQUEEZED); |
| | | self.args = []; |
| | | } else { |
| | | return make_node(AST_Undefined, self); |
| | | return make_void_0(self); |
| | | } |
| | | } |
| | | }); |
| | |
| | | : make_node(AST_EmptyStatement, node); |
| | | } |
| | | return make_node(AST_SimpleStatement, node, { |
| | | body: node.value || make_node(AST_UnaryPrefix, node, { |
| | | operator: "void", |
| | | expression: make_node(AST_Number, node, { |
| | | value: 0 |
| | | }) |
| | | }) |
| | | body: node.value || make_void_0(node) |
| | | }); |
| | | } |
| | | if (node instanceof AST_Class || node instanceof AST_Lambda && node !== self) { |
| | |
| | | return 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) |
| | | consequent : self.body.value || make_void_0(self.body), |
| | | alternative : self.alternative.value || make_void_0(self.alternative), |
| | | }).transform(compressor) |
| | | }).optimize(compressor); |
| | | } |
| | |
| | | const value = condition.evaluate(compressor); |
| | | |
| | | if (value === 1 || value === true) { |
| | | return make_node(AST_Undefined, self); |
| | | return make_void_0(self).optimize(compressor); |
| | | } |
| | | } |
| | | } |
| | |
| | | ) { |
| | | return make_sequence(self, [e, make_node(AST_True, self)]).optimize(compressor); |
| | | } |
| | | // Short-circuit common `void 0` |
| | | if (self.operator === "void" && e instanceof AST_Number && e.value === 0) { |
| | | return unsafe_undefined_ref(self, compressor) || self; |
| | | } |
| | | var seq = self.lift_sequences(compressor); |
| | | if (seq !== self) { |
| | | return seq; |
| | |
| | | self.expression = e; |
| | | return self; |
| | | } else { |
| | | return make_node(AST_Undefined, self).optimize(compressor); |
| | | return make_void_0(self).optimize(compressor); |
| | | } |
| | | } |
| | | if (compressor.in_boolean_context()) { |
| | |
| | | if (expr instanceof AST_SymbolRef ? expr.is_declared(compressor) |
| | | : !(expr instanceof AST_PropAccess && compressor.option("ie8"))) { |
| | | self.right = expr; |
| | | self.left = make_node(AST_Undefined, self.left).optimize(compressor); |
| | | self.left = make_void_0(self.left).optimize(compressor); |
| | | if (self.operator.length == 2) self.operator += "="; |
| | | } |
| | | } else if (compressor.option("typeofs") |
| | |
| | | if (expr instanceof AST_SymbolRef ? expr.is_declared(compressor) |
| | | : !(expr instanceof AST_PropAccess && compressor.option("ie8"))) { |
| | | self.left = expr; |
| | | self.right = make_node(AST_Undefined, self.right).optimize(compressor); |
| | | self.right = make_void_0(self.right).optimize(compressor); |
| | | if (self.operator.length == 2) self.operator += "="; |
| | | } |
| | | } else if (self.left instanceof AST_SymbolRef |
| | |
| | | return lhs instanceof AST_SymbolRef || lhs.TYPE === self.TYPE; |
| | | } |
| | | |
| | | def_optimize(AST_Undefined, function(self, compressor) { |
| | | /** Apply the `unsafe_undefined` option: find a variable called `undefined` and turn `self` into a reference to it. */ |
| | | function unsafe_undefined_ref(self, compressor) { |
| | | if (compressor.option("unsafe_undefined")) { |
| | | var undef = find_variable(compressor, "undefined"); |
| | | if (undef) { |
| | |
| | | return ref; |
| | | } |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | def_optimize(AST_Undefined, function(self, compressor) { |
| | | var symbolref = unsafe_undefined_ref(self, compressor); |
| | | if (symbolref) return symbolref; |
| | | var lhs = compressor.is_lhs(); |
| | | if (lhs && is_atomic(lhs, self)) return self; |
| | | return make_node(AST_UnaryPrefix, self, { |
| | | operator: "void", |
| | | expression: make_node(AST_Number, self, { |
| | | value: 0 |
| | | }) |
| | | }); |
| | | return make_void_0(self); |
| | | }); |
| | | |
| | | def_optimize(AST_Infinity, function(self, compressor) { |
| | |
| | | } |
| | | } |
| | | if (retValue instanceof AST_Expansion) break FLATTEN; |
| | | retValue = retValue instanceof AST_Hole ? make_node(AST_Undefined, retValue) : retValue; |
| | | retValue = retValue instanceof AST_Hole ? make_void_0(retValue) : retValue; |
| | | if (!flatten) values.unshift(retValue); |
| | | while (--i >= 0) { |
| | | var value = elements[i]; |
| | |
| | | if (parent instanceof AST_UnaryPrefix && parent.operator === "delete") { |
| | | return make_node_from_constant(0, self); |
| | | } |
| | | return make_node(AST_Undefined, self); |
| | | return make_void_0(self).optimize(compressor); |
| | | } |
| | | if ( |
| | | self.expression instanceof AST_PropAccess |