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/bytecode-graph-builder.h" | 5 #include "src/compiler/bytecode-graph-builder.h" |
6 | 6 |
7 #include "src/ast/ast.h" | 7 #include "src/ast/ast.h" |
8 #include "src/ast/scopes.h" | 8 #include "src/ast/scopes.h" |
9 #include "src/compilation-info.h" | 9 #include "src/compilation-info.h" |
10 #include "src/compiler/compiler-source-position-table.h" | 10 #include "src/compiler/compiler-source-position-table.h" |
(...skipping 725 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
736 environment()->BindRegister(bytecode_iterator().GetRegisterOperand(1), value); | 736 environment()->BindRegister(bytecode_iterator().GetRegisterOperand(1), value); |
737 } | 737 } |
738 | 738 |
739 Node* BytecodeGraphBuilder::BuildLoadGlobal(Handle<Name> name, | 739 Node* BytecodeGraphBuilder::BuildLoadGlobal(Handle<Name> name, |
740 uint32_t feedback_slot_index, | 740 uint32_t feedback_slot_index, |
741 TypeofMode typeof_mode) { | 741 TypeofMode typeof_mode) { |
742 VectorSlotPair feedback = CreateVectorSlotPair(feedback_slot_index); | 742 VectorSlotPair feedback = CreateVectorSlotPair(feedback_slot_index); |
743 DCHECK_EQ(FeedbackVectorSlotKind::LOAD_GLOBAL_IC, | 743 DCHECK_EQ(FeedbackVectorSlotKind::LOAD_GLOBAL_IC, |
744 feedback_vector()->GetKind(feedback.slot())); | 744 feedback_vector()->GetKind(feedback.slot())); |
745 const Operator* op = javascript()->LoadGlobal(name, feedback, typeof_mode); | 745 const Operator* op = javascript()->LoadGlobal(name, feedback, typeof_mode); |
746 return NewNode(op, GetFunctionClosure()); | 746 return NewNode(op); |
747 } | 747 } |
748 | 748 |
749 void BytecodeGraphBuilder::VisitLdaGlobal() { | 749 void BytecodeGraphBuilder::VisitLdaGlobal() { |
750 PrepareEagerCheckpoint(); | 750 PrepareEagerCheckpoint(); |
751 Handle<Name> name = | 751 Handle<Name> name = |
752 Handle<Name>::cast(bytecode_iterator().GetConstantForIndexOperand(0)); | 752 Handle<Name>::cast(bytecode_iterator().GetConstantForIndexOperand(0)); |
753 uint32_t feedback_slot_index = bytecode_iterator().GetIndexOperand(1); | 753 uint32_t feedback_slot_index = bytecode_iterator().GetIndexOperand(1); |
754 Node* node = | 754 Node* node = |
755 BuildLoadGlobal(name, feedback_slot_index, TypeofMode::NOT_INSIDE_TYPEOF); | 755 BuildLoadGlobal(name, feedback_slot_index, TypeofMode::NOT_INSIDE_TYPEOF); |
756 environment()->BindAccumulator(node, Environment::kAttachFrameState); | 756 environment()->BindAccumulator(node, Environment::kAttachFrameState); |
(...skipping 11 matching lines...) Expand all Loading... |
768 | 768 |
769 void BytecodeGraphBuilder::BuildStoreGlobal(LanguageMode language_mode) { | 769 void BytecodeGraphBuilder::BuildStoreGlobal(LanguageMode language_mode) { |
770 PrepareEagerCheckpoint(); | 770 PrepareEagerCheckpoint(); |
771 Handle<Name> name = | 771 Handle<Name> name = |
772 Handle<Name>::cast(bytecode_iterator().GetConstantForIndexOperand(0)); | 772 Handle<Name>::cast(bytecode_iterator().GetConstantForIndexOperand(0)); |
773 VectorSlotPair feedback = | 773 VectorSlotPair feedback = |
774 CreateVectorSlotPair(bytecode_iterator().GetIndexOperand(1)); | 774 CreateVectorSlotPair(bytecode_iterator().GetIndexOperand(1)); |
775 Node* value = environment()->LookupAccumulator(); | 775 Node* value = environment()->LookupAccumulator(); |
776 | 776 |
777 const Operator* op = javascript()->StoreGlobal(language_mode, name, feedback); | 777 const Operator* op = javascript()->StoreGlobal(language_mode, name, feedback); |
778 Node* node = NewNode(op, value, GetFunctionClosure()); | 778 Node* node = NewNode(op, value); |
779 environment()->RecordAfterState(node, Environment::kAttachFrameState); | 779 environment()->RecordAfterState(node, Environment::kAttachFrameState); |
780 } | 780 } |
781 | 781 |
782 void BytecodeGraphBuilder::VisitStaGlobalSloppy() { | 782 void BytecodeGraphBuilder::VisitStaGlobalSloppy() { |
783 BuildStoreGlobal(LanguageMode::SLOPPY); | 783 BuildStoreGlobal(LanguageMode::SLOPPY); |
784 } | 784 } |
785 | 785 |
786 void BytecodeGraphBuilder::VisitStaGlobalStrict() { | 786 void BytecodeGraphBuilder::VisitStaGlobalStrict() { |
787 BuildStoreGlobal(LanguageMode::STRICT); | 787 BuildStoreGlobal(LanguageMode::STRICT); |
788 } | 788 } |
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1030 void BytecodeGraphBuilder::VisitLdaNamedProperty() { | 1030 void BytecodeGraphBuilder::VisitLdaNamedProperty() { |
1031 PrepareEagerCheckpoint(); | 1031 PrepareEagerCheckpoint(); |
1032 Node* object = | 1032 Node* object = |
1033 environment()->LookupRegister(bytecode_iterator().GetRegisterOperand(0)); | 1033 environment()->LookupRegister(bytecode_iterator().GetRegisterOperand(0)); |
1034 Handle<Name> name = | 1034 Handle<Name> name = |
1035 Handle<Name>::cast(bytecode_iterator().GetConstantForIndexOperand(1)); | 1035 Handle<Name>::cast(bytecode_iterator().GetConstantForIndexOperand(1)); |
1036 VectorSlotPair feedback = | 1036 VectorSlotPair feedback = |
1037 CreateVectorSlotPair(bytecode_iterator().GetIndexOperand(2)); | 1037 CreateVectorSlotPair(bytecode_iterator().GetIndexOperand(2)); |
1038 | 1038 |
1039 const Operator* op = javascript()->LoadNamed(name, feedback); | 1039 const Operator* op = javascript()->LoadNamed(name, feedback); |
1040 Node* node = NewNode(op, object, GetFunctionClosure()); | 1040 Node* node = NewNode(op, object); |
1041 environment()->BindAccumulator(node, Environment::kAttachFrameState); | 1041 environment()->BindAccumulator(node, Environment::kAttachFrameState); |
1042 } | 1042 } |
1043 | 1043 |
1044 void BytecodeGraphBuilder::VisitLdaKeyedProperty() { | 1044 void BytecodeGraphBuilder::VisitLdaKeyedProperty() { |
1045 PrepareEagerCheckpoint(); | 1045 PrepareEagerCheckpoint(); |
1046 Node* key = environment()->LookupAccumulator(); | 1046 Node* key = environment()->LookupAccumulator(); |
1047 Node* object = | 1047 Node* object = |
1048 environment()->LookupRegister(bytecode_iterator().GetRegisterOperand(0)); | 1048 environment()->LookupRegister(bytecode_iterator().GetRegisterOperand(0)); |
1049 VectorSlotPair feedback = | 1049 VectorSlotPair feedback = |
1050 CreateVectorSlotPair(bytecode_iterator().GetIndexOperand(1)); | 1050 CreateVectorSlotPair(bytecode_iterator().GetIndexOperand(1)); |
1051 | 1051 |
1052 const Operator* op = javascript()->LoadProperty(feedback); | 1052 const Operator* op = javascript()->LoadProperty(feedback); |
1053 Node* node = NewNode(op, object, key, GetFunctionClosure()); | 1053 Node* node = NewNode(op, object, key); |
1054 environment()->BindAccumulator(node, Environment::kAttachFrameState); | 1054 environment()->BindAccumulator(node, Environment::kAttachFrameState); |
1055 } | 1055 } |
1056 | 1056 |
1057 void BytecodeGraphBuilder::BuildNamedStore(LanguageMode language_mode) { | 1057 void BytecodeGraphBuilder::BuildNamedStore(LanguageMode language_mode) { |
1058 PrepareEagerCheckpoint(); | 1058 PrepareEagerCheckpoint(); |
1059 Node* value = environment()->LookupAccumulator(); | 1059 Node* value = environment()->LookupAccumulator(); |
1060 Node* object = | 1060 Node* object = |
1061 environment()->LookupRegister(bytecode_iterator().GetRegisterOperand(0)); | 1061 environment()->LookupRegister(bytecode_iterator().GetRegisterOperand(0)); |
1062 Handle<Name> name = | 1062 Handle<Name> name = |
1063 Handle<Name>::cast(bytecode_iterator().GetConstantForIndexOperand(1)); | 1063 Handle<Name>::cast(bytecode_iterator().GetConstantForIndexOperand(1)); |
1064 VectorSlotPair feedback = | 1064 VectorSlotPair feedback = |
1065 CreateVectorSlotPair(bytecode_iterator().GetIndexOperand(2)); | 1065 CreateVectorSlotPair(bytecode_iterator().GetIndexOperand(2)); |
1066 | 1066 |
1067 const Operator* op = javascript()->StoreNamed(language_mode, name, feedback); | 1067 const Operator* op = javascript()->StoreNamed(language_mode, name, feedback); |
1068 Node* node = NewNode(op, object, value, GetFunctionClosure()); | 1068 Node* node = NewNode(op, object, value); |
1069 environment()->RecordAfterState(node, Environment::kAttachFrameState); | 1069 environment()->RecordAfterState(node, Environment::kAttachFrameState); |
1070 } | 1070 } |
1071 | 1071 |
1072 void BytecodeGraphBuilder::VisitStaNamedPropertySloppy() { | 1072 void BytecodeGraphBuilder::VisitStaNamedPropertySloppy() { |
1073 BuildNamedStore(LanguageMode::SLOPPY); | 1073 BuildNamedStore(LanguageMode::SLOPPY); |
1074 } | 1074 } |
1075 | 1075 |
1076 void BytecodeGraphBuilder::VisitStaNamedPropertyStrict() { | 1076 void BytecodeGraphBuilder::VisitStaNamedPropertyStrict() { |
1077 BuildNamedStore(LanguageMode::STRICT); | 1077 BuildNamedStore(LanguageMode::STRICT); |
1078 } | 1078 } |
1079 | 1079 |
1080 void BytecodeGraphBuilder::BuildKeyedStore(LanguageMode language_mode) { | 1080 void BytecodeGraphBuilder::BuildKeyedStore(LanguageMode language_mode) { |
1081 PrepareEagerCheckpoint(); | 1081 PrepareEagerCheckpoint(); |
1082 Node* value = environment()->LookupAccumulator(); | 1082 Node* value = environment()->LookupAccumulator(); |
1083 Node* object = | 1083 Node* object = |
1084 environment()->LookupRegister(bytecode_iterator().GetRegisterOperand(0)); | 1084 environment()->LookupRegister(bytecode_iterator().GetRegisterOperand(0)); |
1085 Node* key = | 1085 Node* key = |
1086 environment()->LookupRegister(bytecode_iterator().GetRegisterOperand(1)); | 1086 environment()->LookupRegister(bytecode_iterator().GetRegisterOperand(1)); |
1087 VectorSlotPair feedback = | 1087 VectorSlotPair feedback = |
1088 CreateVectorSlotPair(bytecode_iterator().GetIndexOperand(2)); | 1088 CreateVectorSlotPair(bytecode_iterator().GetIndexOperand(2)); |
1089 | 1089 |
1090 const Operator* op = javascript()->StoreProperty(language_mode, feedback); | 1090 const Operator* op = javascript()->StoreProperty(language_mode, feedback); |
1091 Node* node = NewNode(op, object, key, value, GetFunctionClosure()); | 1091 Node* node = NewNode(op, object, key, value); |
1092 environment()->RecordAfterState(node, Environment::kAttachFrameState); | 1092 environment()->RecordAfterState(node, Environment::kAttachFrameState); |
1093 } | 1093 } |
1094 | 1094 |
1095 void BytecodeGraphBuilder::VisitStaKeyedPropertySloppy() { | 1095 void BytecodeGraphBuilder::VisitStaKeyedPropertySloppy() { |
1096 BuildKeyedStore(LanguageMode::SLOPPY); | 1096 BuildKeyedStore(LanguageMode::SLOPPY); |
1097 } | 1097 } |
1098 | 1098 |
1099 void BytecodeGraphBuilder::VisitStaKeyedPropertyStrict() { | 1099 void BytecodeGraphBuilder::VisitStaKeyedPropertyStrict() { |
1100 BuildKeyedStore(LanguageMode::STRICT); | 1100 BuildKeyedStore(LanguageMode::STRICT); |
1101 } | 1101 } |
(...skipping 1124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2226 it->source_position().ScriptOffset(), start_position_.InliningId())); | 2226 it->source_position().ScriptOffset(), start_position_.InliningId())); |
2227 it->Advance(); | 2227 it->Advance(); |
2228 } else { | 2228 } else { |
2229 DCHECK_GT(it->code_offset(), offset); | 2229 DCHECK_GT(it->code_offset(), offset); |
2230 } | 2230 } |
2231 } | 2231 } |
2232 | 2232 |
2233 } // namespace compiler | 2233 } // namespace compiler |
2234 } // namespace internal | 2234 } // namespace internal |
2235 } // namespace v8 | 2235 } // namespace v8 |
OLD | NEW |