| 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/bytecode-branch-analysis.h" | 10 #include "src/compiler/bytecode-branch-analysis.h" |
| (...skipping 690 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 701 Node* node = | 701 Node* node = |
| 702 jsgraph()->Constant(bytecode_iterator().GetConstantForIndexOperand(0)); | 702 jsgraph()->Constant(bytecode_iterator().GetConstantForIndexOperand(0)); |
| 703 environment()->BindAccumulator(node); | 703 environment()->BindAccumulator(node); |
| 704 } | 704 } |
| 705 | 705 |
| 706 void BytecodeGraphBuilder::VisitLdaUndefined() { | 706 void BytecodeGraphBuilder::VisitLdaUndefined() { |
| 707 Node* node = jsgraph()->UndefinedConstant(); | 707 Node* node = jsgraph()->UndefinedConstant(); |
| 708 environment()->BindAccumulator(node); | 708 environment()->BindAccumulator(node); |
| 709 } | 709 } |
| 710 | 710 |
| 711 void BytecodeGraphBuilder::VisitLdrUndefined() { | |
| 712 Node* node = jsgraph()->UndefinedConstant(); | |
| 713 environment()->BindRegister(bytecode_iterator().GetRegisterOperand(0), node); | |
| 714 } | |
| 715 | |
| 716 void BytecodeGraphBuilder::VisitLdaNull() { | 711 void BytecodeGraphBuilder::VisitLdaNull() { |
| 717 Node* node = jsgraph()->NullConstant(); | 712 Node* node = jsgraph()->NullConstant(); |
| 718 environment()->BindAccumulator(node); | 713 environment()->BindAccumulator(node); |
| 719 } | 714 } |
| 720 | 715 |
| 721 void BytecodeGraphBuilder::VisitLdaTheHole() { | 716 void BytecodeGraphBuilder::VisitLdaTheHole() { |
| 722 Node* node = jsgraph()->TheHoleConstant(); | 717 Node* node = jsgraph()->TheHoleConstant(); |
| 723 environment()->BindAccumulator(node); | 718 environment()->BindAccumulator(node); |
| 724 } | 719 } |
| 725 | 720 |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 760 return NewNode(op, GetFunctionClosure()); | 755 return NewNode(op, GetFunctionClosure()); |
| 761 } | 756 } |
| 762 | 757 |
| 763 void BytecodeGraphBuilder::VisitLdaGlobal() { | 758 void BytecodeGraphBuilder::VisitLdaGlobal() { |
| 764 PrepareEagerCheckpoint(); | 759 PrepareEagerCheckpoint(); |
| 765 Node* node = BuildLoadGlobal(bytecode_iterator().GetIndexOperand(0), | 760 Node* node = BuildLoadGlobal(bytecode_iterator().GetIndexOperand(0), |
| 766 TypeofMode::NOT_INSIDE_TYPEOF); | 761 TypeofMode::NOT_INSIDE_TYPEOF); |
| 767 environment()->BindAccumulator(node, Environment::kAttachFrameState); | 762 environment()->BindAccumulator(node, Environment::kAttachFrameState); |
| 768 } | 763 } |
| 769 | 764 |
| 770 void BytecodeGraphBuilder::VisitLdrGlobal() { | |
| 771 PrepareEagerCheckpoint(); | |
| 772 Node* node = BuildLoadGlobal(bytecode_iterator().GetIndexOperand(0), | |
| 773 TypeofMode::NOT_INSIDE_TYPEOF); | |
| 774 environment()->BindRegister(bytecode_iterator().GetRegisterOperand(1), node, | |
| 775 Environment::kAttachFrameState); | |
| 776 } | |
| 777 | |
| 778 void BytecodeGraphBuilder::VisitLdaGlobalInsideTypeof() { | 765 void BytecodeGraphBuilder::VisitLdaGlobalInsideTypeof() { |
| 779 PrepareEagerCheckpoint(); | 766 PrepareEagerCheckpoint(); |
| 780 Node* node = BuildLoadGlobal(bytecode_iterator().GetIndexOperand(0), | 767 Node* node = BuildLoadGlobal(bytecode_iterator().GetIndexOperand(0), |
| 781 TypeofMode::INSIDE_TYPEOF); | 768 TypeofMode::INSIDE_TYPEOF); |
| 782 environment()->BindAccumulator(node, Environment::kAttachFrameState); | 769 environment()->BindAccumulator(node, Environment::kAttachFrameState); |
| 783 } | 770 } |
| 784 | 771 |
| 785 void BytecodeGraphBuilder::BuildStoreGlobal(LanguageMode language_mode) { | 772 void BytecodeGraphBuilder::BuildStoreGlobal(LanguageMode language_mode) { |
| 786 PrepareEagerCheckpoint(); | 773 PrepareEagerCheckpoint(); |
| 787 Handle<Name> name = | 774 Handle<Name> name = |
| 788 Handle<Name>::cast(bytecode_iterator().GetConstantForIndexOperand(0)); | 775 Handle<Name>::cast(bytecode_iterator().GetConstantForIndexOperand(0)); |
| 789 VectorSlotPair feedback = | 776 VectorSlotPair feedback = |
| 790 CreateVectorSlotPair(bytecode_iterator().GetIndexOperand(1)); | 777 CreateVectorSlotPair(bytecode_iterator().GetIndexOperand(1)); |
| 791 Node* value = environment()->LookupAccumulator(); | 778 Node* value = environment()->LookupAccumulator(); |
| 792 | 779 |
| 793 const Operator* op = javascript()->StoreGlobal(language_mode, name, feedback); | 780 const Operator* op = javascript()->StoreGlobal(language_mode, name, feedback); |
| 794 Node* node = NewNode(op, value, GetFunctionClosure()); | 781 Node* node = NewNode(op, value, GetFunctionClosure()); |
| 795 environment()->RecordAfterState(node, Environment::kAttachFrameState); | 782 environment()->RecordAfterState(node, Environment::kAttachFrameState); |
| 796 } | 783 } |
| 797 | 784 |
| 798 void BytecodeGraphBuilder::VisitStaGlobalSloppy() { | 785 void BytecodeGraphBuilder::VisitStaGlobalSloppy() { |
| 799 BuildStoreGlobal(LanguageMode::SLOPPY); | 786 BuildStoreGlobal(LanguageMode::SLOPPY); |
| 800 } | 787 } |
| 801 | 788 |
| 802 void BytecodeGraphBuilder::VisitStaGlobalStrict() { | 789 void BytecodeGraphBuilder::VisitStaGlobalStrict() { |
| 803 BuildStoreGlobal(LanguageMode::STRICT); | 790 BuildStoreGlobal(LanguageMode::STRICT); |
| 804 } | 791 } |
| 805 | 792 |
| 806 Node* BytecodeGraphBuilder::BuildLoadContextSlot() { | 793 void BytecodeGraphBuilder::VisitLdaContextSlot() { |
| 807 // TODO(mythria): immutable flag is also set to false. This information is not | 794 // TODO(mythria): immutable flag is also set to false. This information is not |
| 808 // available in bytecode array. update this code when the implementation | 795 // available in bytecode array. update this code when the implementation |
| 809 // changes. | 796 // changes. |
| 810 const Operator* op = javascript()->LoadContext( | 797 const Operator* op = javascript()->LoadContext( |
| 811 bytecode_iterator().GetUnsignedImmediateOperand(2), | 798 bytecode_iterator().GetUnsignedImmediateOperand(2), |
| 812 bytecode_iterator().GetIndexOperand(1), false); | 799 bytecode_iterator().GetIndexOperand(1), false); |
| 813 Node* context = | 800 Node* context = |
| 814 environment()->LookupRegister(bytecode_iterator().GetRegisterOperand(0)); | 801 environment()->LookupRegister(bytecode_iterator().GetRegisterOperand(0)); |
| 815 return NewNode(op, context); | 802 Node* node = NewNode(op, context); |
| 803 environment()->BindAccumulator(node); |
| 816 } | 804 } |
| 817 | 805 |
| 818 Node* BytecodeGraphBuilder::BuildLoadCurrentContextSlot() { | 806 void BytecodeGraphBuilder::VisitLdaCurrentContextSlot() { |
| 819 // TODO(mythria): immutable flag is also set to false. This information is not | 807 // TODO(mythria): immutable flag is also set to false. This information is not |
| 820 // available in bytecode array. update this code when the implementation | 808 // available in bytecode array. update this code when the implementation |
| 821 // changes. | 809 // changes. |
| 822 const Operator* op = javascript()->LoadContext( | 810 const Operator* op = javascript()->LoadContext( |
| 823 0, bytecode_iterator().GetIndexOperand(0), false); | 811 0, bytecode_iterator().GetIndexOperand(0), false); |
| 824 Node* context = environment()->Context(); | 812 Node* context = environment()->Context(); |
| 825 return NewNode(op, context); | 813 Node* node = NewNode(op, context); |
| 826 } | |
| 827 | |
| 828 void BytecodeGraphBuilder::VisitLdaContextSlot() { | |
| 829 Node* node = BuildLoadContextSlot(); | |
| 830 environment()->BindAccumulator(node); | 814 environment()->BindAccumulator(node); |
| 831 } | 815 } |
| 832 | 816 |
| 833 void BytecodeGraphBuilder::VisitLdaCurrentContextSlot() { | |
| 834 Node* node = BuildLoadCurrentContextSlot(); | |
| 835 environment()->BindAccumulator(node); | |
| 836 } | |
| 837 | |
| 838 void BytecodeGraphBuilder::VisitLdrContextSlot() { | |
| 839 Node* node = BuildLoadContextSlot(); | |
| 840 environment()->BindRegister(bytecode_iterator().GetRegisterOperand(3), node); | |
| 841 } | |
| 842 | |
| 843 void BytecodeGraphBuilder::VisitLdrCurrentContextSlot() { | |
| 844 Node* node = BuildLoadCurrentContextSlot(); | |
| 845 environment()->BindRegister(bytecode_iterator().GetRegisterOperand(1), node); | |
| 846 } | |
| 847 | |
| 848 void BytecodeGraphBuilder::VisitStaContextSlot() { | 817 void BytecodeGraphBuilder::VisitStaContextSlot() { |
| 849 const Operator* op = javascript()->StoreContext( | 818 const Operator* op = javascript()->StoreContext( |
| 850 bytecode_iterator().GetUnsignedImmediateOperand(2), | 819 bytecode_iterator().GetUnsignedImmediateOperand(2), |
| 851 bytecode_iterator().GetIndexOperand(1)); | 820 bytecode_iterator().GetIndexOperand(1)); |
| 852 Node* context = | 821 Node* context = |
| 853 environment()->LookupRegister(bytecode_iterator().GetRegisterOperand(0)); | 822 environment()->LookupRegister(bytecode_iterator().GetRegisterOperand(0)); |
| 854 Node* value = environment()->LookupAccumulator(); | 823 Node* value = environment()->LookupAccumulator(); |
| 855 NewNode(op, context, value); | 824 NewNode(op, context, value); |
| 856 } | 825 } |
| 857 | 826 |
| (...skipping 1379 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2237 source_positions_->set_current_position(it->source_position()); | 2206 source_positions_->set_current_position(it->source_position()); |
| 2238 it->Advance(); | 2207 it->Advance(); |
| 2239 } else { | 2208 } else { |
| 2240 DCHECK_GT(it->code_offset(), offset); | 2209 DCHECK_GT(it->code_offset(), offset); |
| 2241 } | 2210 } |
| 2242 } | 2211 } |
| 2243 | 2212 |
| 2244 } // namespace compiler | 2213 } // namespace compiler |
| 2245 } // namespace internal | 2214 } // namespace internal |
| 2246 } // namespace v8 | 2215 } // namespace v8 |
| OLD | NEW |