Index: src/code-stubs-hydrogen.cc |
diff --git a/src/code-stubs-hydrogen.cc b/src/code-stubs-hydrogen.cc |
index 45974d2cfb1961447c6438fa284ada83cf725084..a992dcb316ea46f78c0a11da1d7f27f2ac3ab058 100644 |
--- a/src/code-stubs-hydrogen.cc |
+++ b/src/code-stubs-hydrogen.cc |
@@ -210,7 +210,7 @@ bool CodeStubGraphBuilderBase::BuildGraph() { |
template <class Stub> |
class CodeStubGraphBuilder: public CodeStubGraphBuilderBase { |
public: |
- explicit CodeStubGraphBuilder(Isolate* isolate, Stub* stub) |
+ CodeStubGraphBuilder(Isolate* isolate, Stub* stub) |
: CodeStubGraphBuilderBase(isolate, stub) {} |
protected: |
@@ -1303,133 +1303,14 @@ Handle<Code> FastNewClosureStub::GenerateCode(Isolate* isolate) { |
} |
-template <> |
-class CodeStubGraphBuilder<KeyedLoadDictionaryElementStub> |
- : public CodeStubGraphBuilderBase { |
- public: |
- explicit CodeStubGraphBuilder(Isolate* isolate, |
- KeyedLoadDictionaryElementStub* stub) |
- : CodeStubGraphBuilderBase(isolate, stub) {} |
- |
- protected: |
- HValue* BuildCodeStubHelper(HValue* dictionary, |
- HValue* key, |
- HValue* hash, |
- HValue* mask, |
- int current_probe); |
- |
- virtual HValue* BuildCodeStub(); |
- |
- KeyedLoadDictionaryElementStub* casted_stub() { |
- return static_cast<KeyedLoadDictionaryElementStub*>(stub()); |
- } |
-}; |
- |
- |
-HValue* CodeStubGraphBuilder<KeyedLoadDictionaryElementStub>:: |
- BuildCodeStubHelper( |
- HValue* elements, |
- HValue* key, |
- HValue* hash, |
- HValue* mask, |
- int current_probe) { |
- if (current_probe == kNumberDictionaryProbes) { |
- return NULL; |
- } |
- |
- int32_t offset = SeededNumberDictionary::GetProbeOffset(current_probe); |
- HValue* raw_index = (current_probe == 0) |
- ? hash |
- : Add<HAdd>(hash, Add<HConstant>(offset)); |
- raw_index = Add<HBitwise>(Token::BIT_AND, raw_index, mask); |
- int32_t entry_size = SeededNumberDictionary::kEntrySize; |
- raw_index = Add<HMul>(raw_index, Add<HConstant>(entry_size)); |
- raw_index->ClearFlag(HValue::kCanOverflow); |
- |
- int32_t base_offset = SeededNumberDictionary::kElementsStartIndex; |
- HValue* key_index = Add<HAdd>(raw_index, Add<HConstant>(base_offset)); |
- key_index->ClearFlag(HValue::kCanOverflow); |
- |
- HValue* candidate_key = Add<HLoadKeyed>(elements, key_index, |
- static_cast<HValue*>(NULL), |
- FAST_SMI_ELEMENTS); |
- |
- IfBuilder key_compare(this); |
- key_compare.IfNot<HCompareObjectEqAndBranch>(key, candidate_key); |
- key_compare.Then(); |
- { |
- // Key at the current probe doesn't match, try at the next probe. |
- HValue* result = BuildCodeStubHelper(elements, key, hash, mask, |
- current_probe + 1); |
- if (result == NULL) { |
- key_compare.Deopt("probes exhausted in keyed load dictionary lookup"); |
- result = graph()->GetConstantUndefined(); |
- } else { |
- Push(result); |
- } |
- } |
- key_compare.Else(); |
- { |
- // Key at current probe matches. Details must be zero, otherwise the |
- // dictionary element requires special handling. |
- HValue* details_index = Add<HAdd>(raw_index, |
- Add<HConstant>(base_offset + 2)); |
- details_index->ClearFlag(HValue::kCanOverflow); |
- |
- HValue* details = Add<HLoadKeyed>(elements, details_index, |
- static_cast<HValue*>(NULL), |
- FAST_SMI_ELEMENTS); |
- IfBuilder details_compare(this); |
- details_compare.If<HCompareNumericAndBranch>(details, |
- graph()->GetConstant0(), |
- Token::NE); |
- details_compare.ThenDeopt("keyed load dictionary element not fast case"); |
- |
- details_compare.Else(); |
- { |
- // Key matches and details are zero --> fast case. Load and return the |
- // value. |
- HValue* result_index = Add<HAdd>(raw_index, |
- Add<HConstant>(base_offset + 1)); |
- result_index->ClearFlag(HValue::kCanOverflow); |
- |
- Push(Add<HLoadKeyed>(elements, result_index, |
- static_cast<HValue*>(NULL), |
- FAST_ELEMENTS)); |
- } |
- details_compare.End(); |
- } |
- key_compare.End(); |
- |
- return Pop(); |
-} |
- |
- |
+template<> |
HValue* CodeStubGraphBuilder<KeyedLoadDictionaryElementStub>::BuildCodeStub() { |
- KeyedLoadDictionaryElementStub* stub = casted_stub(); |
- |
- HValue* dictionary = GetParameter(0); |
+ HValue* receiver = GetParameter(0); |
HValue* key = GetParameter(1); |
- USE(stub); |
- USE(dictionary); |
- |
- HValue* elements = AddLoadElements(dictionary); |
Add<HCheckSmi>(key); |
- HValue* hash = BuildElementIndexHash(key); |
- |
- HValue* capacity = Add<HLoadKeyed>( |
- elements, |
- Add<HConstant>(NameDictionary::kCapacityIndex), |
- static_cast<HValue*>(NULL), |
- FAST_SMI_ELEMENTS); |
- |
- HValue* mask = Add<HSub>(capacity, graph()->GetConstant1()); |
- mask->ChangeRepresentation(Representation::Integer32()); |
- mask->ClearFlag(HValue::kCanOverflow); |
- |
- return BuildCodeStubHelper(elements, key, hash, mask, 0); |
+ return BuildUncheckedDictionaryElementLoad(receiver, key); |
} |