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 923 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
934 | 934 |
935 Handle<i::String> name = factory->NewStringFromAsciiChecked("func"); | 935 Handle<i::String> name = factory->NewStringFromAsciiChecked("func"); |
936 name = factory->string_table()->LookupString(isolate, name); | 936 name = factory->string_table()->LookupString(isolate, name); |
937 | 937 |
938 // Check with no args. | 938 // Check with no args. |
939 { | 939 { |
940 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 1, | 940 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 1, |
941 0, 1); | 941 0, 1); |
942 builder.LoadNamedProperty(builder.Parameter(0), name, slot_index, i::SLOPPY) | 942 builder.LoadNamedProperty(builder.Parameter(0), name, slot_index, i::SLOPPY) |
943 .StoreAccumulatorInRegister(Register(0)) | 943 .StoreAccumulatorInRegister(Register(0)) |
944 .Call(Register(0), builder.Parameter(0), 0, 0) | 944 .Call(Register(0), builder.Parameter(0), 1, 0) |
945 .Return(); | 945 .Return(); |
946 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 946 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
947 | 947 |
948 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); | 948 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); |
949 auto callable = tester.GetCallable<Handle<Object>>(); | 949 auto callable = tester.GetCallable<Handle<Object>>(); |
950 | 950 |
951 Handle<Object> object = InterpreterTester::NewObject( | 951 Handle<Object> object = InterpreterTester::NewObject( |
952 "new (function Obj() { this.func = function() { return 0x265; }})()"); | 952 "new (function Obj() { this.func = function() { return 0x265; }})()"); |
953 Handle<Object> return_val = callable(object).ToHandleChecked(); | 953 Handle<Object> return_val = callable(object).ToHandleChecked(); |
954 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(0x265)); | 954 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(0x265)); |
955 } | 955 } |
956 | 956 |
957 // Check that receiver is passed properly. | 957 // Check that receiver is passed properly. |
958 { | 958 { |
959 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 1, | 959 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 1, |
960 0, 1); | 960 0, 1); |
961 builder.LoadNamedProperty(builder.Parameter(0), name, slot_index, i::SLOPPY) | 961 builder.LoadNamedProperty(builder.Parameter(0), name, slot_index, i::SLOPPY) |
962 .StoreAccumulatorInRegister(Register(0)) | 962 .StoreAccumulatorInRegister(Register(0)) |
963 .Call(Register(0), builder.Parameter(0), 0, 0) | 963 .Call(Register(0), builder.Parameter(0), 1, 0) |
964 .Return(); | 964 .Return(); |
965 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 965 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
966 | 966 |
967 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); | 967 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); |
968 auto callable = tester.GetCallable<Handle<Object>>(); | 968 auto callable = tester.GetCallable<Handle<Object>>(); |
969 | 969 |
970 Handle<Object> object = InterpreterTester::NewObject( | 970 Handle<Object> object = InterpreterTester::NewObject( |
971 "new (function Obj() {" | 971 "new (function Obj() {" |
972 " this.val = 1234;" | 972 " this.val = 1234;" |
973 " this.func = function() { return this.val; };" | 973 " this.func = function() { return this.val; };" |
974 "})()"); | 974 "})()"); |
975 Handle<Object> return_val = callable(object).ToHandleChecked(); | 975 Handle<Object> return_val = callable(object).ToHandleChecked(); |
976 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(1234)); | 976 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(1234)); |
977 } | 977 } |
978 | 978 |
979 // Check with two parameters (+ receiver). | 979 // Check with two parameters (+ receiver). |
980 { | 980 { |
981 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 1, | 981 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 1, |
982 0, 4); | 982 0, 4); |
983 builder.LoadNamedProperty(builder.Parameter(0), name, slot_index, i::SLOPPY) | 983 builder.LoadNamedProperty(builder.Parameter(0), name, slot_index, i::SLOPPY) |
984 .StoreAccumulatorInRegister(Register(0)) | 984 .StoreAccumulatorInRegister(Register(0)) |
985 .LoadAccumulatorWithRegister(builder.Parameter(0)) | 985 .LoadAccumulatorWithRegister(builder.Parameter(0)) |
986 .StoreAccumulatorInRegister(Register(1)) | 986 .StoreAccumulatorInRegister(Register(1)) |
987 .LoadLiteral(Smi::FromInt(51)) | 987 .LoadLiteral(Smi::FromInt(51)) |
988 .StoreAccumulatorInRegister(Register(2)) | 988 .StoreAccumulatorInRegister(Register(2)) |
989 .LoadLiteral(Smi::FromInt(11)) | 989 .LoadLiteral(Smi::FromInt(11)) |
990 .StoreAccumulatorInRegister(Register(3)) | 990 .StoreAccumulatorInRegister(Register(3)) |
991 .Call(Register(0), Register(1), 2, 0) | 991 .Call(Register(0), Register(1), 3, 0) |
992 .Return(); | 992 .Return(); |
993 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 993 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
994 | 994 |
995 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); | 995 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); |
996 auto callable = tester.GetCallable<Handle<Object>>(); | 996 auto callable = tester.GetCallable<Handle<Object>>(); |
997 | 997 |
998 Handle<Object> object = InterpreterTester::NewObject( | 998 Handle<Object> object = InterpreterTester::NewObject( |
999 "new (function Obj() { " | 999 "new (function Obj() { " |
1000 " this.func = function(a, b) { return a - b; }" | 1000 " this.func = function(a, b) { return a - b; }" |
1001 "})()"); | 1001 "})()"); |
(...skipping 22 matching lines...) Expand all Loading... |
1024 .LoadLiteral(factory->NewStringFromAsciiChecked("f")) | 1024 .LoadLiteral(factory->NewStringFromAsciiChecked("f")) |
1025 .StoreAccumulatorInRegister(Register(7)) | 1025 .StoreAccumulatorInRegister(Register(7)) |
1026 .LoadLiteral(factory->NewStringFromAsciiChecked("g")) | 1026 .LoadLiteral(factory->NewStringFromAsciiChecked("g")) |
1027 .StoreAccumulatorInRegister(Register(8)) | 1027 .StoreAccumulatorInRegister(Register(8)) |
1028 .LoadLiteral(factory->NewStringFromAsciiChecked("h")) | 1028 .LoadLiteral(factory->NewStringFromAsciiChecked("h")) |
1029 .StoreAccumulatorInRegister(Register(9)) | 1029 .StoreAccumulatorInRegister(Register(9)) |
1030 .LoadLiteral(factory->NewStringFromAsciiChecked("i")) | 1030 .LoadLiteral(factory->NewStringFromAsciiChecked("i")) |
1031 .StoreAccumulatorInRegister(Register(10)) | 1031 .StoreAccumulatorInRegister(Register(10)) |
1032 .LoadLiteral(factory->NewStringFromAsciiChecked("j")) | 1032 .LoadLiteral(factory->NewStringFromAsciiChecked("j")) |
1033 .StoreAccumulatorInRegister(Register(11)) | 1033 .StoreAccumulatorInRegister(Register(11)) |
1034 .Call(Register(0), Register(1), 10, 0) | 1034 .Call(Register(0), Register(1), 11, 0) |
1035 .Return(); | 1035 .Return(); |
1036 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 1036 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
1037 | 1037 |
1038 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); | 1038 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); |
1039 auto callable = tester.GetCallable<Handle<Object>>(); | 1039 auto callable = tester.GetCallable<Handle<Object>>(); |
1040 | 1040 |
1041 Handle<Object> object = InterpreterTester::NewObject( | 1041 Handle<Object> object = InterpreterTester::NewObject( |
1042 "new (function Obj() { " | 1042 "new (function Obj() { " |
1043 " this.prefix = \"prefix_\";" | 1043 " this.prefix = \"prefix_\";" |
1044 " this.func = function(a, b, c, d, e, f, g, h, i, j) {" | 1044 " this.func = function(a, b, c, d, e, f, g, h, i, j) {" |
(...skipping 2734 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3779 auto callable = tester.GetCallable<>(); | 3779 auto callable = tester.GetCallable<>(); |
3780 | 3780 |
3781 Handle<i::Object> return_value = callable().ToHandleChecked(); | 3781 Handle<i::Object> return_value = callable().ToHandleChecked(); |
3782 CHECK(return_value->SameValue(*with_stmt[i].second)); | 3782 CHECK(return_value->SameValue(*with_stmt[i].second)); |
3783 } | 3783 } |
3784 } | 3784 } |
3785 | 3785 |
3786 } // namespace interpreter | 3786 } // namespace interpreter |
3787 } // namespace internal | 3787 } // namespace internal |
3788 } // namespace v8 | 3788 } // namespace v8 |
OLD | NEW |