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/interpreter.h" | 10 #include "src/interpreter/interpreter.h" |
(...skipping 918 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
929 } | 929 } |
930 | 930 |
931 static void TestInterpreterCall(TailCallMode tail_call_mode) { | 931 static void TestInterpreterCall(TailCallMode tail_call_mode) { |
932 HandleAndZoneScope handles; | 932 HandleAndZoneScope handles; |
933 i::Isolate* isolate = handles.main_isolate(); | 933 i::Isolate* isolate = handles.main_isolate(); |
934 i::Factory* factory = isolate->factory(); | 934 i::Factory* factory = isolate->factory(); |
935 i::Zone zone; | 935 i::Zone zone; |
936 | 936 |
937 i::FeedbackVectorSpec feedback_spec(&zone); | 937 i::FeedbackVectorSpec feedback_spec(&zone); |
938 i::FeedbackVectorSlot slot = feedback_spec.AddLoadICSlot(); | 938 i::FeedbackVectorSlot slot = feedback_spec.AddLoadICSlot(); |
939 i::FeedbackVectorSlot call_slot = feedback_spec.AddCallICSlot(); | |
939 | 940 |
940 Handle<i::TypeFeedbackVector> vector = | 941 Handle<i::TypeFeedbackVector> vector = |
941 i::NewTypeFeedbackVector(isolate, &feedback_spec); | 942 i::NewTypeFeedbackVector(isolate, &feedback_spec); |
942 int slot_index = vector->GetIndex(slot); | 943 int slot_index = vector->GetIndex(slot); |
944 int call_slot_index = vector->GetIndex(call_slot); | |
943 | 945 |
944 Handle<i::String> name = factory->NewStringFromAsciiChecked("func"); | 946 Handle<i::String> name = factory->NewStringFromAsciiChecked("func"); |
945 name = factory->string_table()->LookupString(isolate, name); | 947 name = factory->string_table()->LookupString(isolate, name); |
946 | 948 |
947 // Check with no args. | 949 // Check with no args. |
948 { | 950 { |
949 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 1, | 951 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 1, |
950 0, 1); | 952 0, 1); |
951 builder.LoadNamedProperty(builder.Parameter(0), name, slot_index) | 953 builder.LoadNamedProperty(builder.Parameter(0), name, slot_index) |
952 .StoreAccumulatorInRegister(Register(0)) | 954 .StoreAccumulatorInRegister(Register(0)) |
953 .Call(Register(0), builder.Parameter(0), 1, 0, tail_call_mode) | 955 .Call(Register(0), builder.Parameter(0), 1, tail_call_mode) |
956 .CallIC(Register(0), builder.Parameter(0), 1, call_slot_index, | |
957 tail_call_mode) | |
rmcilroy
2016/02/22 12:53:23
You are doing Call and CallIC, but only checking t
mythria
2016/02/22 14:51:32
I am sorry, I thought I will revisit this when reb
| |
954 .Return(); | 958 .Return(); |
955 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 959 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
956 | 960 |
957 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); | 961 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); |
958 auto callable = tester.GetCallable<Handle<Object>>(); | 962 auto callable = tester.GetCallable<Handle<Object>>(); |
959 | 963 |
960 Handle<Object> object = InterpreterTester::NewObject( | 964 Handle<Object> object = InterpreterTester::NewObject( |
961 "new (function Obj() { this.func = function() { return 0x265; }})()"); | 965 "new (function Obj() { this.func = function() { return 0x265; }})()"); |
962 Handle<Object> return_val = callable(object).ToHandleChecked(); | 966 Handle<Object> return_val = callable(object).ToHandleChecked(); |
963 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(0x265)); | 967 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(0x265)); |
964 } | 968 } |
965 | 969 |
966 // Check that receiver is passed properly. | 970 // Check that receiver is passed properly. |
967 { | 971 { |
968 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 1, | 972 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 1, |
969 0, 1); | 973 0, 1); |
970 builder.LoadNamedProperty(builder.Parameter(0), name, slot_index) | 974 builder.LoadNamedProperty(builder.Parameter(0), name, slot_index) |
971 .StoreAccumulatorInRegister(Register(0)) | 975 .StoreAccumulatorInRegister(Register(0)) |
972 .Call(Register(0), builder.Parameter(0), 1, 0, tail_call_mode) | 976 .Call(Register(0), builder.Parameter(0), 1, tail_call_mode) |
977 .CallIC(Register(0), builder.Parameter(0), 1, call_slot_index, | |
978 tail_call_mode) | |
973 .Return(); | 979 .Return(); |
974 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 980 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
975 | 981 |
976 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); | 982 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); |
977 auto callable = tester.GetCallable<Handle<Object>>(); | 983 auto callable = tester.GetCallable<Handle<Object>>(); |
978 | 984 |
979 Handle<Object> object = InterpreterTester::NewObject( | 985 Handle<Object> object = InterpreterTester::NewObject( |
980 "new (function Obj() {" | 986 "new (function Obj() {" |
981 " this.val = 1234;" | 987 " this.val = 1234;" |
982 " this.func = function() { return this.val; };" | 988 " this.func = function() { return this.val; };" |
983 "})()"); | 989 "})()"); |
984 Handle<Object> return_val = callable(object).ToHandleChecked(); | 990 Handle<Object> return_val = callable(object).ToHandleChecked(); |
985 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(1234)); | 991 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(1234)); |
986 } | 992 } |
987 | 993 |
988 // Check with two parameters (+ receiver). | 994 // Check with two parameters (+ receiver). |
989 { | 995 { |
990 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 1, | 996 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 1, |
991 0, 4); | 997 0, 4); |
992 builder.LoadNamedProperty(builder.Parameter(0), name, slot_index) | 998 builder.LoadNamedProperty(builder.Parameter(0), name, slot_index) |
993 .StoreAccumulatorInRegister(Register(0)) | 999 .StoreAccumulatorInRegister(Register(0)) |
994 .LoadAccumulatorWithRegister(builder.Parameter(0)) | 1000 .LoadAccumulatorWithRegister(builder.Parameter(0)) |
995 .StoreAccumulatorInRegister(Register(1)) | 1001 .StoreAccumulatorInRegister(Register(1)) |
996 .LoadLiteral(Smi::FromInt(51)) | 1002 .LoadLiteral(Smi::FromInt(51)) |
997 .StoreAccumulatorInRegister(Register(2)) | 1003 .StoreAccumulatorInRegister(Register(2)) |
998 .LoadLiteral(Smi::FromInt(11)) | 1004 .LoadLiteral(Smi::FromInt(11)) |
999 .StoreAccumulatorInRegister(Register(3)) | 1005 .StoreAccumulatorInRegister(Register(3)) |
1000 .Call(Register(0), Register(1), 3, 0, tail_call_mode) | 1006 .Call(Register(0), Register(1), 3, tail_call_mode) |
1007 .CallIC(Register(0), Register(1), 3, call_slot_index, tail_call_mode) | |
1001 .Return(); | 1008 .Return(); |
1002 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 1009 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
1003 | 1010 |
1004 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); | 1011 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); |
1005 auto callable = tester.GetCallable<Handle<Object>>(); | 1012 auto callable = tester.GetCallable<Handle<Object>>(); |
1006 | 1013 |
1007 Handle<Object> object = InterpreterTester::NewObject( | 1014 Handle<Object> object = InterpreterTester::NewObject( |
1008 "new (function Obj() { " | 1015 "new (function Obj() { " |
1009 " this.func = function(a, b) { return a - b; }" | 1016 " this.func = function(a, b) { return a - b; }" |
1010 "})()"); | 1017 "})()"); |
(...skipping 22 matching lines...) Expand all Loading... | |
1033 .LoadLiteral(factory->NewStringFromAsciiChecked("f")) | 1040 .LoadLiteral(factory->NewStringFromAsciiChecked("f")) |
1034 .StoreAccumulatorInRegister(Register(7)) | 1041 .StoreAccumulatorInRegister(Register(7)) |
1035 .LoadLiteral(factory->NewStringFromAsciiChecked("g")) | 1042 .LoadLiteral(factory->NewStringFromAsciiChecked("g")) |
1036 .StoreAccumulatorInRegister(Register(8)) | 1043 .StoreAccumulatorInRegister(Register(8)) |
1037 .LoadLiteral(factory->NewStringFromAsciiChecked("h")) | 1044 .LoadLiteral(factory->NewStringFromAsciiChecked("h")) |
1038 .StoreAccumulatorInRegister(Register(9)) | 1045 .StoreAccumulatorInRegister(Register(9)) |
1039 .LoadLiteral(factory->NewStringFromAsciiChecked("i")) | 1046 .LoadLiteral(factory->NewStringFromAsciiChecked("i")) |
1040 .StoreAccumulatorInRegister(Register(10)) | 1047 .StoreAccumulatorInRegister(Register(10)) |
1041 .LoadLiteral(factory->NewStringFromAsciiChecked("j")) | 1048 .LoadLiteral(factory->NewStringFromAsciiChecked("j")) |
1042 .StoreAccumulatorInRegister(Register(11)) | 1049 .StoreAccumulatorInRegister(Register(11)) |
1043 .Call(Register(0), Register(1), 11, 0, tail_call_mode) | 1050 .Call(Register(0), Register(1), 11, tail_call_mode) |
1051 .CallIC(Register(0), Register(1), 11, call_slot_index, tail_call_mode) | |
1044 .Return(); | 1052 .Return(); |
1045 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 1053 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
1046 | 1054 |
1047 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); | 1055 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); |
1048 auto callable = tester.GetCallable<Handle<Object>>(); | 1056 auto callable = tester.GetCallable<Handle<Object>>(); |
1049 | 1057 |
1050 Handle<Object> object = InterpreterTester::NewObject( | 1058 Handle<Object> object = InterpreterTester::NewObject( |
1051 "new (function Obj() { " | 1059 "new (function Obj() { " |
1052 " this.prefix = \"prefix_\";" | 1060 " this.prefix = \"prefix_\";" |
1053 " this.func = function(a, b, c, d, e, f, g, h, i, j) {" | 1061 " this.func = function(a, b, c, d, e, f, g, h, i, j) {" |
(...skipping 3104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
4158 Handle<i::Object> return_value = callable().ToHandleChecked(); | 4166 Handle<i::Object> return_value = callable().ToHandleChecked(); |
4159 CHECK(return_value->SameValue(*const_decl[i].second)); | 4167 CHECK(return_value->SameValue(*const_decl[i].second)); |
4160 } | 4168 } |
4161 | 4169 |
4162 FLAG_legacy_const = old_flag_legacy_const; | 4170 FLAG_legacy_const = old_flag_legacy_const; |
4163 } | 4171 } |
4164 | 4172 |
4165 } // namespace interpreter | 4173 } // namespace interpreter |
4166 } // namespace internal | 4174 } // namespace internal |
4167 } // namespace v8 | 4175 } // namespace v8 |
OLD | NEW |