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

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: 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 921 matching lines...) Expand 10 before | Expand all | Expand 10 after
932 932
933 933
934 TEST(InterpreterCall) { 934 TEST(InterpreterCall) {
935 HandleAndZoneScope handles; 935 HandleAndZoneScope handles;
936 i::Isolate* isolate = handles.main_isolate(); 936 i::Isolate* isolate = handles.main_isolate();
937 i::Factory* factory = isolate->factory(); 937 i::Factory* factory = isolate->factory();
938 i::Zone zone; 938 i::Zone zone;
939 939
940 i::FeedbackVectorSpec feedback_spec(&zone); 940 i::FeedbackVectorSpec feedback_spec(&zone);
941 i::FeedbackVectorSlot slot = feedback_spec.AddLoadICSlot(); 941 i::FeedbackVectorSlot slot = feedback_spec.AddLoadICSlot();
942 i::FeedbackVectorSlot call_slot = feedback_spec.AddCallICSlot();
942 943
943 Handle<i::TypeFeedbackVector> vector = 944 Handle<i::TypeFeedbackVector> vector =
944 i::NewTypeFeedbackVector(isolate, &feedback_spec); 945 i::NewTypeFeedbackVector(isolate, &feedback_spec);
945 int slot_index = vector->GetIndex(slot); 946 int slot_index = vector->GetIndex(slot);
947 int call_slot_index = vector->GetIndex(call_slot);
946 948
947 Handle<i::String> name = factory->NewStringFromAsciiChecked("func"); 949 Handle<i::String> name = factory->NewStringFromAsciiChecked("func");
948 name = factory->string_table()->LookupString(isolate, name); 950 name = factory->string_table()->LookupString(isolate, name);
949 951
950 // Check with no args. 952 // Check with no args.
951 { 953 {
952 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 1, 954 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 1,
953 0, 1); 955 0, 1);
954 builder.LoadNamedProperty(builder.Parameter(0), name, slot_index, i::SLOPPY) 956 builder.LoadNamedProperty(builder.Parameter(0), name, slot_index, i::SLOPPY)
955 .StoreAccumulatorInRegister(Register(0)) 957 .StoreAccumulatorInRegister(Register(0))
956 .Call(Register(0), builder.Parameter(0), 1, 0) 958 .CallIC(Register(0), builder.Parameter(0), 1, call_slot_index)
957 .Return(); 959 .Return();
958 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 960 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray();
959 961
960 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); 962 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector);
961 auto callable = tester.GetCallable<Handle<Object>>(); 963 auto callable = tester.GetCallable<Handle<Object>>();
962 964
963 Handle<Object> object = InterpreterTester::NewObject( 965 Handle<Object> object = InterpreterTester::NewObject(
964 "new (function Obj() { this.func = function() { return 0x265; }})()"); 966 "new (function Obj() { this.func = function() { return 0x265; }})()");
965 Handle<Object> return_val = callable(object).ToHandleChecked(); 967 Handle<Object> return_val = callable(object).ToHandleChecked();
966 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(0x265)); 968 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(0x265));
967 } 969 }
968 970
969 // Check that receiver is passed properly. 971 // Check that receiver is passed properly.
970 { 972 {
971 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 1, 973 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 1,
972 0, 1); 974 0, 1);
973 builder.LoadNamedProperty(builder.Parameter(0), name, slot_index, i::SLOPPY) 975 builder.LoadNamedProperty(builder.Parameter(0), name, slot_index, i::SLOPPY)
974 .StoreAccumulatorInRegister(Register(0)) 976 .StoreAccumulatorInRegister(Register(0))
975 .Call(Register(0), builder.Parameter(0), 1, 0) 977 .CallIC(Register(0), builder.Parameter(0), 1, call_slot_index)
976 .Return(); 978 .Return();
977 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 979 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray();
978 980
979 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); 981 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector);
980 auto callable = tester.GetCallable<Handle<Object>>(); 982 auto callable = tester.GetCallable<Handle<Object>>();
981 983
982 Handle<Object> object = InterpreterTester::NewObject( 984 Handle<Object> object = InterpreterTester::NewObject(
983 "new (function Obj() {" 985 "new (function Obj() {"
984 " this.val = 1234;" 986 " this.val = 1234;"
985 " this.func = function() { return this.val; };" 987 " this.func = function() { return this.val; };"
986 "})()"); 988 "})()");
987 Handle<Object> return_val = callable(object).ToHandleChecked(); 989 Handle<Object> return_val = callable(object).ToHandleChecked();
988 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(1234)); 990 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(1234));
989 } 991 }
990 992
991 // Check with two parameters (+ receiver). 993 // Check with two parameters (+ receiver).
992 { 994 {
993 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 1, 995 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 1,
994 0, 4); 996 0, 4);
995 builder.LoadNamedProperty(builder.Parameter(0), name, slot_index, i::SLOPPY) 997 builder.LoadNamedProperty(builder.Parameter(0), name, slot_index, i::SLOPPY)
996 .StoreAccumulatorInRegister(Register(0)) 998 .StoreAccumulatorInRegister(Register(0))
997 .LoadAccumulatorWithRegister(builder.Parameter(0)) 999 .LoadAccumulatorWithRegister(builder.Parameter(0))
998 .StoreAccumulatorInRegister(Register(1)) 1000 .StoreAccumulatorInRegister(Register(1))
999 .LoadLiteral(Smi::FromInt(51)) 1001 .LoadLiteral(Smi::FromInt(51))
1000 .StoreAccumulatorInRegister(Register(2)) 1002 .StoreAccumulatorInRegister(Register(2))
1001 .LoadLiteral(Smi::FromInt(11)) 1003 .LoadLiteral(Smi::FromInt(11))
1002 .StoreAccumulatorInRegister(Register(3)) 1004 .StoreAccumulatorInRegister(Register(3))
1003 .Call(Register(0), Register(1), 3, 0) 1005 .CallIC(Register(0), Register(1), 3, call_slot_index)
1004 .Return(); 1006 .Return();
1005 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 1007 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray();
1006 1008
1007 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); 1009 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector);
1008 auto callable = tester.GetCallable<Handle<Object>>(); 1010 auto callable = tester.GetCallable<Handle<Object>>();
1009 1011
1010 Handle<Object> object = InterpreterTester::NewObject( 1012 Handle<Object> object = InterpreterTester::NewObject(
1011 "new (function Obj() { " 1013 "new (function Obj() { "
1012 " this.func = function(a, b) { return a - b; }" 1014 " this.func = function(a, b) { return a - b; }"
1013 "})()"); 1015 "})()");
(...skipping 22 matching lines...) Expand all
1036 .LoadLiteral(factory->NewStringFromAsciiChecked("f")) 1038 .LoadLiteral(factory->NewStringFromAsciiChecked("f"))
1037 .StoreAccumulatorInRegister(Register(7)) 1039 .StoreAccumulatorInRegister(Register(7))
1038 .LoadLiteral(factory->NewStringFromAsciiChecked("g")) 1040 .LoadLiteral(factory->NewStringFromAsciiChecked("g"))
1039 .StoreAccumulatorInRegister(Register(8)) 1041 .StoreAccumulatorInRegister(Register(8))
1040 .LoadLiteral(factory->NewStringFromAsciiChecked("h")) 1042 .LoadLiteral(factory->NewStringFromAsciiChecked("h"))
1041 .StoreAccumulatorInRegister(Register(9)) 1043 .StoreAccumulatorInRegister(Register(9))
1042 .LoadLiteral(factory->NewStringFromAsciiChecked("i")) 1044 .LoadLiteral(factory->NewStringFromAsciiChecked("i"))
1043 .StoreAccumulatorInRegister(Register(10)) 1045 .StoreAccumulatorInRegister(Register(10))
1044 .LoadLiteral(factory->NewStringFromAsciiChecked("j")) 1046 .LoadLiteral(factory->NewStringFromAsciiChecked("j"))
1045 .StoreAccumulatorInRegister(Register(11)) 1047 .StoreAccumulatorInRegister(Register(11))
1046 .Call(Register(0), Register(1), 11, 0) 1048 .CallIC(Register(0), Register(1), 11, call_slot_index)
1047 .Return(); 1049 .Return();
1048 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); 1050 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray();
1049 1051
1050 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); 1052 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector);
1051 auto callable = tester.GetCallable<Handle<Object>>(); 1053 auto callable = tester.GetCallable<Handle<Object>>();
1052 1054
1053 Handle<Object> object = InterpreterTester::NewObject( 1055 Handle<Object> object = InterpreterTester::NewObject(
1054 "new (function Obj() { " 1056 "new (function Obj() { "
1055 " this.prefix = \"prefix_\";" 1057 " this.prefix = \"prefix_\";"
1056 " this.func = function(a, b, c, d, e, f, g, h, i, j) {" 1058 " this.func = function(a, b, c, d, e, f, g, h, i, j) {"
(...skipping 3042 matching lines...) Expand 10 before | Expand all | Expand 10 after
4099 Handle<i::Object> return_value = callable().ToHandleChecked(); 4101 Handle<i::Object> return_value = callable().ToHandleChecked();
4100 CHECK(return_value->SameValue(*const_decl[i].second)); 4102 CHECK(return_value->SameValue(*const_decl[i].second));
4101 } 4103 }
4102 4104
4103 FLAG_legacy_const = old_flag_legacy_const; 4105 FLAG_legacy_const = old_flag_legacy_const;
4104 } 4106 }
4105 4107
4106 } // namespace interpreter 4108 } // namespace interpreter
4107 } // namespace internal 4109 } // namespace internal
4108 } // namespace v8 4110 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698