Index: src/codegen.cc |
=================================================================== |
--- src/codegen.cc (revision 2176) |
+++ src/codegen.cc (working copy) |
@@ -472,129 +472,6 @@ |
} |
-void CodeGenerator::GenerateFastCaseSwitchStatement(SwitchStatement* node, |
- int min_index, |
- int range, |
- int default_index) { |
- ZoneList<CaseClause*>* cases = node->cases(); |
- int length = cases->length(); |
- |
- // Label pointer per number in range. |
- SmartPointer<Label*> case_targets(NewArray<Label*>(range)); |
- |
- // Label per switch case. |
- SmartPointer<Label> case_labels(NewArray<Label>(length)); |
- |
- Label* fail_label = |
- default_index >= 0 ? &(case_labels[default_index]) : NULL; |
- |
- // Populate array of label pointers for each number in the range. |
- // Initally put the failure label everywhere. |
- for (int i = 0; i < range; i++) { |
- case_targets[i] = fail_label; |
- } |
- |
- // Overwrite with label of a case for the number value of that case. |
- // (In reverse order, so that if the same label occurs twice, the |
- // first one wins). |
- for (int i = length - 1; i >= 0 ; i--) { |
- CaseClause* clause = cases->at(i); |
- if (!clause->is_default()) { |
- Object* label_value = *(clause->label()->AsLiteral()->handle()); |
- int case_value = Smi::cast(label_value)->value(); |
- case_targets[case_value - min_index] = &(case_labels[i]); |
- } |
- } |
- |
- GenerateFastCaseSwitchJumpTable(node, |
- min_index, |
- range, |
- fail_label, |
- Vector<Label*>(*case_targets, range), |
- Vector<Label>(*case_labels, length)); |
-} |
- |
- |
-void CodeGenerator::GenerateFastCaseSwitchCases( |
- SwitchStatement* node, |
- Vector<Label> case_labels, |
- VirtualFrame* start_frame) { |
- ZoneList<CaseClause*>* cases = node->cases(); |
- int length = cases->length(); |
- |
- for (int i = 0; i < length; i++) { |
- Comment cmnt(masm(), "[ Case clause"); |
- |
- // We may not have a virtual frame if control flow did not fall |
- // off the end of the previous case. In that case, use the start |
- // frame. Otherwise, we have to merge the existing one to the |
- // start frame as part of the previous case. |
- if (!has_valid_frame()) { |
- RegisterFile empty; |
- SetFrame(new VirtualFrame(start_frame), &empty); |
- } else { |
- frame_->MergeTo(start_frame); |
- } |
- masm()->bind(&case_labels[i]); |
- VisitStatements(cases->at(i)->statements()); |
- } |
-} |
- |
- |
-bool CodeGenerator::TryGenerateFastCaseSwitchStatement(SwitchStatement* node) { |
- // TODO(238): Due to issue 238, fast case switches can crash on ARM |
- // and possibly IA32. They are disabled for now. |
- // See http://code.google.com/p/v8/issues/detail?id=238 |
- return false; |
- |
- ZoneList<CaseClause*>* cases = node->cases(); |
- int length = cases->length(); |
- |
- if (length < FastCaseSwitchMinCaseCount()) { |
- return false; |
- } |
- |
- // Test whether fast-case should be used. |
- int default_index = -1; |
- int min_index = Smi::kMaxValue; |
- int max_index = Smi::kMinValue; |
- for (int i = 0; i < length; i++) { |
- CaseClause* clause = cases->at(i); |
- if (clause->is_default()) { |
- if (default_index >= 0) { |
- // There is more than one default label. Defer to the normal case |
- // for error. |
- return false; |
- } |
- default_index = i; |
- } else { |
- Expression* label = clause->label(); |
- Literal* literal = label->AsLiteral(); |
- if (literal == NULL) { |
- return false; // fail fast case |
- } |
- Object* value = *(literal->handle()); |
- if (!value->IsSmi()) { |
- return false; |
- } |
- int int_value = Smi::cast(value)->value(); |
- min_index = Min(int_value, min_index); |
- max_index = Max(int_value, max_index); |
- } |
- } |
- |
- // All labels are known to be Smis. |
- int range = max_index - min_index + 1; // |min..max| inclusive |
- if (range / FastCaseSwitchMaxOverheadFactor() > length) { |
- return false; // range of labels is too sparse |
- } |
- |
- // Optimization accepted, generate code. |
- GenerateFastCaseSwitchStatement(node, min_index, range, default_index); |
- return true; |
-} |
- |
- |
void CodeGenerator::CodeForFunctionPosition(FunctionLiteral* fun) { |
if (FLAG_debug_info) { |
int pos = fun->start_position(); |