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/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #include "src/compiler.h" | 7 #include "src/compiler.h" |
8 #include "src/interpreter/bytecode-array-iterator.h" | 8 #include "src/interpreter/bytecode-array-iterator.h" |
9 #include "src/interpreter/bytecode-generator.h" | 9 #include "src/interpreter/bytecode-generator.h" |
10 #include "src/interpreter/interpreter.h" | 10 #include "src/interpreter/interpreter.h" |
11 #include "test/cctest/cctest.h" | 11 #include "test/cctest/cctest.h" |
12 | 12 |
13 namespace v8 { | 13 namespace v8 { |
14 namespace internal { | 14 namespace internal { |
15 namespace interpreter { | 15 namespace interpreter { |
16 | 16 |
17 class BytecodeGeneratorHelper { | 17 class BytecodeGeneratorHelper { |
18 public: | 18 public: |
19 const char* kFunctionName = "f"; | 19 const char* kFunctionName = "f"; |
20 | 20 |
21 const int kLastParamIndex = | 21 const int kLastParamIndex = |
22 -InterpreterFrameConstants::kLastParamFromRegisterPointer / kPointerSize; | 22 -InterpreterFrameConstants::kLastParamFromRegisterPointer / kPointerSize; |
23 | 23 |
24 BytecodeGeneratorHelper() { | 24 BytecodeGeneratorHelper() { |
25 i::FLAG_vector_stores = true; | 25 i::FLAG_vector_stores = true; |
26 i::FLAG_ignition = true; | 26 i::FLAG_ignition = true; |
27 i::FLAG_ignition_filter = StrDup(kFunctionName); | 27 i::FLAG_ignition_filter = StrDup(kFunctionName); |
28 i::FLAG_always_opt = false; | 28 i::FLAG_always_opt = false; |
| 29 i::FLAG_allow_natives_syntax = true; |
29 CcTest::i_isolate()->interpreter()->Initialize(); | 30 CcTest::i_isolate()->interpreter()->Initialize(); |
30 } | 31 } |
31 | 32 |
32 | 33 |
33 Factory* factory() { return CcTest::i_isolate()->factory(); } | 34 Factory* factory() { return CcTest::i_isolate()->factory(); } |
34 | 35 |
35 | 36 |
36 Handle<BytecodeArray> MakeBytecode(const char* script, | 37 Handle<BytecodeArray> MakeBytecode(const char* script, |
37 const char* function_name) { | 38 const char* function_name) { |
38 CompileRun(script); | 39 CompileRun(script); |
(...skipping 612 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
651 helper.MakeBytecode(snippets[i].code_snippet, "f"); | 652 helper.MakeBytecode(snippets[i].code_snippet, "f"); |
652 CheckBytecodeArrayEqual(snippets[i], bytecode_array); | 653 CheckBytecodeArrayEqual(snippets[i], bytecode_array); |
653 } | 654 } |
654 } | 655 } |
655 | 656 |
656 | 657 |
657 TEST(LoadGlobal) { | 658 TEST(LoadGlobal) { |
658 InitializedHandleScope handle_scope; | 659 InitializedHandleScope handle_scope; |
659 BytecodeGeneratorHelper helper; | 660 BytecodeGeneratorHelper helper; |
660 | 661 |
661 ExpectedSnippet<const char*> snippets[] = { | 662 ExpectedSnippet<int> snippets[] = { |
662 {"var a = 1;\nfunction f() { return a; }\nf()", | 663 { |
663 0, 1, 3, | 664 "var a = 1;\nfunction f() { return a; }\nf()", |
664 { | 665 0, |
665 B(LdaGlobal), _, | 666 1, |
666 B(Return) | 667 3, |
667 }, | 668 { |
| 669 B(LdaGlobal), _, // |
| 670 B(Return) // |
| 671 }, |
668 }, | 672 }, |
669 {"function t() { }\nfunction f() { return t; }\nf()", | 673 { |
670 0, 1, 3, | 674 "function t() { }\nfunction f() { return t; }\nf()", |
671 { | 675 0, |
672 B(LdaGlobal), _, | 676 1, |
673 B(Return) | 677 3, |
674 }, | 678 { |
| 679 B(LdaGlobal), _, // |
| 680 B(Return) // |
| 681 }, |
675 }, | 682 }, |
676 }; | 683 }; |
677 | 684 |
678 for (size_t i = 0; i < arraysize(snippets); i++) { | 685 for (size_t i = 0; i < arraysize(snippets); i++) { |
679 Handle<BytecodeArray> bytecode_array = | 686 Handle<BytecodeArray> bytecode_array = |
680 helper.MakeBytecode(snippets[i].code_snippet, "f"); | 687 helper.MakeBytecode(snippets[i].code_snippet, "f"); |
681 bytecode_array->Print(); | 688 bytecode_array->Print(); |
682 CheckBytecodeArrayEqual(snippets[i], bytecode_array, true); | 689 CheckBytecodeArrayEqual(snippets[i], bytecode_array, true); |
683 } | 690 } |
684 } | 691 } |
685 | 692 |
686 | 693 |
687 TEST(CallGlobal) { | 694 TEST(CallGlobal) { |
688 InitializedHandleScope handle_scope; | 695 InitializedHandleScope handle_scope; |
689 BytecodeGeneratorHelper helper; | 696 BytecodeGeneratorHelper helper; |
690 | 697 |
691 ExpectedSnippet<const char*> snippets[] = { | 698 ExpectedSnippet<int> snippets[] = { |
692 {"function t() { }\nfunction f() { return t(); }\nf()", | 699 { |
693 2 * kPointerSize, 1, 12, | 700 "function t() { }\nfunction f() { return t(); }\nf()", |
694 { | 701 2 * kPointerSize, |
695 B(LdaUndefined), | 702 1, |
696 B(Star), R(1), | 703 12, |
697 B(LdaGlobal), _, | 704 { |
698 B(Star), R(0), | 705 B(LdaUndefined), // |
699 B(Call), R(0), R(1), U8(0), | 706 B(Star), R(1), // |
700 B(Return) | 707 B(LdaGlobal), _, // |
701 }, | 708 B(Star), R(0), // |
| 709 B(Call), R(0), R(1), U8(0), // |
| 710 B(Return) // |
| 711 }, |
702 }, | 712 }, |
703 {"function t(a, b, c) { }\nfunction f() { return t(1, 2, 3); }\nf()", | 713 { |
704 5 * kPointerSize, 1, 24, | 714 "function t(a, b, c) { }\nfunction f() { return t(1, 2, 3); }\nf()", |
705 { | 715 5 * kPointerSize, |
706 B(LdaUndefined), | 716 1, |
707 B(Star), R(1), | 717 24, |
708 B(LdaGlobal), _, | 718 { |
709 B(Star), R(0), | 719 B(LdaUndefined), // |
710 B(LdaSmi8), U8(1), | 720 B(Star), R(1), // |
711 B(Star), R(2), | 721 B(LdaGlobal), _, // |
712 B(LdaSmi8), U8(2), | 722 B(Star), R(0), // |
713 B(Star), R(3), | 723 B(LdaSmi8), U8(1), // |
714 B(LdaSmi8), U8(3), | 724 B(Star), R(2), // |
715 B(Star), R(4), | 725 B(LdaSmi8), U8(2), // |
716 B(Call), R(0), R(1), U8(3), | 726 B(Star), R(3), // |
717 B(Return) | 727 B(LdaSmi8), U8(3), // |
718 }, | 728 B(Star), R(4), // |
| 729 B(Call), R(0), R(1), U8(3), // |
| 730 B(Return) // |
| 731 }, |
719 }, | 732 }, |
720 }; | 733 }; |
721 | 734 |
| 735 size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]); |
| 736 for (size_t i = 0; i < num_snippets; i++) { |
| 737 Handle<BytecodeArray> bytecode_array = |
| 738 helper.MakeBytecode(snippets[i].code_snippet, "f"); |
| 739 CheckBytecodeArrayEqual(snippets[i], bytecode_array, true); |
| 740 } |
| 741 } |
| 742 |
| 743 |
| 744 TEST(CallRuntime) { |
| 745 InitializedHandleScope handle_scope; |
| 746 BytecodeGeneratorHelper helper; |
| 747 |
| 748 ExpectedSnippet<int> snippets[] = { |
| 749 { |
| 750 "function f() { %TheHole() }\nf()", |
| 751 1 * kPointerSize, |
| 752 1, |
| 753 6, |
| 754 { |
| 755 B(CallRuntime), U8(Runtime::kTheHole), R(0), U8(0), // |
| 756 B(LdaUndefined), // |
| 757 B(Return) // |
| 758 }, |
| 759 }, |
| 760 { |
| 761 "function f(a) { return %IsArray(a) }\nf(undefined)", |
| 762 1 * kPointerSize, |
| 763 2, |
| 764 9, |
| 765 { |
| 766 B(Ldar), R(helper.kLastParamIndex), // |
| 767 B(Star), R(0), // |
| 768 B(CallRuntime), U8(Runtime::kIsArray), R(0), U8(1), // |
| 769 B(Return) // |
| 770 }, |
| 771 }, |
| 772 { |
| 773 "function f() { return %Add(1, 2) }\nf()", |
| 774 2 * kPointerSize, |
| 775 1, |
| 776 13, |
| 777 { |
| 778 B(LdaSmi8), U8(1), // |
| 779 B(Star), R(0), // |
| 780 B(LdaSmi8), U8(2), // |
| 781 B(Star), R(1), // |
| 782 B(CallRuntime), U8(Runtime::kAdd), R(0), U8(2), // |
| 783 B(Return) // |
| 784 }, |
| 785 }, |
| 786 }; |
| 787 |
722 for (size_t i = 0; i < arraysize(snippets); i++) { | 788 for (size_t i = 0; i < arraysize(snippets); i++) { |
723 Handle<BytecodeArray> bytecode_array = | 789 Handle<BytecodeArray> bytecode_array = |
724 helper.MakeBytecode(snippets[i].code_snippet, "f"); | 790 helper.MakeBytecode(snippets[i].code_snippet, "f"); |
725 CheckBytecodeArrayEqual(snippets[i], bytecode_array, true); | 791 CheckBytecodeArrayEqual(snippets[i], bytecode_array, true); |
726 } | 792 } |
727 } | 793 } |
728 | 794 |
729 | 795 |
730 TEST(IfConditions) { | 796 TEST(IfConditions) { |
731 InitializedHandleScope handle_scope; | 797 InitializedHandleScope handle_scope; |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
871 Handle<BytecodeArray> bytecode_array = | 937 Handle<BytecodeArray> bytecode_array = |
872 helper.MakeBytecodeForFunction(snippets[i].code_snippet); | 938 helper.MakeBytecodeForFunction(snippets[i].code_snippet); |
873 CheckBytecodeArrayEqual(snippets[i], bytecode_array); | 939 CheckBytecodeArrayEqual(snippets[i], bytecode_array); |
874 } | 940 } |
875 } | 941 } |
876 | 942 |
877 | 943 |
878 } // namespace interpreter | 944 } // namespace interpreter |
879 } // namespace internal | 945 } // namespace internal |
880 } // namespance v8 | 946 } // namespance v8 |
OLD | NEW |