OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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/code-factory.h" |
5 #include "src/code-stubs.h" | 6 #include "src/code-stubs.h" |
6 #include "src/compiler/common-operator.h" | 7 #include "src/compiler/common-operator.h" |
7 #include "src/compiler/graph-inl.h" | 8 #include "src/compiler/graph-inl.h" |
8 #include "src/compiler/js-generic-lowering.h" | 9 #include "src/compiler/js-generic-lowering.h" |
9 #include "src/compiler/machine-operator.h" | 10 #include "src/compiler/machine-operator.h" |
10 #include "src/compiler/node-aux-data-inl.h" | 11 #include "src/compiler/node-aux-data-inl.h" |
11 #include "src/compiler/node-properties-inl.h" | 12 #include "src/compiler/node-properties-inl.h" |
12 #include "src/unique.h" | 13 #include "src/unique.h" |
13 | 14 |
14 namespace v8 { | 15 namespace v8 { |
15 namespace internal { | 16 namespace internal { |
16 namespace compiler { | 17 namespace compiler { |
17 | 18 |
18 | |
19 // TODO(mstarzinger): This is a temporary shim to be able to call an IC stub | |
20 // which doesn't have an interface descriptor yet. It mimics a hydrogen code | |
21 // stub for the underlying IC stub code. | |
22 class LoadICStubShim : public HydrogenCodeStub { | |
23 public: | |
24 LoadICStubShim(Isolate* isolate, ContextualMode contextual_mode) | |
25 : HydrogenCodeStub(isolate), contextual_mode_(contextual_mode) {} | |
26 | |
27 virtual Handle<Code> GenerateCode() OVERRIDE { | |
28 ExtraICState extra_state = LoadIC::ComputeExtraICState(contextual_mode_); | |
29 return LoadIC::initialize_stub(isolate(), extra_state); | |
30 } | |
31 | |
32 virtual CallInterfaceDescriptor GetCallInterfaceDescriptor() OVERRIDE { | |
33 return LoadDescriptor(isolate()); | |
34 } | |
35 | |
36 private: | |
37 virtual Major MajorKey() const OVERRIDE { return NoCache; } | |
38 virtual bool UseSpecialCache() OVERRIDE { return true; } | |
39 | |
40 ContextualMode contextual_mode_; | |
41 }; | |
42 | |
43 | |
44 // TODO(mstarzinger): This is a temporary shim to be able to call an IC stub | |
45 // which doesn't have an interface descriptor yet. It mimics a hydrogen code | |
46 // stub for the underlying IC stub code. | |
47 class KeyedLoadICStubShim : public HydrogenCodeStub { | |
48 public: | |
49 explicit KeyedLoadICStubShim(Isolate* isolate) : HydrogenCodeStub(isolate) {} | |
50 | |
51 virtual Handle<Code> GenerateCode() OVERRIDE { | |
52 return isolate()->builtins()->KeyedLoadIC_Initialize(); | |
53 } | |
54 | |
55 virtual CallInterfaceDescriptor GetCallInterfaceDescriptor() OVERRIDE { | |
56 return LoadDescriptor(isolate()); | |
57 } | |
58 | |
59 private: | |
60 virtual Major MajorKey() const OVERRIDE { return NoCache; } | |
61 virtual bool UseSpecialCache() OVERRIDE { return true; } | |
62 }; | |
63 | |
64 | |
65 // TODO(mstarzinger): This is a temporary shim to be able to call an IC stub | |
66 // which doesn't have an interface descriptor yet. It mimics a hydrogen code | |
67 // stub for the underlying IC stub code. | |
68 class StoreICStubShim : public HydrogenCodeStub { | |
69 public: | |
70 StoreICStubShim(Isolate* isolate, StrictMode strict_mode) | |
71 : HydrogenCodeStub(isolate), strict_mode_(strict_mode) {} | |
72 | |
73 virtual Handle<Code> GenerateCode() OVERRIDE { | |
74 return StoreIC::initialize_stub(isolate(), strict_mode_); | |
75 } | |
76 | |
77 virtual CallInterfaceDescriptor GetCallInterfaceDescriptor() OVERRIDE { | |
78 return StoreDescriptor(isolate()); | |
79 } | |
80 | |
81 private: | |
82 virtual Major MajorKey() const OVERRIDE { return NoCache; } | |
83 virtual bool UseSpecialCache() OVERRIDE { return true; } | |
84 | |
85 StrictMode strict_mode_; | |
86 }; | |
87 | |
88 | |
89 // TODO(mstarzinger): This is a temporary shim to be able to call an IC stub | |
90 // which doesn't have an interface descriptor yet. It mimics a hydrogen code | |
91 // stub for the underlying IC stub code. | |
92 class KeyedStoreICStubShim : public HydrogenCodeStub { | |
93 public: | |
94 KeyedStoreICStubShim(Isolate* isolate, StrictMode strict_mode) | |
95 : HydrogenCodeStub(isolate), strict_mode_(strict_mode) {} | |
96 | |
97 virtual Handle<Code> GenerateCode() OVERRIDE { | |
98 return strict_mode_ == SLOPPY | |
99 ? isolate()->builtins()->KeyedStoreIC_Initialize() | |
100 : isolate()->builtins()->KeyedStoreIC_Initialize_Strict(); | |
101 } | |
102 | |
103 virtual CallInterfaceDescriptor GetCallInterfaceDescriptor() OVERRIDE { | |
104 return StoreDescriptor(isolate()); | |
105 } | |
106 | |
107 private: | |
108 virtual Major MajorKey() const OVERRIDE { return NoCache; } | |
109 virtual bool UseSpecialCache() OVERRIDE { return true; } | |
110 | |
111 StrictMode strict_mode_; | |
112 }; | |
113 | |
114 | |
115 JSGenericLowering::JSGenericLowering(CompilationInfo* info, JSGraph* jsgraph, | 19 JSGenericLowering::JSGenericLowering(CompilationInfo* info, JSGraph* jsgraph, |
116 MachineOperatorBuilder* machine) | 20 MachineOperatorBuilder* machine) |
117 : info_(info), | 21 : info_(info), |
118 jsgraph_(jsgraph), | 22 jsgraph_(jsgraph), |
119 linkage_(new (jsgraph->zone()) Linkage(info)), | 23 linkage_(new (jsgraph->zone()) Linkage(info)), |
120 machine_(machine) {} | 24 machine_(machine) {} |
121 | 25 |
122 | 26 |
123 void JSGenericLowering::PatchOperator(Node* node, const Operator* op) { | 27 void JSGenericLowering::PatchOperator(Node* node, const Operator* op) { |
124 node->set_op(op); | 28 node->set_op(op); |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
168 #undef DECLARE_CASE | 72 #undef DECLARE_CASE |
169 default: | 73 default: |
170 // Nothing to see. | 74 // Nothing to see. |
171 return NoChange(); | 75 return NoChange(); |
172 } | 76 } |
173 DCHECK_EQ(node, replacement); | 77 DCHECK_EQ(node, replacement); |
174 return Changed(replacement); | 78 return Changed(replacement); |
175 } | 79 } |
176 | 80 |
177 | 81 |
178 #define REPLACE_BINARY_OP_IC_CALL(op, token) \ | 82 #define REPLACE_BINARY_OP_IC_CALL(op, token) \ |
179 Node* JSGenericLowering::Lower##op(Node* node) { \ | 83 Node* JSGenericLowering::Lower##op(Node* node) { \ |
180 BinaryOpICStub stub(isolate(), token); \ | 84 ReplaceWithStubCall(node, CodeFactory::BinaryOpIC(isolate(), token), \ |
181 ReplaceWithStubCall(node, &stub, \ | 85 CallDescriptor::kPatchableCallSiteWithNop); \ |
182 CallDescriptor::kPatchableCallSiteWithNop); \ | 86 return node; \ |
183 return node; \ | |
184 } | 87 } |
185 REPLACE_BINARY_OP_IC_CALL(JSBitwiseOr, Token::BIT_OR) | 88 REPLACE_BINARY_OP_IC_CALL(JSBitwiseOr, Token::BIT_OR) |
186 REPLACE_BINARY_OP_IC_CALL(JSBitwiseXor, Token::BIT_XOR) | 89 REPLACE_BINARY_OP_IC_CALL(JSBitwiseXor, Token::BIT_XOR) |
187 REPLACE_BINARY_OP_IC_CALL(JSBitwiseAnd, Token::BIT_AND) | 90 REPLACE_BINARY_OP_IC_CALL(JSBitwiseAnd, Token::BIT_AND) |
188 REPLACE_BINARY_OP_IC_CALL(JSShiftLeft, Token::SHL) | 91 REPLACE_BINARY_OP_IC_CALL(JSShiftLeft, Token::SHL) |
189 REPLACE_BINARY_OP_IC_CALL(JSShiftRight, Token::SAR) | 92 REPLACE_BINARY_OP_IC_CALL(JSShiftRight, Token::SAR) |
190 REPLACE_BINARY_OP_IC_CALL(JSShiftRightLogical, Token::SHR) | 93 REPLACE_BINARY_OP_IC_CALL(JSShiftRightLogical, Token::SHR) |
191 REPLACE_BINARY_OP_IC_CALL(JSAdd, Token::ADD) | 94 REPLACE_BINARY_OP_IC_CALL(JSAdd, Token::ADD) |
192 REPLACE_BINARY_OP_IC_CALL(JSSubtract, Token::SUB) | 95 REPLACE_BINARY_OP_IC_CALL(JSSubtract, Token::SUB) |
193 REPLACE_BINARY_OP_IC_CALL(JSMultiply, Token::MUL) | 96 REPLACE_BINARY_OP_IC_CALL(JSMultiply, Token::MUL) |
194 REPLACE_BINARY_OP_IC_CALL(JSDivide, Token::DIV) | 97 REPLACE_BINARY_OP_IC_CALL(JSDivide, Token::DIV) |
195 REPLACE_BINARY_OP_IC_CALL(JSModulus, Token::MOD) | 98 REPLACE_BINARY_OP_IC_CALL(JSModulus, Token::MOD) |
196 #undef REPLACE_BINARY_OP_IC_CALL | 99 #undef REPLACE_BINARY_OP_IC_CALL |
197 | 100 |
198 | 101 |
199 #define REPLACE_STUB_CALL(op, StubDeclaration) \ | 102 #define REPLACE_FACTORY_CALL(op, FactoryDeclaration) \ |
200 Node* JSGenericLowering::Lower##op(Node* node) { \ | 103 Node* JSGenericLowering::Lower##op(Node* node) { \ |
201 StubDeclaration; \ | 104 Callable callable = FactoryDeclaration; \ |
202 ReplaceWithStubCall(node, &stub, CallDescriptor::kNoFlags); \ | 105 ReplaceWithStubCall(node, callable, CallDescriptor::kNoFlags); \ |
203 return node; \ | 106 return node; \ |
204 } | 107 } |
205 REPLACE_STUB_CALL(JSToNumber, ToNumberStub stub(isolate())) | 108 REPLACE_FACTORY_CALL(JSToNumber, CodeFactory::ToNumber(isolate())) |
206 #undef REPLACE_STUB_CALL | 109 #undef REPLACE_FACTORY_CALL |
207 | 110 |
208 | 111 |
209 #define REPLACE_COMPARE_IC_CALL(op, token, pure) \ | 112 #define REPLACE_COMPARE_IC_CALL(op, token, pure) \ |
210 Node* JSGenericLowering::Lower##op(Node* node) { \ | 113 Node* JSGenericLowering::Lower##op(Node* node) { \ |
211 ReplaceWithCompareIC(node, token, pure); \ | 114 ReplaceWithCompareIC(node, token, pure); \ |
212 return node; \ | 115 return node; \ |
213 } | 116 } |
214 REPLACE_COMPARE_IC_CALL(JSEqual, Token::EQ, false) | 117 REPLACE_COMPARE_IC_CALL(JSEqual, Token::EQ, false) |
215 REPLACE_COMPARE_IC_CALL(JSNotEqual, Token::NE, false) | 118 REPLACE_COMPARE_IC_CALL(JSNotEqual, Token::NE, false) |
216 REPLACE_COMPARE_IC_CALL(JSStrictEqual, Token::EQ_STRICT, true) | 119 REPLACE_COMPARE_IC_CALL(JSStrictEqual, Token::EQ_STRICT, true) |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
253 CallDescriptor::Flags result = CallDescriptor::kNoFlags; | 156 CallDescriptor::Flags result = CallDescriptor::kNoFlags; |
254 if (OperatorProperties::HasFrameStateInput(node->op())) { | 157 if (OperatorProperties::HasFrameStateInput(node->op())) { |
255 result |= CallDescriptor::kNeedsFrameState; | 158 result |= CallDescriptor::kNeedsFrameState; |
256 } | 159 } |
257 return result; | 160 return result; |
258 } | 161 } |
259 | 162 |
260 | 163 |
261 void JSGenericLowering::ReplaceWithCompareIC(Node* node, Token::Value token, | 164 void JSGenericLowering::ReplaceWithCompareIC(Node* node, Token::Value token, |
262 bool pure) { | 165 bool pure) { |
263 BinaryOpICStub stub(isolate(), Token::ADD); // TODO(mstarzinger): Hack. | 166 Callable callable = CodeFactory::CompareIC(isolate(), token); |
264 CallInterfaceDescriptor d = stub.GetCallInterfaceDescriptor(); | |
265 bool has_frame_state = OperatorProperties::HasFrameStateInput(node->op()); | 167 bool has_frame_state = OperatorProperties::HasFrameStateInput(node->op()); |
266 CallDescriptor* desc_compare = linkage()->GetStubCallDescriptor( | 168 CallDescriptor* desc_compare = linkage()->GetStubCallDescriptor( |
267 d, 0, CallDescriptor::kPatchableCallSiteWithNop | FlagsForNode(node)); | 169 callable.descriptor(), 0, |
268 Handle<Code> ic = CompareIC::GetUninitialized(isolate(), token); | 170 CallDescriptor::kPatchableCallSiteWithNop | FlagsForNode(node)); |
269 NodeVector inputs(zone()); | 171 NodeVector inputs(zone()); |
270 inputs.reserve(node->InputCount() + 1); | 172 inputs.reserve(node->InputCount() + 1); |
271 inputs.push_back(CodeConstant(ic)); | 173 inputs.push_back(CodeConstant(callable.code())); |
272 inputs.push_back(NodeProperties::GetValueInput(node, 0)); | 174 inputs.push_back(NodeProperties::GetValueInput(node, 0)); |
273 inputs.push_back(NodeProperties::GetValueInput(node, 1)); | 175 inputs.push_back(NodeProperties::GetValueInput(node, 1)); |
274 inputs.push_back(NodeProperties::GetContextInput(node)); | 176 inputs.push_back(NodeProperties::GetContextInput(node)); |
275 if (pure) { | 177 if (pure) { |
276 // A pure (strict) comparison doesn't have an effect, control or frame | 178 // A pure (strict) comparison doesn't have an effect, control or frame |
277 // state. But for the graph, we need to add control and effect inputs. | 179 // state. But for the graph, we need to add control and effect inputs. |
278 DCHECK(!has_frame_state); | 180 DCHECK(!has_frame_state); |
279 inputs.push_back(graph()->start()); | 181 inputs.push_back(graph()->start()); |
280 inputs.push_back(graph()->start()); | 182 inputs.push_back(graph()->start()); |
281 } else { | 183 } else { |
(...skipping 20 matching lines...) Expand all Loading... |
302 node->ReplaceInput(dest, node->InputAt(i)); | 204 node->ReplaceInput(dest, node->InputAt(i)); |
303 dest++; | 205 dest++; |
304 } | 206 } |
305 node->TrimInputCount(dest); | 207 node->TrimInputCount(dest); |
306 } | 208 } |
307 | 209 |
308 ReplaceWithRuntimeCall(node, Runtime::kBooleanize); | 210 ReplaceWithRuntimeCall(node, Runtime::kBooleanize); |
309 } | 211 } |
310 | 212 |
311 | 213 |
312 void JSGenericLowering::ReplaceWithStubCall(Node* node, HydrogenCodeStub* stub, | 214 void JSGenericLowering::ReplaceWithStubCall(Node* node, Callable callable, |
313 CallDescriptor::Flags flags) { | 215 CallDescriptor::Flags flags) { |
314 CallInterfaceDescriptor d = stub->GetCallInterfaceDescriptor(); | 216 CallDescriptor* desc = linkage()->GetStubCallDescriptor( |
315 CallDescriptor* desc = | 217 callable.descriptor(), 0, flags | FlagsForNode(node)); |
316 linkage()->GetStubCallDescriptor(d, 0, flags | FlagsForNode(node)); | 218 Node* stub_code = CodeConstant(callable.code()); |
317 Node* stub_code = CodeConstant(stub->GetCode()); | |
318 PatchInsertInput(node, 0, stub_code); | 219 PatchInsertInput(node, 0, stub_code); |
319 PatchOperator(node, common()->Call(desc)); | 220 PatchOperator(node, common()->Call(desc)); |
320 } | 221 } |
321 | 222 |
322 | 223 |
323 void JSGenericLowering::ReplaceWithBuiltinCall(Node* node, | 224 void JSGenericLowering::ReplaceWithBuiltinCall(Node* node, |
324 Builtins::JavaScript id, | 225 Builtins::JavaScript id, |
325 int nargs) { | 226 int nargs) { |
326 CallFunctionStub stub(isolate(), nargs - 1, NO_CALL_FUNCTION_FLAGS); | 227 Callable callable = |
327 CallInterfaceDescriptor d = stub.GetCallInterfaceDescriptor(); | 228 CodeFactory::CallFunction(isolate(), nargs - 1, NO_CALL_FUNCTION_FLAGS); |
328 CallDescriptor* desc = linkage()->GetStubCallDescriptor(d, nargs); | 229 CallDescriptor* desc = |
| 230 linkage()->GetStubCallDescriptor(callable.descriptor(), nargs); |
329 // TODO(mstarzinger): Accessing the builtins object this way prevents sharing | 231 // TODO(mstarzinger): Accessing the builtins object this way prevents sharing |
330 // of code across native contexts. Fix this by loading from given context. | 232 // of code across native contexts. Fix this by loading from given context. |
331 Handle<JSFunction> function( | 233 Handle<JSFunction> function( |
332 JSFunction::cast(info()->context()->builtins()->javascript_builtin(id))); | 234 JSFunction::cast(info()->context()->builtins()->javascript_builtin(id))); |
333 Node* stub_code = CodeConstant(stub.GetCode()); | 235 Node* stub_code = CodeConstant(callable.code()); |
334 Node* function_node = FunctionConstant(function); | 236 Node* function_node = FunctionConstant(function); |
335 PatchInsertInput(node, 0, stub_code); | 237 PatchInsertInput(node, 0, stub_code); |
336 PatchInsertInput(node, 1, function_node); | 238 PatchInsertInput(node, 1, function_node); |
337 PatchOperator(node, common()->Call(desc)); | 239 PatchOperator(node, common()->Call(desc)); |
338 } | 240 } |
339 | 241 |
340 | 242 |
341 void JSGenericLowering::ReplaceWithRuntimeCall(Node* node, | 243 void JSGenericLowering::ReplaceWithRuntimeCall(Node* node, |
342 Runtime::FunctionId f, | 244 Runtime::FunctionId f, |
343 int nargs_override) { | 245 int nargs_override) { |
(...skipping 21 matching lines...) Expand all Loading... |
365 // poor-man's representation inference here and insert manual change. | 267 // poor-man's representation inference here and insert manual change. |
366 Node* test = graph()->NewNode(machine()->WordEqual(), node->InputAt(0), | 268 Node* test = graph()->NewNode(machine()->WordEqual(), node->InputAt(0), |
367 jsgraph()->TrueConstant()); | 269 jsgraph()->TrueConstant()); |
368 node->ReplaceInput(0, test); | 270 node->ReplaceInput(0, test); |
369 } | 271 } |
370 return node; | 272 return node; |
371 } | 273 } |
372 | 274 |
373 | 275 |
374 Node* JSGenericLowering::LowerJSUnaryNot(Node* node) { | 276 Node* JSGenericLowering::LowerJSUnaryNot(Node* node) { |
375 ToBooleanStub stub(isolate(), ToBooleanStub::RESULT_AS_INVERSE_ODDBALL); | 277 Callable callable = CodeFactory::ToBoolean( |
376 ReplaceWithStubCall(node, &stub, CallDescriptor::kPatchableCallSite); | 278 isolate(), ToBooleanStub::RESULT_AS_INVERSE_ODDBALL); |
| 279 ReplaceWithStubCall(node, callable, CallDescriptor::kPatchableCallSite); |
377 return node; | 280 return node; |
378 } | 281 } |
379 | 282 |
380 | 283 |
381 Node* JSGenericLowering::LowerJSToBoolean(Node* node) { | 284 Node* JSGenericLowering::LowerJSToBoolean(Node* node) { |
382 ToBooleanStub stub(isolate(), ToBooleanStub::RESULT_AS_ODDBALL); | 285 Callable callable = |
383 ReplaceWithStubCall(node, &stub, CallDescriptor::kPatchableCallSite); | 286 CodeFactory::ToBoolean(isolate(), ToBooleanStub::RESULT_AS_ODDBALL); |
| 287 ReplaceWithStubCall(node, callable, CallDescriptor::kPatchableCallSite); |
384 return node; | 288 return node; |
385 } | 289 } |
386 | 290 |
387 | 291 |
388 Node* JSGenericLowering::LowerJSToString(Node* node) { | 292 Node* JSGenericLowering::LowerJSToString(Node* node) { |
389 ReplaceWithBuiltinCall(node, Builtins::TO_STRING, 1); | 293 ReplaceWithBuiltinCall(node, Builtins::TO_STRING, 1); |
390 return node; | 294 return node; |
391 } | 295 } |
392 | 296 |
393 | 297 |
394 Node* JSGenericLowering::LowerJSToObject(Node* node) { | 298 Node* JSGenericLowering::LowerJSToObject(Node* node) { |
395 ReplaceWithBuiltinCall(node, Builtins::TO_OBJECT, 1); | 299 ReplaceWithBuiltinCall(node, Builtins::TO_OBJECT, 1); |
396 return node; | 300 return node; |
397 } | 301 } |
398 | 302 |
399 | 303 |
400 Node* JSGenericLowering::LowerJSLoadProperty(Node* node) { | 304 Node* JSGenericLowering::LowerJSLoadProperty(Node* node) { |
401 KeyedLoadICStubShim stub(isolate()); | 305 Callable callable = CodeFactory::KeyedLoadIC(isolate()); |
402 ReplaceWithStubCall(node, &stub, CallDescriptor::kPatchableCallSite); | 306 ReplaceWithStubCall(node, callable, CallDescriptor::kPatchableCallSite); |
403 return node; | 307 return node; |
404 } | 308 } |
405 | 309 |
406 | 310 |
407 Node* JSGenericLowering::LowerJSLoadNamed(Node* node) { | 311 Node* JSGenericLowering::LowerJSLoadNamed(Node* node) { |
408 LoadNamedParameters p = OpParameter<LoadNamedParameters>(node); | 312 LoadNamedParameters p = OpParameter<LoadNamedParameters>(node); |
409 LoadICStubShim stub(isolate(), p.contextual_mode); | |
410 PatchInsertInput(node, 1, jsgraph()->HeapConstant(p.name)); | 313 PatchInsertInput(node, 1, jsgraph()->HeapConstant(p.name)); |
411 ReplaceWithStubCall(node, &stub, CallDescriptor::kPatchableCallSite); | 314 Callable callable = CodeFactory::LoadIC(isolate(), p.contextual_mode); |
| 315 ReplaceWithStubCall(node, callable, CallDescriptor::kPatchableCallSite); |
412 return node; | 316 return node; |
413 } | 317 } |
414 | 318 |
415 | 319 |
416 Node* JSGenericLowering::LowerJSStoreProperty(Node* node) { | 320 Node* JSGenericLowering::LowerJSStoreProperty(Node* node) { |
417 StrictMode strict_mode = OpParameter<StrictMode>(node); | 321 StrictMode strict_mode = OpParameter<StrictMode>(node); |
418 KeyedStoreICStubShim stub(isolate(), strict_mode); | 322 Callable callable = CodeFactory::KeyedStoreIC(isolate(), strict_mode); |
419 ReplaceWithStubCall(node, &stub, CallDescriptor::kPatchableCallSite); | 323 ReplaceWithStubCall(node, callable, CallDescriptor::kPatchableCallSite); |
420 return node; | 324 return node; |
421 } | 325 } |
422 | 326 |
423 | 327 |
424 Node* JSGenericLowering::LowerJSStoreNamed(Node* node) { | 328 Node* JSGenericLowering::LowerJSStoreNamed(Node* node) { |
425 StoreNamedParameters params = OpParameter<StoreNamedParameters>(node); | 329 StoreNamedParameters params = OpParameter<StoreNamedParameters>(node); |
426 StoreICStubShim stub(isolate(), params.strict_mode); | 330 Callable callable = CodeFactory::StoreIC(isolate(), params.strict_mode); |
427 PatchInsertInput(node, 1, jsgraph()->HeapConstant(params.name)); | 331 PatchInsertInput(node, 1, jsgraph()->HeapConstant(params.name)); |
428 ReplaceWithStubCall(node, &stub, CallDescriptor::kPatchableCallSite); | 332 ReplaceWithStubCall(node, callable, CallDescriptor::kPatchableCallSite); |
429 return node; | 333 return node; |
430 } | 334 } |
431 | 335 |
432 | 336 |
433 Node* JSGenericLowering::LowerJSDeleteProperty(Node* node) { | 337 Node* JSGenericLowering::LowerJSDeleteProperty(Node* node) { |
434 StrictMode strict_mode = OpParameter<StrictMode>(node); | 338 StrictMode strict_mode = OpParameter<StrictMode>(node); |
435 PatchInsertInput(node, 2, SmiConstant(strict_mode)); | 339 PatchInsertInput(node, 2, SmiConstant(strict_mode)); |
436 ReplaceWithBuiltinCall(node, Builtins::DELETE, 3); | 340 ReplaceWithBuiltinCall(node, Builtins::DELETE, 3); |
437 return node; | 341 return node; |
438 } | 342 } |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
528 Node* JSGenericLowering::LowerJSCallRuntime(Node* node) { | 432 Node* JSGenericLowering::LowerJSCallRuntime(Node* node) { |
529 Runtime::FunctionId function = OpParameter<Runtime::FunctionId>(node); | 433 Runtime::FunctionId function = OpParameter<Runtime::FunctionId>(node); |
530 int arity = OperatorProperties::GetValueInputCount(node->op()); | 434 int arity = OperatorProperties::GetValueInputCount(node->op()); |
531 ReplaceWithRuntimeCall(node, function, arity); | 435 ReplaceWithRuntimeCall(node, function, arity); |
532 return node; | 436 return node; |
533 } | 437 } |
534 | 438 |
535 } // namespace compiler | 439 } // namespace compiler |
536 } // namespace internal | 440 } // namespace internal |
537 } // namespace v8 | 441 } // namespace v8 |
OLD | NEW |