jumps, try and definitions are statements too
authorMihai Bazon <mihai@bazon.net>
Mon, 3 Sep 2012 09:39:02 +0000 (12:39 +0300)
committerMihai Bazon <mihai@bazon.net>
Mon, 3 Sep 2012 09:39:02 +0000 (12:39 +0300)
lib/ast.js
lib/output.js

index 9dd92cb..48904ec 100644 (file)
@@ -248,7 +248,7 @@ var AST_Defun = DEFNODE("Defun", null, {
 
 var AST_Jump = DEFNODE("Jump", null, {
     $documentation: "Base class for “jumps” (for now that's `return`, `throw`, `break` and `continue`)"
-});
+}, AST_Statement);
 
 var AST_Exit = DEFNODE("Exit", "value", {
     $documentation: "Base class for “exits” (`return` and `throw`)",
@@ -353,7 +353,7 @@ var AST_Try = DEFNODE("Try", "btry bcatch bfinally", {
             if (this.bfinally) this.bfinally._walk(visitor);
         });
     }
-});
+}, AST_Statement);
 
 // XXX: this is wrong according to ECMA-262 (12.4).  the catch block
 // should introduce another scope, as the argname should be visible
@@ -391,7 +391,7 @@ var AST_Definitions = DEFNODE("Definitions", "definitions", {
             });
         });
     }
-});
+}, AST_Statement);
 
 var AST_Var = DEFNODE("Var", null, {
     $documentation: "A `var` statement"
index c321d46..98bc983 100644 (file)
@@ -921,7 +921,7 @@ function OutputStream(options) {
     function first_in_statement(output) {
         var a = output.stack(), i = a.length, node = a[--i], p = a[--i];
         while (i > 0) {
-            if (p instanceof AST_Statement)
+            if (p instanceof AST_Statement && p.body === node)
                 return true;
             if ((p instanceof AST_Seq           && p.first === node      ) ||
                 (p instanceof AST_Call          && p.expression === node ) ||