Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(37)

Side by Side Diff: test/cctest/interpreter/test-interpreter.cc

Issue 1688283003: [Interpreter] Implements calls through CallICStub in the interpreter. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: mips port contributed by balazs.kilvady. Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698