Index: src/code-stubs-hydrogen.cc |
diff --git a/src/code-stubs-hydrogen.cc b/src/code-stubs-hydrogen.cc |
index 800a09dd22bf3e446fb8c0203e6dab92674ccacd..e61b2f87570acf1dc87fd97ffcb9ecdc12f1d79c 100644 |
--- a/src/code-stubs-hydrogen.cc |
+++ b/src/code-stubs-hydrogen.cc |
@@ -2033,51 +2033,56 @@ void CodeStubGraphBuilderBase::HandleArrayCases(HValue* array, HValue* receiver, |
HValue* name, HValue* slot, |
HValue* vector, |
bool keyed_load) { |
+ HConstant* constant_two = Add<HConstant>(2); |
+ HConstant* constant_three = Add<HConstant>(3); |
+ |
IfBuilder if_receiver_heap_object(this); |
if_receiver_heap_object.IfNot<HIsSmiAndBranch>(receiver); |
if_receiver_heap_object.Then(); |
+ Push(AddLoadMap(receiver, nullptr)); |
Yang
2015/01/15 11:33:45
Don't we usually just use NULL (instead of nullptr
mvstanton
2015/01/15 12:25:39
Looks like someone did a refactoring CL a while ba
|
+ if_receiver_heap_object.Else(); |
+ HConstant* heap_number_map = |
+ Add<HConstant>(isolate()->factory()->heap_number_map()); |
+ Push(heap_number_map); |
+ if_receiver_heap_object.End(); |
+ HValue* receiver_map = Pop(); |
+ |
+ HValue* start = |
+ keyed_load ? graph()->GetConstant1() : graph()->GetConstant0(); |
+ HValue* weak_cell = |
+ Add<HLoadKeyed>(array, start, nullptr, FAST_ELEMENTS, ALLOW_RETURN_HOLE); |
+ // Load the weak cell value. It may be Smi(0), or a map. Compare nonetheless |
+ // against the receiver_map. |
+ HValue* array_map = Add<HLoadNamedField>(weak_cell, nullptr, |
+ HObjectAccess::ForWeakCellValue()); |
+ |
+ IfBuilder if_correct_map(this); |
+ if_correct_map.If<HCompareObjectEqAndBranch>(receiver_map, array_map); |
+ if_correct_map.Then(); |
+ { TailCallHandler(receiver, name, array, start, slot, vector); } |
+ if_correct_map.Else(); |
{ |
- HConstant* constant_two = Add<HConstant>(2); |
- HConstant* constant_three = Add<HConstant>(3); |
- |
- HValue* receiver_map = AddLoadMap(receiver, nullptr); |
- HValue* start = |
- keyed_load ? graph()->GetConstant1() : graph()->GetConstant0(); |
- HValue* weak_cell = Add<HLoadKeyed>(array, start, nullptr, FAST_ELEMENTS, |
- ALLOW_RETURN_HOLE); |
- // Load the weak cell value. It may be Smi(0), or a map. Compare nonetheless |
- // against the receiver_map. |
- HValue* array_map = Add<HLoadNamedField>(weak_cell, nullptr, |
- HObjectAccess::ForWeakCellValue()); |
- |
- IfBuilder if_correct_map(this); |
- if_correct_map.If<HCompareObjectEqAndBranch>(receiver_map, array_map); |
- if_correct_map.Then(); |
- { TailCallHandler(receiver, name, array, start, slot, vector); } |
- if_correct_map.Else(); |
+ // If our array has more elements, the ic is polymorphic. Look for the |
+ // receiver map in the rest of the array. |
+ HValue* length = AddLoadFixedArrayLength(array, nullptr); |
+ LoopBuilder builder(this, context(), LoopBuilder::kPostIncrement, |
+ constant_two); |
+ start = keyed_load ? constant_three : constant_two; |
+ HValue* key = builder.BeginBody(start, length, Token::LT); |
{ |
- // If our array has more elements, the ic is polymorphic. Look for the |
- // receiver map in the rest of the array. |
- HValue* length = AddLoadFixedArrayLength(array, nullptr); |
- LoopBuilder builder(this, context(), LoopBuilder::kPostIncrement, |
- constant_two); |
- start = keyed_load ? constant_three : constant_two; |
- HValue* key = builder.BeginBody(start, length, Token::LT); |
- { |
- HValue* weak_cell = Add<HLoadKeyed>(array, key, nullptr, FAST_ELEMENTS, |
- ALLOW_RETURN_HOLE); |
- HValue* array_map = Add<HLoadNamedField>( |
- weak_cell, nullptr, HObjectAccess::ForWeakCellValue()); |
- IfBuilder if_correct_poly_map(this); |
- if_correct_poly_map.If<HCompareObjectEqAndBranch>(receiver_map, |
- array_map); |
- if_correct_poly_map.Then(); |
- { TailCallHandler(receiver, name, array, key, slot, vector); } |
- } |
- builder.EndBody(); |
+ HValue* weak_cell = Add<HLoadKeyed>(array, key, nullptr, FAST_ELEMENTS, |
+ ALLOW_RETURN_HOLE); |
+ HValue* array_map = Add<HLoadNamedField>( |
+ weak_cell, nullptr, HObjectAccess::ForWeakCellValue()); |
+ IfBuilder if_correct_poly_map(this); |
+ if_correct_poly_map.If<HCompareObjectEqAndBranch>(receiver_map, |
+ array_map); |
+ if_correct_poly_map.Then(); |
+ { TailCallHandler(receiver, name, array, key, slot, vector); } |
} |
- if_correct_map.End(); |
+ builder.EndBody(); |
} |
+ if_correct_map.End(); |
} |