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/execution.h" | 7 #include "src/execution.h" |
8 #include "src/handles.h" | 8 #include "src/handles.h" |
9 #include "src/interpreter/bytecode-array-builder.h" | 9 #include "src/interpreter/bytecode-array-builder.h" |
10 #include "src/interpreter/bytecode-array-iterator.h" | 10 #include "src/interpreter/bytecode-array-iterator.h" |
(...skipping 780 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
791 } | 791 } |
792 | 792 |
793 static void TestInterpreterCall(TailCallMode tail_call_mode) { | 793 static void TestInterpreterCall(TailCallMode tail_call_mode) { |
794 HandleAndZoneScope handles; | 794 HandleAndZoneScope handles; |
795 i::Isolate* isolate = handles.main_isolate(); | 795 i::Isolate* isolate = handles.main_isolate(); |
796 i::Factory* factory = isolate->factory(); | 796 i::Factory* factory = isolate->factory(); |
797 i::Zone zone(isolate->allocator()); | 797 i::Zone zone(isolate->allocator()); |
798 | 798 |
799 i::FeedbackVectorSpec feedback_spec(&zone); | 799 i::FeedbackVectorSpec feedback_spec(&zone); |
800 i::FeedbackVectorSlot slot = feedback_spec.AddLoadICSlot(); | 800 i::FeedbackVectorSlot slot = feedback_spec.AddLoadICSlot(); |
| 801 i::FeedbackVectorSlot call_slot = feedback_spec.AddCallICSlot(); |
801 | 802 |
802 Handle<i::TypeFeedbackVector> vector = | 803 Handle<i::TypeFeedbackVector> vector = |
803 i::NewTypeFeedbackVector(isolate, &feedback_spec); | 804 i::NewTypeFeedbackVector(isolate, &feedback_spec); |
804 int slot_index = vector->GetIndex(slot); | 805 int slot_index = vector->GetIndex(slot); |
| 806 int call_slot_index = -1; |
| 807 call_slot_index = vector->GetIndex(call_slot); |
805 | 808 |
806 Handle<i::String> name = factory->NewStringFromAsciiChecked("func"); | 809 Handle<i::String> name = factory->NewStringFromAsciiChecked("func"); |
807 name = factory->string_table()->LookupString(isolate, name); | 810 name = factory->string_table()->LookupString(isolate, name); |
808 | 811 |
809 // Check with no args. | 812 // Check with no args. |
810 { | 813 { |
811 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 1, | 814 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 1, |
812 0, 1); | 815 0, 1); |
813 | 816 |
814 builder.LoadNamedProperty(builder.Parameter(0), name, slot_index) | 817 builder.LoadNamedProperty(builder.Parameter(0), name, slot_index) |
815 .StoreAccumulatorInRegister(Register(0)) | 818 .StoreAccumulatorInRegister(Register(0)); |
816 .Call(Register(0), builder.Parameter(0), 1, 0, tail_call_mode) | 819 |
817 .Return(); | 820 builder.Call(Register(0), builder.Parameter(0), 1, call_slot_index, |
| 821 tail_call_mode); |
| 822 |
| 823 builder.Return(); |
818 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 824 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
819 | 825 |
820 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); | 826 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); |
821 auto callable = tester.GetCallable<Handle<Object>>(); | 827 auto callable = tester.GetCallable<Handle<Object>>(); |
822 | 828 |
823 Handle<Object> object = InterpreterTester::NewObject( | 829 Handle<Object> object = InterpreterTester::NewObject( |
824 "new (function Obj() { this.func = function() { return 0x265; }})()"); | 830 "new (function Obj() { this.func = function() { return 0x265; }})()"); |
825 Handle<Object> return_val = callable(object).ToHandleChecked(); | 831 Handle<Object> return_val = callable(object).ToHandleChecked(); |
826 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(0x265)); | 832 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(0x265)); |
827 } | 833 } |
828 | 834 |
829 // Check that receiver is passed properly. | 835 // Check that receiver is passed properly. |
830 { | 836 { |
831 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 1, | 837 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 1, |
832 0, 1); | 838 0, 1); |
833 | 839 |
834 builder.LoadNamedProperty(builder.Parameter(0), name, slot_index) | 840 builder.LoadNamedProperty(builder.Parameter(0), name, slot_index) |
835 .StoreAccumulatorInRegister(Register(0)) | 841 .StoreAccumulatorInRegister(Register(0)); |
836 .Call(Register(0), builder.Parameter(0), 1, 0, tail_call_mode) | 842 builder.Call(Register(0), builder.Parameter(0), 1, call_slot_index, |
837 .Return(); | 843 tail_call_mode); |
| 844 builder.Return(); |
838 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 845 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
839 | 846 |
840 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); | 847 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); |
841 auto callable = tester.GetCallable<Handle<Object>>(); | 848 auto callable = tester.GetCallable<Handle<Object>>(); |
842 | 849 |
843 Handle<Object> object = InterpreterTester::NewObject( | 850 Handle<Object> object = InterpreterTester::NewObject( |
844 "new (function Obj() {" | 851 "new (function Obj() {" |
845 " this.val = 1234;" | 852 " this.val = 1234;" |
846 " this.func = function() { return this.val; };" | 853 " this.func = function() { return this.val; };" |
847 "})()"); | 854 "})()"); |
848 Handle<Object> return_val = callable(object).ToHandleChecked(); | 855 Handle<Object> return_val = callable(object).ToHandleChecked(); |
849 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(1234)); | 856 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(1234)); |
850 } | 857 } |
851 | 858 |
852 // Check with two parameters (+ receiver). | 859 // Check with two parameters (+ receiver). |
853 { | 860 { |
854 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 1, | 861 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 1, |
855 0, 4); | 862 0, 4); |
856 | 863 |
857 builder.LoadNamedProperty(builder.Parameter(0), name, slot_index) | 864 builder.LoadNamedProperty(builder.Parameter(0), name, slot_index) |
858 .StoreAccumulatorInRegister(Register(0)) | 865 .StoreAccumulatorInRegister(Register(0)) |
859 .LoadAccumulatorWithRegister(builder.Parameter(0)) | 866 .LoadAccumulatorWithRegister(builder.Parameter(0)) |
860 .StoreAccumulatorInRegister(Register(1)) | 867 .StoreAccumulatorInRegister(Register(1)) |
861 .LoadLiteral(Smi::FromInt(51)) | 868 .LoadLiteral(Smi::FromInt(51)) |
862 .StoreAccumulatorInRegister(Register(2)) | 869 .StoreAccumulatorInRegister(Register(2)) |
863 .LoadLiteral(Smi::FromInt(11)) | 870 .LoadLiteral(Smi::FromInt(11)) |
864 .StoreAccumulatorInRegister(Register(3)) | 871 .StoreAccumulatorInRegister(Register(3)); |
865 .Call(Register(0), Register(1), 3, 0, tail_call_mode) | 872 |
866 .Return(); | 873 builder.Call(Register(0), Register(1), 3, call_slot_index, tail_call_mode); |
| 874 |
| 875 builder.Return(); |
| 876 |
867 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 877 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
868 | 878 |
869 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); | 879 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); |
870 auto callable = tester.GetCallable<Handle<Object>>(); | 880 auto callable = tester.GetCallable<Handle<Object>>(); |
871 | 881 |
872 Handle<Object> object = InterpreterTester::NewObject( | 882 Handle<Object> object = InterpreterTester::NewObject( |
873 "new (function Obj() { " | 883 "new (function Obj() { " |
874 " this.func = function(a, b) { return a - b; }" | 884 " this.func = function(a, b) { return a - b; }" |
875 "})()"); | 885 "})()"); |
876 Handle<Object> return_val = callable(object).ToHandleChecked(); | 886 Handle<Object> return_val = callable(object).ToHandleChecked(); |
(...skipping 21 matching lines...) Expand all Loading... |
898 .StoreAccumulatorInRegister(Register(6)) | 908 .StoreAccumulatorInRegister(Register(6)) |
899 .LoadLiteral(factory->NewStringFromAsciiChecked("f")) | 909 .LoadLiteral(factory->NewStringFromAsciiChecked("f")) |
900 .StoreAccumulatorInRegister(Register(7)) | 910 .StoreAccumulatorInRegister(Register(7)) |
901 .LoadLiteral(factory->NewStringFromAsciiChecked("g")) | 911 .LoadLiteral(factory->NewStringFromAsciiChecked("g")) |
902 .StoreAccumulatorInRegister(Register(8)) | 912 .StoreAccumulatorInRegister(Register(8)) |
903 .LoadLiteral(factory->NewStringFromAsciiChecked("h")) | 913 .LoadLiteral(factory->NewStringFromAsciiChecked("h")) |
904 .StoreAccumulatorInRegister(Register(9)) | 914 .StoreAccumulatorInRegister(Register(9)) |
905 .LoadLiteral(factory->NewStringFromAsciiChecked("i")) | 915 .LoadLiteral(factory->NewStringFromAsciiChecked("i")) |
906 .StoreAccumulatorInRegister(Register(10)) | 916 .StoreAccumulatorInRegister(Register(10)) |
907 .LoadLiteral(factory->NewStringFromAsciiChecked("j")) | 917 .LoadLiteral(factory->NewStringFromAsciiChecked("j")) |
908 .StoreAccumulatorInRegister(Register(11)) | 918 .StoreAccumulatorInRegister(Register(11)); |
909 .Call(Register(0), Register(1), 11, 0, tail_call_mode) | 919 |
910 .Return(); | 920 builder.Call(Register(0), Register(1), 11, call_slot_index, tail_call_mode); |
| 921 |
| 922 builder.Return(); |
| 923 |
911 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 924 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
912 | 925 |
913 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); | 926 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); |
914 auto callable = tester.GetCallable<Handle<Object>>(); | 927 auto callable = tester.GetCallable<Handle<Object>>(); |
915 | 928 |
916 Handle<Object> object = InterpreterTester::NewObject( | 929 Handle<Object> object = InterpreterTester::NewObject( |
917 "new (function Obj() { " | 930 "new (function Obj() { " |
918 " this.prefix = \"prefix_\";" | 931 " this.prefix = \"prefix_\";" |
919 " this.func = function(a, b, c, d, e, f, g, h, i, j) {" | 932 " this.func = function(a, b, c, d, e, f, g, h, i, j) {" |
920 " return this.prefix + a + b + c + d + e + f + g + h + i + j;" | 933 " return this.prefix + a + b + c + d + e + f + g + h + i + j;" |
(...skipping 3273 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4194 Handle<i::Object> return_value = callable().ToHandleChecked(); | 4207 Handle<i::Object> return_value = callable().ToHandleChecked(); |
4195 CHECK(return_value->SameValue(*tests[i].second)); | 4208 CHECK(return_value->SameValue(*tests[i].second)); |
4196 } | 4209 } |
4197 | 4210 |
4198 FLAG_ignition_generators = old_flag; | 4211 FLAG_ignition_generators = old_flag; |
4199 } | 4212 } |
4200 | 4213 |
4201 } // namespace interpreter | 4214 } // namespace interpreter |
4202 } // namespace internal | 4215 } // namespace internal |
4203 } // namespace v8 | 4216 } // namespace v8 |
OLD | NEW |