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/interpreter/bytecode-array-builder.h" | 5 #include "src/interpreter/bytecode-array-builder.h" |
6 | 6 |
7 namespace v8 { | 7 namespace v8 { |
8 namespace internal { | 8 namespace internal { |
9 namespace interpreter { | 9 namespace interpreter { |
10 | 10 |
(...skipping 619 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
630 case Bytecode::kTestInstanceOf: | 630 case Bytecode::kTestInstanceOf: |
631 case Bytecode::kTestIn: | 631 case Bytecode::kTestIn: |
632 case Bytecode::kForInDone: | 632 case Bytecode::kForInDone: |
633 return false; | 633 return false; |
634 default: | 634 default: |
635 return true; | 635 return true; |
636 } | 636 } |
637 } | 637 } |
638 | 638 |
639 | 639 |
640 BytecodeArrayBuilder& BytecodeArrayBuilder::CastAccumulatorToJSObject() { | |
641 Output(Bytecode::kToObject); | |
642 return *this; | |
643 } | |
644 | |
645 | |
646 BytecodeArrayBuilder& BytecodeArrayBuilder::CastAccumulatorToName() { | 640 BytecodeArrayBuilder& BytecodeArrayBuilder::CastAccumulatorToName() { |
647 if (LastBytecodeInSameBlock()) { | 641 if (LastBytecodeInSameBlock()) { |
648 PreviousBytecodeHelper previous_bytecode(*this); | 642 PreviousBytecodeHelper previous_bytecode(*this); |
649 switch (previous_bytecode.GetBytecode()) { | 643 switch (previous_bytecode.GetBytecode()) { |
650 case Bytecode::kToName: | 644 case Bytecode::kToName: |
651 case Bytecode::kTypeOf: | 645 case Bytecode::kTypeOf: |
652 return *this; | 646 return *this; |
653 case Bytecode::kLdaConstantWide: | 647 case Bytecode::kLdaConstantWide: |
654 case Bytecode::kLdaConstant: { | 648 case Bytecode::kLdaConstant: { |
655 Handle<Object> object = previous_bytecode.GetConstantForIndexOperand(0); | 649 Handle<Object> object = previous_bytecode.GetConstantForIndexOperand(0); |
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
849 } | 843 } |
850 | 844 |
851 | 845 |
852 BytecodeArrayBuilder& BytecodeArrayBuilder::Return() { | 846 BytecodeArrayBuilder& BytecodeArrayBuilder::Return() { |
853 Output(Bytecode::kReturn); | 847 Output(Bytecode::kReturn); |
854 exit_seen_in_block_ = true; | 848 exit_seen_in_block_ = true; |
855 return *this; | 849 return *this; |
856 } | 850 } |
857 | 851 |
858 | 852 |
859 BytecodeArrayBuilder& BytecodeArrayBuilder::ForInPrepare(Register receiver) { | 853 BytecodeArrayBuilder& BytecodeArrayBuilder::ForInPrepare( |
860 Output(Bytecode::kForInPrepare, receiver.ToOperand()); | 854 Register receiver, Register cache_type, Register cache_array, |
| 855 Register cache_length) { |
| 856 Output(Bytecode::kForInPrepare, receiver.ToOperand(), cache_type.ToOperand(), |
| 857 cache_array.ToOperand(), cache_length.ToOperand()); |
861 return *this; | 858 return *this; |
862 } | 859 } |
863 | 860 |
864 | 861 |
865 BytecodeArrayBuilder& BytecodeArrayBuilder::ForInNext(Register for_in_state, | 862 BytecodeArrayBuilder& BytecodeArrayBuilder::ForInNext(Register receiver, |
| 863 Register cache_type, |
| 864 Register cache_array, |
866 Register index) { | 865 Register index) { |
867 Output(Bytecode::kForInNext, for_in_state.ToOperand(), index.ToOperand()); | 866 Output(Bytecode::kForInNext, receiver.ToOperand(), cache_type.ToOperand(), |
| 867 cache_array.ToOperand(), index.ToOperand()); |
868 return *this; | 868 return *this; |
869 } | 869 } |
870 | 870 |
871 | 871 |
872 BytecodeArrayBuilder& BytecodeArrayBuilder::ForInDone(Register for_in_state) { | 872 BytecodeArrayBuilder& BytecodeArrayBuilder::ForInDone(Register index, |
873 Output(Bytecode::kForInDone, for_in_state.ToOperand()); | 873 Register cache_length) { |
| 874 Output(Bytecode::kForInDone, index.ToOperand(), cache_length.ToOperand()); |
| 875 |
874 return *this; | 876 return *this; |
875 } | 877 } |
876 | 878 |
| 879 |
| 880 BytecodeArrayBuilder& BytecodeArrayBuilder::ForInStep(Register index) { |
| 881 Output(Bytecode::kForInStep, index.ToOperand()); |
| 882 return *this; |
| 883 } |
| 884 |
877 | 885 |
878 void BytecodeArrayBuilder::LeaveBasicBlock() { | 886 void BytecodeArrayBuilder::LeaveBasicBlock() { |
879 last_block_end_ = bytecodes()->size(); | 887 last_block_end_ = bytecodes()->size(); |
880 exit_seen_in_block_ = false; | 888 exit_seen_in_block_ = false; |
881 } | 889 } |
882 | 890 |
883 | 891 |
884 void BytecodeArrayBuilder::EnsureReturn() { | 892 void BytecodeArrayBuilder::EnsureReturn() { |
885 if (!exit_seen_in_block_) { | 893 if (!exit_seen_in_block_) { |
886 LoadUndefined(); | 894 LoadUndefined(); |
(...skipping 541 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1428 DCHECK_GT(next_consecutive_count_, 0); | 1436 DCHECK_GT(next_consecutive_count_, 0); |
1429 builder_->BorrowConsecutiveTemporaryRegister(next_consecutive_register_); | 1437 builder_->BorrowConsecutiveTemporaryRegister(next_consecutive_register_); |
1430 allocated_.push_back(next_consecutive_register_); | 1438 allocated_.push_back(next_consecutive_register_); |
1431 next_consecutive_count_--; | 1439 next_consecutive_count_--; |
1432 return Register(next_consecutive_register_++); | 1440 return Register(next_consecutive_register_++); |
1433 } | 1441 } |
1434 | 1442 |
1435 } // namespace interpreter | 1443 } // namespace interpreter |
1436 } // namespace internal | 1444 } // namespace internal |
1437 } // namespace v8 | 1445 } // namespace v8 |
OLD | NEW |