Index: src/hydrogen.cc |
=================================================================== |
--- src/hydrogen.cc (revision 7299) |
+++ src/hydrogen.cc (working copy) |
@@ -3445,69 +3445,6 @@ |
} |
-void HGraphBuilder::HandlePolymorphicLoadNamedField(Property* expr, |
- HValue* object, |
- ZoneMapList* types, |
- Handle<String> name) { |
- // TODO(ager): We should recognize when the prototype chains for different |
- // maps are identical. In that case we can avoid repeatedly generating the |
- // same prototype map checks. |
- int count = 0; |
- HBasicBlock* join = NULL; |
- for (int i = 0; i < types->length() && count < kMaxLoadPolymorphism; ++i) { |
- Handle<Map> map = types->at(i); |
- LookupResult lookup; |
- map->LookupInDescriptors(NULL, *name, &lookup); |
- if (lookup.IsProperty() && lookup.type() == FIELD) { |
- if (count == 0) { |
- AddInstruction(new HCheckNonSmi(object)); // Only needed once. |
- join = graph()->CreateBasicBlock(); |
- } |
- ++count; |
- HBasicBlock* if_true = graph()->CreateBasicBlock(); |
- HBasicBlock* if_false = graph()->CreateBasicBlock(); |
- HCompareMap* compare = new HCompareMap(object, map, if_true, if_false); |
- current_block()->Finish(compare); |
- |
- set_current_block(if_true); |
- HLoadNamedField* instr = |
- BuildLoadNamedField(object, expr, map, &lookup, false); |
- instr->set_position(expr->position()); |
- instr->ClearFlag(HValue::kUseGVN); |
- AddInstruction(instr); |
- if (!ast_context()->IsEffect()) Push(instr); |
- current_block()->Goto(join); |
- |
- set_current_block(if_false); |
- } |
- } |
- |
- // Finish up. Unconditionally deoptimize if we've handled all the maps we |
- // know about and do not want to handle ones we've never seen. Otherwise |
- // use a generic IC. |
- if (count == types->length() && FLAG_deoptimize_uncommon_cases) { |
- current_block()->FinishExitWithDeoptimization(); |
- } else { |
- HInstruction* instr = BuildLoadNamedGeneric(object, expr); |
- instr->set_position(expr->position()); |
- |
- if (join != NULL) { |
- AddInstruction(instr); |
- if (!ast_context()->IsEffect()) Push(instr); |
- current_block()->Goto(join); |
- } else { |
- ast_context()->ReturnInstruction(instr, expr->id()); |
- return; |
- } |
- } |
- |
- ASSERT(join != NULL); |
- join->SetJoinId(expr->id()); |
- set_current_block(join); |
- if (!ast_context()->IsEffect()) ast_context()->ReturnValue(Pop()); |
-} |
- |
- |
HLoadNamedField* HGraphBuilder::BuildLoadNamedField(HValue* object, |
Property* expr, |
Handle<Map> type, |
@@ -3748,9 +3685,8 @@ |
if (expr->IsMonomorphic()) { |
instr = BuildLoadNamed(obj, expr, types->first(), name); |
} else if (types != NULL && types->length() > 1) { |
- HandlePolymorphicLoadNamedField(expr, obj, types, name); |
- return; |
- |
+ AddInstruction(new HCheckNonSmi(obj)); |
+ instr = new HLoadNamedFieldPolymorphic(obj, types, name); |
} else { |
instr = BuildLoadNamedGeneric(obj, expr); |
} |