| OLD | NEW | 
|    1 // Copyright 2016 the V8 project authors. All rights reserved. |    1 // Copyright 2016 the V8 project authors. All rights reserved. | 
|    2 // Use of this source code is governed by a BSD-style license that can be |    2 // Use of this source code is governed by a BSD-style license that can be | 
|    3 // found in the LICENSE file. |    3 // found in the LICENSE file. | 
|    4  |    4  | 
|    5 #include "src/builtins/builtins-utils.h" |    5 #include "src/builtins/builtins-utils.h" | 
|    6 #include "src/builtins/builtins.h" |    6 #include "src/builtins/builtins.h" | 
|    7 #include "src/code-stub-assembler.h" |    7 #include "src/code-stub-assembler.h" | 
|    8 #include "src/ic/accessor-assembler.h" |    8 #include "src/ic/accessor-assembler.h" | 
|    9 #include "src/ic/handler-compiler.h" |    9 #include "src/ic/handler-compiler.h" | 
|   10 #include "src/ic/ic.h" |   10 #include "src/ic/ic.h" | 
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  101   Node* receiver = assembler.Parameter(Descriptor::kReceiver); |  101   Node* receiver = assembler.Parameter(Descriptor::kReceiver); | 
|  102   Node* name = assembler.Parameter(Descriptor::kName); |  102   Node* name = assembler.Parameter(Descriptor::kName); | 
|  103   Node* slot = assembler.Parameter(Descriptor::kSlot); |  103   Node* slot = assembler.Parameter(Descriptor::kSlot); | 
|  104   Node* vector = assembler.Parameter(Descriptor::kVector); |  104   Node* vector = assembler.Parameter(Descriptor::kVector); | 
|  105   Node* context = assembler.Parameter(Descriptor::kContext); |  105   Node* context = assembler.Parameter(Descriptor::kContext); | 
|  106  |  106  | 
|  107   assembler.TailCallRuntime(Runtime::kLoadIC_Miss, context, receiver, name, |  107   assembler.TailCallRuntime(Runtime::kLoadIC_Miss, context, receiver, name, | 
|  108                             slot, vector); |  108                             slot, vector); | 
|  109 } |  109 } | 
|  110  |  110  | 
|  111 void Builtins::Generate_LoadIC_Normal(MacroAssembler* masm) { |  111 TF_BUILTIN(LoadIC_Normal, CodeStubAssembler) { | 
|  112   LoadIC::GenerateNormal(masm); |  112   typedef LoadWithVectorDescriptor Descriptor; | 
 |  113  | 
 |  114   Node* receiver = Parameter(Descriptor::kReceiver); | 
 |  115   Node* name = Parameter(Descriptor::kName); | 
 |  116   Node* context = Parameter(Descriptor::kContext); | 
 |  117  | 
 |  118   Label slow(this); | 
 |  119   { | 
 |  120     Node* properties = LoadProperties(receiver); | 
 |  121     Variable var_name_index(this, MachineType::PointerRepresentation()); | 
 |  122     Label found(this, &var_name_index); | 
 |  123     NameDictionaryLookup<NameDictionary>(properties, name, &found, | 
 |  124                                          &var_name_index, &slow); | 
 |  125     Bind(&found); | 
 |  126     { | 
 |  127       Variable var_details(this, MachineRepresentation::kWord32); | 
 |  128       Variable var_value(this, MachineRepresentation::kTagged); | 
 |  129       LoadPropertyFromNameDictionary(properties, var_name_index.value(), | 
 |  130                                      &var_details, &var_value); | 
 |  131       Node* value = CallGetterIfAccessor(var_value.value(), var_details.value(), | 
 |  132                                          context, receiver, &slow); | 
 |  133       Return(value); | 
 |  134     } | 
 |  135   } | 
 |  136  | 
 |  137   Bind(&slow); | 
 |  138   TailCallRuntime(Runtime::kGetProperty, context, receiver, name); | 
|  113 } |  139 } | 
|  114  |  140  | 
|  115 void Builtins::Generate_LoadIC_Slow(compiler::CodeAssemblerState* state) { |  141 void Builtins::Generate_LoadIC_Slow(compiler::CodeAssemblerState* state) { | 
|  116   typedef compiler::Node Node; |  142   typedef compiler::Node Node; | 
|  117   typedef LoadWithVectorDescriptor Descriptor; |  143   typedef LoadWithVectorDescriptor Descriptor; | 
|  118   CodeStubAssembler assembler(state); |  144   CodeStubAssembler assembler(state); | 
|  119  |  145  | 
|  120   Node* receiver = assembler.Parameter(Descriptor::kReceiver); |  146   Node* receiver = assembler.Parameter(Descriptor::kReceiver); | 
|  121   Node* name = assembler.Parameter(Descriptor::kName); |  147   Node* name = assembler.Parameter(Descriptor::kName); | 
|  122   Node* context = assembler.Parameter(Descriptor::kContext); |  148   Node* context = assembler.Parameter(Descriptor::kContext); | 
| (...skipping 10 matching lines...) Expand all  Loading... | 
|  133   Node* name = assembler.Parameter(Descriptor::kName); |  159   Node* name = assembler.Parameter(Descriptor::kName); | 
|  134   Node* value = assembler.Parameter(Descriptor::kValue); |  160   Node* value = assembler.Parameter(Descriptor::kValue); | 
|  135   Node* slot = assembler.Parameter(Descriptor::kSlot); |  161   Node* slot = assembler.Parameter(Descriptor::kSlot); | 
|  136   Node* vector = assembler.Parameter(Descriptor::kVector); |  162   Node* vector = assembler.Parameter(Descriptor::kVector); | 
|  137   Node* context = assembler.Parameter(Descriptor::kContext); |  163   Node* context = assembler.Parameter(Descriptor::kContext); | 
|  138  |  164  | 
|  139   assembler.TailCallRuntime(Runtime::kStoreIC_Miss, context, value, slot, |  165   assembler.TailCallRuntime(Runtime::kStoreIC_Miss, context, value, slot, | 
|  140                             vector, receiver, name); |  166                             vector, receiver, name); | 
|  141 } |  167 } | 
|  142  |  168  | 
|  143 void Builtins::Generate_StoreIC_Normal(MacroAssembler* masm) { |  169 TF_BUILTIN(StoreIC_Normal, CodeStubAssembler) { | 
|  144   StoreIC::GenerateNormal(masm); |  170   typedef StoreWithVectorDescriptor Descriptor; | 
 |  171  | 
 |  172   Node* receiver = Parameter(Descriptor::kReceiver); | 
 |  173   Node* name = Parameter(Descriptor::kName); | 
 |  174   Node* value = Parameter(Descriptor::kValue); | 
 |  175   Node* slot = Parameter(Descriptor::kSlot); | 
 |  176   Node* vector = Parameter(Descriptor::kVector); | 
 |  177   Node* context = Parameter(Descriptor::kContext); | 
 |  178  | 
 |  179   Label slow(this); | 
 |  180   { | 
 |  181     Node* properties = LoadProperties(receiver); | 
 |  182     Variable var_name_index(this, MachineType::PointerRepresentation()); | 
 |  183     Label found(this, &var_name_index); | 
 |  184     NameDictionaryLookup<NameDictionary>(properties, name, &found, | 
 |  185                                          &var_name_index, &slow); | 
 |  186     Bind(&found); | 
 |  187     { | 
 |  188       const int kNameToDetailsOffset = (NameDictionary::kEntryDetailsIndex - | 
 |  189                                         NameDictionary::kEntryKeyIndex) * | 
 |  190                                        kPointerSize; | 
 |  191       Node* details = LoadFixedArrayElement(properties, var_name_index.value(), | 
 |  192                                             kNameToDetailsOffset); | 
 |  193       // Check that the property is a writable data property (no accessor). | 
 |  194       const int kTypeAndReadOnlyMask = PropertyDetails::KindField::kMask | | 
 |  195                                        PropertyDetails::kAttributesReadOnlyMask; | 
 |  196       STATIC_ASSERT(kData == 0); | 
 |  197       GotoIf(IsSetSmi(details, kTypeAndReadOnlyMask), &slow); | 
 |  198       const int kNameToValueOffset = | 
 |  199           (NameDictionary::kEntryValueIndex - NameDictionary::kEntryKeyIndex) * | 
 |  200           kPointerSize; | 
 |  201       StoreFixedArrayElement(properties, var_name_index.value(), value, | 
 |  202                              UPDATE_WRITE_BARRIER, kNameToValueOffset); | 
 |  203       Return(value); | 
 |  204     } | 
 |  205   } | 
 |  206  | 
 |  207   Bind(&slow); | 
 |  208   TailCallRuntime(Runtime::kStoreIC_Miss, context, value, slot, vector, | 
 |  209                   receiver, name); | 
|  145 } |  210 } | 
|  146  |  211  | 
|  147 void Builtins::Generate_StoreIC_Setter_ForDeopt(MacroAssembler* masm) { |  212 void Builtins::Generate_StoreIC_Setter_ForDeopt(MacroAssembler* masm) { | 
|  148   NamedStoreHandlerCompiler::GenerateStoreViaSetterForDeopt(masm); |  213   NamedStoreHandlerCompiler::GenerateStoreViaSetterForDeopt(masm); | 
|  149 } |  214 } | 
|  150  |  215  | 
|  151 namespace { |  216 namespace { | 
|  152 void Generate_StoreIC_Slow(compiler::CodeAssemblerState* state, |  217 void Generate_StoreIC_Slow(compiler::CodeAssemblerState* state, | 
|  153                            LanguageMode language_mode) { |  218                            LanguageMode language_mode) { | 
|  154   typedef compiler::Node Node; |  219   typedef compiler::Node Node; | 
| (...skipping 18 matching lines...) Expand all  Loading... | 
|  173   Generate_StoreIC_Slow(state, SLOPPY); |  238   Generate_StoreIC_Slow(state, SLOPPY); | 
|  174 } |  239 } | 
|  175  |  240  | 
|  176 void Builtins::Generate_StoreIC_SlowStrict( |  241 void Builtins::Generate_StoreIC_SlowStrict( | 
|  177     compiler::CodeAssemblerState* state) { |  242     compiler::CodeAssemblerState* state) { | 
|  178   Generate_StoreIC_Slow(state, STRICT); |  243   Generate_StoreIC_Slow(state, STRICT); | 
|  179 } |  244 } | 
|  180  |  245  | 
|  181 }  // namespace internal |  246 }  // namespace internal | 
|  182 }  // namespace v8 |  247 }  // namespace v8 | 
| OLD | NEW |