Chromium Code Reviews| Index: src/builtins/builtins-handler.cc |
| diff --git a/src/builtins/builtins-handler.cc b/src/builtins/builtins-handler.cc |
| index d48e564255ffa38190a07d3ba49b0e5b0d7a9e5d..d98b30759ede73d9c96013cab6e6124f60cb19e1 100644 |
| --- a/src/builtins/builtins-handler.cc |
| +++ b/src/builtins/builtins-handler.cc |
| @@ -108,8 +108,34 @@ void Builtins::Generate_LoadIC_Miss(compiler::CodeAssemblerState* state) { |
| slot, vector); |
| } |
| -void Builtins::Generate_LoadIC_Normal(MacroAssembler* masm) { |
| - LoadIC::GenerateNormal(masm); |
| +TF_BUILTIN(LoadIC_Normal, CodeStubAssembler) { |
| + typedef LoadWithVectorDescriptor Descriptor; |
| + |
| + Node* receiver = Parameter(Descriptor::kReceiver); |
| + Node* name = Parameter(Descriptor::kName); |
| + Node* context = Parameter(Descriptor::kContext); |
| + |
| + Label slow(this); |
| + { |
| + Node* properties = LoadProperties(receiver); |
| + Variable var_name_index(this, MachineType::PointerRepresentation()); |
| + Label found(this, &var_name_index); |
| + NameDictionaryLookup<NameDictionary>(properties, name, &found, |
| + &var_name_index, &slow); |
| + Bind(&found); |
| + { |
| + Variable var_details(this, MachineRepresentation::kWord32); |
| + Variable var_value(this, MachineRepresentation::kTagged); |
| + LoadPropertyFromNameDictionary(properties, var_name_index.value(), |
| + &var_details, &var_value); |
| + Node* value = CallGetterIfAccessor(var_value.value(), var_details.value(), |
| + context, receiver, &slow); |
| + Return(value); |
| + } |
| + } |
| + |
| + Bind(&slow); |
| + TailCallRuntime(Runtime::kGetProperty, context, receiver, name); |
| } |
| void Builtins::Generate_LoadIC_Slow(compiler::CodeAssemblerState* state) { |
| @@ -140,8 +166,47 @@ void Builtins::Generate_StoreIC_Miss(compiler::CodeAssemblerState* state) { |
| vector, receiver, name); |
| } |
| -void Builtins::Generate_StoreIC_Normal(MacroAssembler* masm) { |
| - StoreIC::GenerateNormal(masm); |
| +TF_BUILTIN(StoreIC_Normal, CodeStubAssembler) { |
| + typedef StoreWithVectorDescriptor Descriptor; |
| + |
| + Node* receiver = Parameter(Descriptor::kReceiver); |
| + Node* name = Parameter(Descriptor::kName); |
| + Node* value = Parameter(Descriptor::kValue); |
| + Node* slot = Parameter(Descriptor::kSlot); |
| + Node* vector = Parameter(Descriptor::kVector); |
| + Node* context = Parameter(Descriptor::kContext); |
| + |
| + Label slow(this); |
| + { |
| + Node* properties = LoadProperties(receiver); |
| + Variable var_name_index(this, MachineType::PointerRepresentation()); |
| + Label found(this, &var_name_index); |
| + NameDictionaryLookup<NameDictionary>(properties, name, &found, |
| + &var_name_index, &slow); |
| + Bind(&found); |
| + { |
| + const int kNameToDetailsOffset = (NameDictionary::kEntryDetailsIndex - |
| + NameDictionary::kEntryKeyIndex) * |
| + kPointerSize; |
| + Node* details = LoadFixedArrayElement(properties, var_name_index.value(), |
| + kNameToDetailsOffset); |
| + // Check that the property is a writable data property (no accessor). |
| + const int kTypeAndReadOnlyMask = PropertyDetails::TypeField::kMask | |
|
Igor Sheludko
2017/01/11 16:50:34
This should be KindField::kMask since you don't ca
Jakob Kummerow
2017/01/12 10:24:11
Done.
|
| + PropertyDetails::kAttributesReadOnlyMask; |
| + STATIC_ASSERT(kData == 0); |
| + GotoIf(IsSetSmi(details, kTypeAndReadOnlyMask), &slow); |
| + const int kNameToValueOffset = |
| + (NameDictionary::kEntryValueIndex - NameDictionary::kEntryKeyIndex) * |
| + kPointerSize; |
| + StoreFixedArrayElement(properties, var_name_index.value(), value, |
| + UPDATE_WRITE_BARRIER, kNameToValueOffset); |
| + Return(value); |
| + } |
| + } |
| + |
| + Bind(&slow); |
| + TailCallRuntime(Runtime::kStoreIC_Miss, context, value, slot, vector, |
| + receiver, name); |
| } |
| void Builtins::Generate_StoreIC_Setter_ForDeopt(MacroAssembler* masm) { |