// }
Block* switch_block =
- factory()->NewBlock(NULL, 2, true, RelocInfo::kNoPosition);
+ factory()->NewBlock(NULL, 2, false, RelocInfo::kNoPosition);
int switch_pos = peek_position();
Expect(Token::SWITCH, CHECK_OK);
factory()->NewExpressionStatement(tag_assign, RelocInfo::kNoPosition);
switch_block->AddStatement(tag_statement, zone());
+ // make statement: undefined;
+ // This is needed so the tag isn't returned as the value, in case the switch
+ // statements don't have a value.
+ switch_block->AddStatement(
+ factory()->NewExpressionStatement(
+ factory()->NewUndefinedLiteral(RelocInfo::kNoPosition),
+ RelocInfo::kNoPosition),
+ zone());
+
Block* cases_block =
- factory()->NewBlock(NULL, 1, true, RelocInfo::kNoPosition);
+ factory()->NewBlock(NULL, 1, false, RelocInfo::kNoPosition);
Scope* cases_scope = NewScope(scope_, BLOCK_SCOPE);
cases_scope->SetNonlinear();
CHECK_VAR(.switch_tag, DEFAULT_TYPE);
CHECK_EXPR(Literal, DEFAULT_TYPE);
}
+ CHECK_EXPR(Literal, DEFAULT_TYPE);
CHECK_VAR(.switch_tag, DEFAULT_TYPE);
CHECK_EXPR(Literal, DEFAULT_TYPE);
}
--- /dev/null
+// Copyright 2015 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Test that switch has the appropriate 'eval' value
+
+assertEquals("foo", eval('switch(1) { case 1: "foo" }'));
+assertEquals("foo", eval('{ switch(1) { case 1: "foo" } }'));
+assertEquals("foo", eval('switch(1) { case 1: { "foo" } }'));
+assertEquals("foo", eval('switch(1) { case 1: "foo"; break; case 2: "bar"; break }'));
+assertEquals("bar", eval('switch(2) { case 1: "foo"; break; case 2: "bar"; break }'));
+assertEquals("bar", eval('switch(1) { case 1: "foo"; case 2: "bar"; break }'));
+
+// The tag is not the value, if there's no value
+
+assertEquals(undefined, eval('switch (1) {}'));
+assertEquals(undefined, eval('switch (1) { case 1: {} }'));