| 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 921 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |