aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/compress.js31
1 files changed, 30 insertions, 1 deletions
diff --git a/lib/compress.js b/lib/compress.js
index 4e86a307..e5a7af2a 100644
--- a/lib/compress.js
+++ b/lib/compress.js
@@ -1780,6 +1780,35 @@ merge(Compressor.prototype, {
node.DEFMETHOD("has_side_effects", func);
});
+ // determine if expression is constant
+ (function(def){
+ function all(list) {
+ for (var i = list.length; --i >= 0;)
+ if (!list[i].is_constant_expression())
+ return false;
+ return true;
+ }
+ def(AST_Node, return_false);
+ def(AST_Constant, return_true);
+ def(AST_Unary, function(){
+ return this.expression.is_constant_expression();
+ });
+ def(AST_Binary, function(){
+ return this.left.is_constant_expression() && this.right.is_constant_expression();
+ });
+ def(AST_Array, function(){
+ return all(this.elements);
+ });
+ def(AST_Object, function(){
+ return all(this.properties);
+ });
+ def(AST_ObjectProperty, function(){
+ return this.value.is_constant_expression();
+ });
+ })(function(node, func){
+ node.DEFMETHOD("is_constant_expression", func);
+ });
+
// tell me if a statement aborts
function aborts(thing) {
return thing && thing.aborts();
@@ -3004,7 +3033,7 @@ merge(Compressor.prototype, {
if (exp instanceof AST_Function) {
if (exp.body[0] instanceof AST_Return) {
var value = exp.body[0].value;
- if (!value || value.is_constant()) {
+ if (!value || value.is_constant_expression()) {
var args = self.args.concat(value || make_node(AST_Undefined, self));
return make_sequence(self, args).transform(compressor);
}