| Index: src/code-stubs-hydrogen.cc
|
| diff --git a/src/code-stubs-hydrogen.cc b/src/code-stubs-hydrogen.cc
|
| index 57402362e861ff152d74dd0dd931b80ea7ab4d12..d52c4aeeb15a120a944d90264aa2dbfa7aee1ae6 100644
|
| --- a/src/code-stubs-hydrogen.cc
|
| +++ b/src/code-stubs-hydrogen.cc
|
| @@ -84,10 +84,6 @@ class CodeStubGraphBuilderBase : public HGraphBuilder {
|
| HValue* BuildPushElement(HValue* object, HValue* argc,
|
| HValue* argument_elements, ElementsKind kind);
|
|
|
| - HValue* UnmappedCase(HValue* elements, HValue* key, HValue* value);
|
| - HValue* EmitKeyedSloppyArguments(HValue* receiver, HValue* key,
|
| - HValue* value);
|
| -
|
| HValue* BuildToString(HValue* input, bool convert);
|
| HValue* BuildToPrimitive(HValue* input, HValue* input_map);
|
|
|
| @@ -905,155 +901,6 @@ HValue* CodeStubGraphBuilder<LoadConstantStub>::BuildCodeStub() {
|
| Handle<Code> LoadConstantStub::GenerateCode() { return DoGenerateCode(this); }
|
|
|
|
|
| -HValue* CodeStubGraphBuilderBase::UnmappedCase(HValue* elements, HValue* key,
|
| - HValue* value) {
|
| - HValue* result = NULL;
|
| - HInstruction* backing_store =
|
| - Add<HLoadKeyed>(elements, graph()->GetConstant1(), nullptr, nullptr,
|
| - FAST_ELEMENTS, ALLOW_RETURN_HOLE);
|
| - Add<HCheckMaps>(backing_store, isolate()->factory()->fixed_array_map());
|
| - HValue* backing_store_length = Add<HLoadNamedField>(
|
| - backing_store, nullptr, HObjectAccess::ForFixedArrayLength());
|
| - IfBuilder in_unmapped_range(this);
|
| - in_unmapped_range.If<HCompareNumericAndBranch>(key, backing_store_length,
|
| - Token::LT);
|
| - in_unmapped_range.Then();
|
| - {
|
| - if (value == NULL) {
|
| - result = Add<HLoadKeyed>(backing_store, key, nullptr, nullptr,
|
| - FAST_HOLEY_ELEMENTS, NEVER_RETURN_HOLE);
|
| - } else {
|
| - Add<HStoreKeyed>(backing_store, key, value, nullptr, FAST_HOLEY_ELEMENTS);
|
| - }
|
| - }
|
| - in_unmapped_range.ElseDeopt(DeoptimizeReason::kOutsideOfRange);
|
| - in_unmapped_range.End();
|
| - return result;
|
| -}
|
| -
|
| -
|
| -HValue* CodeStubGraphBuilderBase::EmitKeyedSloppyArguments(HValue* receiver,
|
| - HValue* key,
|
| - HValue* value) {
|
| - // Mapped arguments are actual arguments. Unmapped arguments are values added
|
| - // to the arguments object after it was created for the call. Mapped arguments
|
| - // are stored in the context at indexes given by elements[key + 2]. Unmapped
|
| - // arguments are stored as regular indexed properties in the arguments array,
|
| - // held at elements[1]. See NewSloppyArguments() in runtime.cc for a detailed
|
| - // look at argument object construction.
|
| - //
|
| - // The sloppy arguments elements array has a special format:
|
| - //
|
| - // 0: context
|
| - // 1: unmapped arguments array
|
| - // 2: mapped_index0,
|
| - // 3: mapped_index1,
|
| - // ...
|
| - //
|
| - // length is 2 + min(number_of_actual_arguments, number_of_formal_arguments).
|
| - // If key + 2 >= elements.length then attempt to look in the unmapped
|
| - // arguments array (given by elements[1]) and return the value at key, missing
|
| - // to the runtime if the unmapped arguments array is not a fixed array or if
|
| - // key >= unmapped_arguments_array.length.
|
| - //
|
| - // Otherwise, t = elements[key + 2]. If t is the hole, then look up the value
|
| - // in the unmapped arguments array, as described above. Otherwise, t is a Smi
|
| - // index into the context array given at elements[0]. Return the value at
|
| - // context[t].
|
| -
|
| - bool is_load = value == NULL;
|
| -
|
| - key = AddUncasted<HForceRepresentation>(key, Representation::Smi());
|
| - IfBuilder positive_smi(this);
|
| - positive_smi.If<HCompareNumericAndBranch>(key, graph()->GetConstant0(),
|
| - Token::LT);
|
| - positive_smi.ThenDeopt(DeoptimizeReason::kKeyIsNegative);
|
| - positive_smi.End();
|
| -
|
| - HValue* constant_two = Add<HConstant>(2);
|
| - HValue* elements = AddLoadElements(receiver, nullptr);
|
| - HValue* elements_length = Add<HLoadNamedField>(
|
| - elements, nullptr, HObjectAccess::ForFixedArrayLength());
|
| - HValue* adjusted_length = AddUncasted<HSub>(elements_length, constant_two);
|
| - IfBuilder in_range(this);
|
| - in_range.If<HCompareNumericAndBranch>(key, adjusted_length, Token::LT);
|
| - in_range.Then();
|
| - {
|
| - HValue* index = AddUncasted<HAdd>(key, constant_two);
|
| - HInstruction* mapped_index =
|
| - Add<HLoadKeyed>(elements, index, nullptr, nullptr, FAST_HOLEY_ELEMENTS,
|
| - ALLOW_RETURN_HOLE);
|
| -
|
| - IfBuilder is_valid(this);
|
| - is_valid.IfNot<HCompareObjectEqAndBranch>(mapped_index,
|
| - graph()->GetConstantHole());
|
| - is_valid.Then();
|
| - {
|
| - // TODO(mvstanton): I'd like to assert from this point, that if the
|
| - // mapped_index is not the hole that it is indeed, a smi. An unnecessary
|
| - // smi check is being emitted.
|
| - HValue* the_context = Add<HLoadKeyed>(elements, graph()->GetConstant0(),
|
| - nullptr, nullptr, FAST_ELEMENTS);
|
| - STATIC_ASSERT(Context::kHeaderSize == FixedArray::kHeaderSize);
|
| - if (is_load) {
|
| - HValue* result =
|
| - Add<HLoadKeyed>(the_context, mapped_index, nullptr, nullptr,
|
| - FAST_ELEMENTS, ALLOW_RETURN_HOLE);
|
| - environment()->Push(result);
|
| - } else {
|
| - DCHECK(value != NULL);
|
| - Add<HStoreKeyed>(the_context, mapped_index, value, nullptr,
|
| - FAST_ELEMENTS);
|
| - environment()->Push(value);
|
| - }
|
| - }
|
| - is_valid.Else();
|
| - {
|
| - HValue* result = UnmappedCase(elements, key, value);
|
| - environment()->Push(is_load ? result : value);
|
| - }
|
| - is_valid.End();
|
| - }
|
| - in_range.Else();
|
| - {
|
| - HValue* result = UnmappedCase(elements, key, value);
|
| - environment()->Push(is_load ? result : value);
|
| - }
|
| - in_range.End();
|
| -
|
| - return environment()->Pop();
|
| -}
|
| -
|
| -
|
| -template <>
|
| -HValue* CodeStubGraphBuilder<KeyedLoadSloppyArgumentsStub>::BuildCodeStub() {
|
| - HValue* receiver = GetParameter(Descriptor::kReceiver);
|
| - HValue* key = GetParameter(Descriptor::kName);
|
| -
|
| - return EmitKeyedSloppyArguments(receiver, key, NULL);
|
| -}
|
| -
|
| -
|
| -Handle<Code> KeyedLoadSloppyArgumentsStub::GenerateCode() {
|
| - return DoGenerateCode(this);
|
| -}
|
| -
|
| -
|
| -template <>
|
| -HValue* CodeStubGraphBuilder<KeyedStoreSloppyArgumentsStub>::BuildCodeStub() {
|
| - HValue* receiver = GetParameter(Descriptor::kReceiver);
|
| - HValue* key = GetParameter(Descriptor::kName);
|
| - HValue* value = GetParameter(Descriptor::kValue);
|
| -
|
| - return EmitKeyedSloppyArguments(receiver, key, value);
|
| -}
|
| -
|
| -
|
| -Handle<Code> KeyedStoreSloppyArgumentsStub::GenerateCode() {
|
| - return DoGenerateCode(this);
|
| -}
|
| -
|
| -
|
| void CodeStubGraphBuilderBase::BuildStoreNamedField(
|
| HValue* object, HValue* value, FieldIndex index,
|
| Representation representation, bool transition_to_field) {
|
|
|