Fix a bug with deoptimization from inside the default-clause of a switch-statement.

When generating a string-switch we have to use the correct ast id when
there is a default clause present.
Review URL: http://codereview.chromium.org/8776048

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@10145 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 090be8bf
...@@ -2756,10 +2756,13 @@ void HGraphBuilder::VisitSwitchStatement(SwitchStatement* stmt) { ...@@ -2756,10 +2756,13 @@ void HGraphBuilder::VisitSwitchStatement(SwitchStatement* stmt) {
} }
// 2. Build all the tests, with dangling true branches // 2. Build all the tests, with dangling true branches
int default_id = AstNode::kNoNumber;
for (int i = 0; i < clause_count; ++i) { for (int i = 0; i < clause_count; ++i) {
CaseClause* clause = clauses->at(i); CaseClause* clause = clauses->at(i);
if (clause->is_default()) continue; if (clause->is_default()) {
default_id = clause->EntryId();
continue;
}
if (switch_type == SMI_SWITCH) { if (switch_type == SMI_SWITCH) {
clause->RecordTypeFeedback(oracle()); clause->RecordTypeFeedback(oracle());
} }
...@@ -2806,7 +2809,10 @@ void HGraphBuilder::VisitSwitchStatement(SwitchStatement* stmt) { ...@@ -2806,7 +2809,10 @@ void HGraphBuilder::VisitSwitchStatement(SwitchStatement* stmt) {
HBasicBlock* last_block = current_block(); HBasicBlock* last_block = current_block();
if (not_string_block != NULL) { if (not_string_block != NULL) {
last_block = CreateJoin(last_block, not_string_block, stmt->ExitId()); int join_id = (default_id != AstNode::kNoNumber)
? default_id
: stmt->ExitId();
last_block = CreateJoin(last_block, not_string_block, join_id);
} }
// 3. Loop over the clauses and the linked list of tests in lockstep, // 3. Loop over the clauses and the linked list of tests in lockstep,
......
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