From 7fcb6bcb1270d1688512e25704125edb5b35b3c5 Mon Sep 17 00:00:00 2001 From: Mihai Bazon Date: Tue, 28 Aug 2012 15:29:58 +0300 Subject: [PATCH] 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`) --- lib/ast.js | 11 +++++++---- lib/output.js | 5 +---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/lib/ast.js b/lib/ast.js index ee57f802..a4a87a2a 100644 --- a/lib/ast.js +++ b/lib/ast.js @@ -149,6 +149,9 @@ var AST_EmptyStatement = DEFNODE("EmptyStatement", null, { } }, AST_Statement); +var AST_StatementWithBody = DEFNODE("StatementWithBody", null, { +}, AST_Statement); + var AST_DWLoop = DEFNODE("DWLoop", "condition", { $documentation: "Base class for do/while statements.", _walk: function(visitor) { @@ -157,7 +160,7 @@ var AST_DWLoop = DEFNODE("DWLoop", "condition", { this.body._walk(visitor); }); } -}, AST_Statement); +}, AST_StatementWithBody); var AST_Do = DEFNODE("Do", null, { $documentation: "A `do` statement" @@ -177,7 +180,7 @@ var AST_For = DEFNODE("For", "init condition step", { this.body._walk(visitor); }); } -}, AST_Statement); +}, AST_StatementWithBody); var AST_ForIn = DEFNODE("ForIn", "init name object", { $documentation: "A `for ... in` statement", @@ -188,7 +191,7 @@ var AST_ForIn = DEFNODE("ForIn", "init name object", { this.body._walk(visitor); }); } -}, AST_Statement); +}, AST_StatementWithBody); var AST_With = DEFNODE("With", "expression", { $documentation: "A `with` statement", @@ -198,7 +201,7 @@ var AST_With = DEFNODE("With", "expression", { this.body._walk(visitor); }); } -}, AST_Statement); +}, AST_StatementWithBody); /* -----[ scope and functions ]----- */ diff --git a/lib/output.js b/lib/output.js index 1d9e5015..7cd3e3c0 100644 --- a/lib/output.js +++ b/lib/output.js @@ -611,10 +611,7 @@ function OutputStream(options) { } b = b.alternative; } - else if (b instanceof AST_While - || b instanceof AST_Do - || b instanceof AST_For - || b instanceof AST_ForIn) { + else if (b instanceof AST_StatementWithBody) { b = b.body; } else break; -- 2.34.1