OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 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/compiler/js-native-context-specialization.h" | 5 #include "src/compiler/js-native-context-specialization.h" |
6 | 6 |
7 #include "src/accessors.h" | 7 #include "src/accessors.h" |
8 #include "src/code-factory.h" | 8 #include "src/code-factory.h" |
9 #include "src/compilation-dependencies.h" | 9 #include "src/compilation-dependencies.h" |
10 #include "src/compiler/access-builder.h" | 10 #include "src/compiler/access-builder.h" |
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
235 effect = BuildCheckMaps(constructor, effect, control, | 235 effect = BuildCheckMaps(constructor, effect, control, |
236 access_info.receiver_maps()); | 236 access_info.receiver_maps()); |
237 | 237 |
238 // Call the @@hasInstance handler. | 238 // Call the @@hasInstance handler. |
239 Node* target = jsgraph()->Constant(constant); | 239 Node* target = jsgraph()->Constant(constant); |
240 node->InsertInput(graph()->zone(), 0, target); | 240 node->InsertInput(graph()->zone(), 0, target); |
241 node->ReplaceInput(1, constructor); | 241 node->ReplaceInput(1, constructor); |
242 node->ReplaceInput(2, object); | 242 node->ReplaceInput(2, object); |
243 node->ReplaceInput(5, effect); | 243 node->ReplaceInput(5, effect); |
244 NodeProperties::ChangeOp( | 244 NodeProperties::ChangeOp( |
245 node, | 245 node, javascript()->Call(3, CallFrequency(), VectorSlotPair(), |
246 javascript()->Call(3, 0.0f, VectorSlotPair(), | 246 ConvertReceiverMode::kNotNullOrUndefined)); |
247 ConvertReceiverMode::kNotNullOrUndefined)); | |
248 | 247 |
249 // Rewire the value uses of {node} to ToBoolean conversion of the result. | 248 // Rewire the value uses of {node} to ToBoolean conversion of the result. |
250 Node* value = graph()->NewNode(javascript()->ToBoolean(ToBooleanHint::kAny), | 249 Node* value = graph()->NewNode(javascript()->ToBoolean(ToBooleanHint::kAny), |
251 node, context); | 250 node, context); |
252 for (Edge edge : node->use_edges()) { | 251 for (Edge edge : node->use_edges()) { |
253 if (NodeProperties::IsValueEdge(edge) && edge.from() != value) { | 252 if (NodeProperties::IsValueEdge(edge) && edge.from() != value) { |
254 edge.UpdateTo(value); | 253 edge.UpdateTo(value); |
255 Revisit(edge.from()); | 254 Revisit(edge.from()); |
256 } | 255 } |
257 } | 256 } |
(...skipping 1238 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1496 OutputFrameStateCombine::Ignore(), | 1495 OutputFrameStateCombine::Ignore(), |
1497 frame_info0), | 1496 frame_info0), |
1498 graph()->NewNode(common()->StateValues(1, SparseInputMask::Dense()), | 1497 graph()->NewNode(common()->StateValues(1, SparseInputMask::Dense()), |
1499 receiver), | 1498 receiver), |
1500 jsgraph()->EmptyStateValues(), jsgraph()->EmptyStateValues(), | 1499 jsgraph()->EmptyStateValues(), jsgraph()->EmptyStateValues(), |
1501 context, target, frame_state); | 1500 context, target, frame_state); |
1502 | 1501 |
1503 // Introduce the call to the getter function. | 1502 // Introduce the call to the getter function. |
1504 if (access_info.constant()->IsJSFunction()) { | 1503 if (access_info.constant()->IsJSFunction()) { |
1505 value = effect = control = graph()->NewNode( | 1504 value = effect = control = graph()->NewNode( |
1506 javascript()->Call(2, 0.0f, VectorSlotPair(), | 1505 javascript()->Call(2, CallFrequency(), VectorSlotPair(), |
1507 ConvertReceiverMode::kNotNullOrUndefined), | 1506 ConvertReceiverMode::kNotNullOrUndefined), |
1508 target, receiver, context, frame_state0, effect, control); | 1507 target, receiver, context, frame_state0, effect, control); |
1509 } else { | 1508 } else { |
1510 DCHECK(access_info.constant()->IsFunctionTemplateInfo()); | 1509 DCHECK(access_info.constant()->IsFunctionTemplateInfo()); |
1511 Handle<FunctionTemplateInfo> function_template_info( | 1510 Handle<FunctionTemplateInfo> function_template_info( |
1512 Handle<FunctionTemplateInfo>::cast(access_info.constant())); | 1511 Handle<FunctionTemplateInfo>::cast(access_info.constant())); |
1513 DCHECK(!function_template_info->call_code()->IsUndefined(isolate())); | 1512 DCHECK(!function_template_info->call_code()->IsUndefined(isolate())); |
1514 ValueEffectControl value_effect_control = InlineApiCall( | 1513 ValueEffectControl value_effect_control = InlineApiCall( |
1515 receiver, context, target, frame_state0, nullptr, effect, control, | 1514 receiver, context, target, frame_state0, nullptr, effect, control, |
1516 shared_info, function_template_info); | 1515 shared_info, function_template_info); |
(...skipping 15 matching lines...) Expand all Loading... |
1532 OutputFrameStateCombine::Ignore(), | 1531 OutputFrameStateCombine::Ignore(), |
1533 frame_info0), | 1532 frame_info0), |
1534 graph()->NewNode(common()->StateValues(2, SparseInputMask::Dense()), | 1533 graph()->NewNode(common()->StateValues(2, SparseInputMask::Dense()), |
1535 receiver, value), | 1534 receiver, value), |
1536 jsgraph()->EmptyStateValues(), jsgraph()->EmptyStateValues(), | 1535 jsgraph()->EmptyStateValues(), jsgraph()->EmptyStateValues(), |
1537 context, target, frame_state); | 1536 context, target, frame_state); |
1538 | 1537 |
1539 // Introduce the call to the setter function. | 1538 // Introduce the call to the setter function. |
1540 if (access_info.constant()->IsJSFunction()) { | 1539 if (access_info.constant()->IsJSFunction()) { |
1541 effect = control = graph()->NewNode( | 1540 effect = control = graph()->NewNode( |
1542 javascript()->Call(3, 0.0f, VectorSlotPair(), | 1541 javascript()->Call(3, CallFrequency(), VectorSlotPair(), |
1543 ConvertReceiverMode::kNotNullOrUndefined), | 1542 ConvertReceiverMode::kNotNullOrUndefined), |
1544 target, receiver, value, context, frame_state0, effect, control); | 1543 target, receiver, value, context, frame_state0, effect, control); |
1545 } else { | 1544 } else { |
1546 DCHECK(access_info.constant()->IsFunctionTemplateInfo()); | 1545 DCHECK(access_info.constant()->IsFunctionTemplateInfo()); |
1547 Handle<FunctionTemplateInfo> function_template_info( | 1546 Handle<FunctionTemplateInfo> function_template_info( |
1548 Handle<FunctionTemplateInfo>::cast(access_info.constant())); | 1547 Handle<FunctionTemplateInfo>::cast(access_info.constant())); |
1549 DCHECK(!function_template_info->call_code()->IsUndefined(isolate())); | 1548 DCHECK(!function_template_info->call_code()->IsUndefined(isolate())); |
1550 ValueEffectControl value_effect_control = InlineApiCall( | 1549 ValueEffectControl value_effect_control = InlineApiCall( |
1551 receiver, context, target, frame_state0, value, effect, control, | 1550 receiver, context, target, frame_state0, value, effect, control, |
1552 shared_info, function_template_info); | 1551 shared_info, function_template_info); |
(...skipping 1018 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2571 return jsgraph()->javascript(); | 2570 return jsgraph()->javascript(); |
2572 } | 2571 } |
2573 | 2572 |
2574 SimplifiedOperatorBuilder* JSNativeContextSpecialization::simplified() const { | 2573 SimplifiedOperatorBuilder* JSNativeContextSpecialization::simplified() const { |
2575 return jsgraph()->simplified(); | 2574 return jsgraph()->simplified(); |
2576 } | 2575 } |
2577 | 2576 |
2578 } // namespace compiler | 2577 } // namespace compiler |
2579 } // namespace internal | 2578 } // namespace internal |
2580 } // namespace v8 | 2579 } // namespace v8 |
OLD | NEW |