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/compiler/ast-graph-builder.h" | 5 #include "src/compiler/ast-graph-builder.h" |
6 | 6 |
7 #include "src/compiler.h" | 7 #include "src/compiler.h" |
8 #include "src/compiler/ast-loop-assignment-analyzer.h" | 8 #include "src/compiler/ast-loop-assignment-analyzer.h" |
9 #include "src/compiler/control-builders.h" | 9 #include "src/compiler/control-builders.h" |
10 #include "src/compiler/js-type-feedback.h" | 10 #include "src/compiler/js-type-feedback.h" |
(...skipping 1815 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1826 for (AccessorTable::Iterator it = accessor_table.begin(); | 1826 for (AccessorTable::Iterator it = accessor_table.begin(); |
1827 it != accessor_table.end(); ++it) { | 1827 it != accessor_table.end(); ++it) { |
1828 VisitForValue(it->first); | 1828 VisitForValue(it->first); |
1829 VisitForValueOrNull(it->second->getter); | 1829 VisitForValueOrNull(it->second->getter); |
1830 VectorSlotPair feedback_getter = CreateVectorSlotPair( | 1830 VectorSlotPair feedback_getter = CreateVectorSlotPair( |
1831 expr->SlotForHomeObject(it->second->getter, &store_slot_index)); | 1831 expr->SlotForHomeObject(it->second->getter, &store_slot_index)); |
1832 BuildSetHomeObject(environment()->Top(), literal, it->second->getter, | 1832 BuildSetHomeObject(environment()->Top(), literal, it->second->getter, |
1833 feedback_getter); | 1833 feedback_getter); |
1834 VisitForValueOrNull(it->second->setter); | 1834 VisitForValueOrNull(it->second->setter); |
1835 VectorSlotPair feedback_setter = CreateVectorSlotPair( | 1835 VectorSlotPair feedback_setter = CreateVectorSlotPair( |
1836 expr->SlotForHomeObject(it->second->getter, &store_slot_index)); | 1836 expr->SlotForHomeObject(it->second->setter, &store_slot_index)); |
Michael Starzinger
2015/06/23 08:31:14
Nice catch! :)
| |
1837 BuildSetHomeObject(environment()->Top(), literal, it->second->setter, | 1837 BuildSetHomeObject(environment()->Top(), literal, it->second->setter, |
1838 feedback_setter); | 1838 feedback_setter); |
1839 Node* setter = environment()->Pop(); | 1839 Node* setter = environment()->Pop(); |
1840 Node* getter = environment()->Pop(); | 1840 Node* getter = environment()->Pop(); |
1841 Node* name = environment()->Pop(); | 1841 Node* name = environment()->Pop(); |
1842 Node* attr = jsgraph()->Constant(NONE); | 1842 Node* attr = jsgraph()->Constant(NONE); |
1843 const Operator* op = | 1843 const Operator* op = |
1844 javascript()->CallRuntime(Runtime::kDefineAccessorPropertyUnchecked, 5); | 1844 javascript()->CallRuntime(Runtime::kDefineAccessorPropertyUnchecked, 5); |
1845 Node* call = NewNode(op, literal, name, getter, setter, attr); | 1845 Node* call = NewNode(op, literal, name, getter, setter, attr); |
1846 // This should not lazy deopt on a new literal. | 1846 // This should not lazy deopt on a new literal. |
(...skipping 1656 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3503 javascript()->LoadNamed(MakeUnique(name), feedback, mode); | 3503 javascript()->LoadNamed(MakeUnique(name), feedback, mode); |
3504 return Record(js_type_feedback_, NewNode(op, object, GetFeedbackVector()), | 3504 return Record(js_type_feedback_, NewNode(op, object, GetFeedbackVector()), |
3505 feedback.slot()); | 3505 feedback.slot()); |
3506 } | 3506 } |
3507 | 3507 |
3508 | 3508 |
3509 Node* AstGraphBuilder::BuildKeyedStore(Node* object, Node* key, Node* value, | 3509 Node* AstGraphBuilder::BuildKeyedStore(Node* object, Node* key, Node* value, |
3510 const VectorSlotPair& feedback, | 3510 const VectorSlotPair& feedback, |
3511 TypeFeedbackId id) { | 3511 TypeFeedbackId id) { |
3512 const Operator* op = javascript()->StoreProperty(language_mode(), feedback); | 3512 const Operator* op = javascript()->StoreProperty(language_mode(), feedback); |
3513 return Record(js_type_feedback_, NewNode(op, object, key, value), id); | 3513 Node* node = NewNode(op, object, key, value, GetFeedbackVector()); |
3514 if (FLAG_vector_stores) { | |
3515 return Record(js_type_feedback_, node, feedback.slot()); | |
3516 } | |
3517 return Record(js_type_feedback_, node, id); | |
3514 } | 3518 } |
3515 | 3519 |
3516 | 3520 |
3517 Node* AstGraphBuilder::BuildNamedStore(Node* object, Handle<Name> name, | 3521 Node* AstGraphBuilder::BuildNamedStore(Node* object, Handle<Name> name, |
3518 Node* value, | 3522 Node* value, |
3519 const VectorSlotPair& feedback, | 3523 const VectorSlotPair& feedback, |
3520 TypeFeedbackId id) { | 3524 TypeFeedbackId id) { |
3521 const Operator* op = | 3525 const Operator* op = |
3522 javascript()->StoreNamed(language_mode(), MakeUnique(name), feedback); | 3526 javascript()->StoreNamed(language_mode(), MakeUnique(name), feedback); |
3523 return Record(js_type_feedback_, NewNode(op, object, value), id); | 3527 Node* node = NewNode(op, object, value, GetFeedbackVector()); |
3528 if (FLAG_vector_stores) { | |
3529 return Record(js_type_feedback_, node, feedback.slot()); | |
3530 } | |
3531 return Record(js_type_feedback_, node, id); | |
3524 } | 3532 } |
3525 | 3533 |
3526 | 3534 |
3527 Node* AstGraphBuilder::BuildNamedSuperLoad(Node* receiver, Node* home_object, | 3535 Node* AstGraphBuilder::BuildNamedSuperLoad(Node* receiver, Node* home_object, |
3528 Handle<Name> name, | 3536 Handle<Name> name, |
3529 const VectorSlotPair& feedback) { | 3537 const VectorSlotPair& feedback) { |
3530 Node* name_node = jsgraph()->Constant(name); | 3538 Node* name_node = jsgraph()->Constant(name); |
3531 const Operator* op = javascript()->CallRuntime(Runtime::kLoadFromSuper, 3); | 3539 const Operator* op = javascript()->CallRuntime(Runtime::kLoadFromSuper, 3); |
3532 Node* value = NewNode(op, receiver, home_object, name_node); | 3540 Node* value = NewNode(op, receiver, home_object, name_node); |
3533 return Record(js_type_feedback_, value, feedback.slot()); | 3541 return Record(js_type_feedback_, value, feedback.slot()); |
(...skipping 578 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
4112 // Phi does not exist yet, introduce one. | 4120 // Phi does not exist yet, introduce one. |
4113 value = NewPhi(inputs, value, control); | 4121 value = NewPhi(inputs, value, control); |
4114 value->ReplaceInput(inputs - 1, other); | 4122 value->ReplaceInput(inputs - 1, other); |
4115 } | 4123 } |
4116 return value; | 4124 return value; |
4117 } | 4125 } |
4118 | 4126 |
4119 } // namespace compiler | 4127 } // namespace compiler |
4120 } // namespace internal | 4128 } // namespace internal |
4121 } // namespace v8 | 4129 } // namespace v8 |
OLD | NEW |