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::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.
| |
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 |