Actually limit sequence length.
authorMihai Bazon <mihai.bazon@gmail.com>
Tue, 12 Apr 2016 11:15:14 +0000 (14:15 +0300)
committerMihai Bazon <mihai.bazon@gmail.com>
Tue, 12 Apr 2016 11:17:24 +0000 (14:17 +0300)
Fix #1038

lib/ast.js
lib/compress.js

index 2a46183..42506cb 100644 (file)
@@ -633,6 +633,13 @@ var AST_Seq = DEFNODE("Seq", "car cdr", {
             p = p.cdr;
         }
     },
+    len: function() {
+        if (this.cdr instanceof AST_Seq) {
+            return this.cdr.len() + 1;
+        } else {
+            return 2;
+        }
+    },
     _walk: function(visitor) {
         return visitor._visit(this, function(){
             this.car._walk(visitor);
index e47be97..153e70f 100644 (file)
@@ -673,8 +673,12 @@ merge(Compressor.prototype, {
                 seq = [];
             };
             statements.forEach(function(stat){
-                if (stat instanceof AST_SimpleStatement && seq.length < 2000) seq.push(stat.body);
-                else push_seq(), ret.push(stat);
+                if (stat instanceof AST_SimpleStatement && seqLength(seq) < 2000) {
+                    seq.push(stat.body);
+                } else {
+                    push_seq();
+                    ret.push(stat);
+                }
             });
             push_seq();
             ret = sequencesize_2(ret, compressor);
@@ -682,6 +686,18 @@ merge(Compressor.prototype, {
             return ret;
         };
 
+        function seqLength(a) {
+            for (var len = 0, i = 0; i < a.length; ++i) {
+                var stat = a[i];
+                if (stat instanceof AST_Seq) {
+                    len += stat.len();
+                } else {
+                    len++;
+                }
+            }
+            return len;
+        };
+
         function sequencesize_2(statements, compressor) {
             function cons_seq(right) {
                 ret.pop();