fix code generator for this case:

if (foo) {
  with (bar)
    if (baz)
      x();
} else y();

(the compressor removes the brackets since the consequent consists of a
single statement, but the codegen must include the brackets because
otherwise the `else` would refer to the inner `if`)
This commit is contained in:
Mihai Bazon
2012-08-28 15:29:58 +03:00
parent ce8e8d57c0
commit 7fcb6bcb12
2 changed files with 8 additions and 8 deletions

View File

@@ -149,6 +149,9 @@ var AST_EmptyStatement = DEFNODE("EmptyStatement", null, {
} }
}, AST_Statement); }, AST_Statement);
var AST_StatementWithBody = DEFNODE("StatementWithBody", null, {
}, AST_Statement);
var AST_DWLoop = DEFNODE("DWLoop", "condition", { var AST_DWLoop = DEFNODE("DWLoop", "condition", {
$documentation: "Base class for do/while statements.", $documentation: "Base class for do/while statements.",
_walk: function(visitor) { _walk: function(visitor) {
@@ -157,7 +160,7 @@ var AST_DWLoop = DEFNODE("DWLoop", "condition", {
this.body._walk(visitor); this.body._walk(visitor);
}); });
} }
}, AST_Statement); }, AST_StatementWithBody);
var AST_Do = DEFNODE("Do", null, { var AST_Do = DEFNODE("Do", null, {
$documentation: "A `do` statement" $documentation: "A `do` statement"
@@ -177,7 +180,7 @@ var AST_For = DEFNODE("For", "init condition step", {
this.body._walk(visitor); this.body._walk(visitor);
}); });
} }
}, AST_Statement); }, AST_StatementWithBody);
var AST_ForIn = DEFNODE("ForIn", "init name object", { var AST_ForIn = DEFNODE("ForIn", "init name object", {
$documentation: "A `for ... in` statement", $documentation: "A `for ... in` statement",
@@ -188,7 +191,7 @@ var AST_ForIn = DEFNODE("ForIn", "init name object", {
this.body._walk(visitor); this.body._walk(visitor);
}); });
} }
}, AST_Statement); }, AST_StatementWithBody);
var AST_With = DEFNODE("With", "expression", { var AST_With = DEFNODE("With", "expression", {
$documentation: "A `with` statement", $documentation: "A `with` statement",
@@ -198,7 +201,7 @@ var AST_With = DEFNODE("With", "expression", {
this.body._walk(visitor); this.body._walk(visitor);
}); });
} }
}, AST_Statement); }, AST_StatementWithBody);
/* -----[ scope and functions ]----- */ /* -----[ scope and functions ]----- */

View File

@@ -611,10 +611,7 @@ function OutputStream(options) {
} }
b = b.alternative; b = b.alternative;
} }
else if (b instanceof AST_While else if (b instanceof AST_StatementWithBody) {
|| b instanceof AST_Do
|| b instanceof AST_For
|| b instanceof AST_ForIn) {
b = b.body; b = b.body;
} }
else break; else break;