Commit 6773e296 authored by littledan's avatar littledan Committed by Commit bot

Propagate switch statement value for 'eval'

This patch changes the switch scope desugaring to create blocks which
propagate their 'return value' for eval.

BUG=v8:4399
R=adamk
LOG=Y

Review URL: https://codereview.chromium.org/1309303006

Cr-Commit-Position: refs/heads/master@{#30454}
parent d6fb6de7
......@@ -2987,7 +2987,7 @@ Statement* Parser::ParseSwitchStatement(ZoneList<const AstRawString*>* labels,
// }
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);
......@@ -3004,8 +3004,17 @@ Statement* Parser::ParseSwitchStatement(ZoneList<const AstRawString*>* labels,
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();
......
......@@ -303,6 +303,7 @@ TEST(VisitSwitchStatment) {
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);
}
......
// 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: {} }'));
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment