| 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 756 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 767 Handle<i::TypeFeedbackVector> vector = | 767 Handle<i::TypeFeedbackVector> vector = |
| 768 i::NewTypeFeedbackVector(isolate, &feedback_spec); | 768 i::NewTypeFeedbackVector(isolate, &feedback_spec); |
| 769 | 769 |
| 770 Handle<i::String> name = factory->NewStringFromAsciiChecked("val"); | 770 Handle<i::String> name = factory->NewStringFromAsciiChecked("val"); |
| 771 name = factory->string_table()->LookupString(isolate, name); | 771 name = factory->string_table()->LookupString(isolate, name); |
| 772 | 772 |
| 773 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); | 773 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); |
| 774 builder.set_locals_count(0); | 774 builder.set_locals_count(0); |
| 775 builder.set_context_count(0); | 775 builder.set_context_count(0); |
| 776 builder.set_parameter_count(1); | 776 builder.set_parameter_count(1); |
| 777 size_t name_index = builder.GetConstantPoolEntry(name); | 777 builder.LoadNamedProperty(builder.Parameter(0), name, vector->GetIndex(slot), |
| 778 builder.LoadNamedProperty(builder.Parameter(0), name_index, | 778 i::SLOPPY) |
| 779 vector->GetIndex(slot), i::SLOPPY) | |
| 780 .Return(); | 779 .Return(); |
| 781 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 780 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
| 782 | 781 |
| 783 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); | 782 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); |
| 784 auto callable = tester.GetCallable<Handle<Object>>(); | 783 auto callable = tester.GetCallable<Handle<Object>>(); |
| 785 | 784 |
| 786 Handle<Object> object = InterpreterTester::NewObject("({ val : 123 })"); | 785 Handle<Object> object = InterpreterTester::NewObject("({ val : 123 })"); |
| 787 // Test IC miss. | 786 // Test IC miss. |
| 788 Handle<Object> return_val = callable(object).ToHandleChecked(); | 787 Handle<Object> return_val = callable(object).ToHandleChecked(); |
| 789 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(123)); | 788 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(123)); |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 869 Handle<i::TypeFeedbackVector> vector = | 868 Handle<i::TypeFeedbackVector> vector = |
| 870 i::NewTypeFeedbackVector(isolate, &feedback_spec); | 869 i::NewTypeFeedbackVector(isolate, &feedback_spec); |
| 871 | 870 |
| 872 Handle<i::String> name = factory->NewStringFromAsciiChecked("val"); | 871 Handle<i::String> name = factory->NewStringFromAsciiChecked("val"); |
| 873 name = factory->string_table()->LookupString(isolate, name); | 872 name = factory->string_table()->LookupString(isolate, name); |
| 874 | 873 |
| 875 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); | 874 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); |
| 876 builder.set_locals_count(0); | 875 builder.set_locals_count(0); |
| 877 builder.set_context_count(0); | 876 builder.set_context_count(0); |
| 878 builder.set_parameter_count(1); | 877 builder.set_parameter_count(1); |
| 879 size_t name_index = builder.GetConstantPoolEntry(name); | |
| 880 builder.LoadLiteral(Smi::FromInt(999)) | 878 builder.LoadLiteral(Smi::FromInt(999)) |
| 881 .StoreNamedProperty(builder.Parameter(0), name_index, | 879 .StoreNamedProperty(builder.Parameter(0), name, vector->GetIndex(slot), |
| 882 vector->GetIndex(slot), i::STRICT) | 880 i::STRICT) |
| 883 .Return(); | 881 .Return(); |
| 884 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 882 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
| 885 | 883 |
| 886 InterpreterTester tester(isolate, bytecode_array, vector); | 884 InterpreterTester tester(isolate, bytecode_array, vector); |
| 887 auto callable = tester.GetCallable<Handle<Object>>(); | 885 auto callable = tester.GetCallable<Handle<Object>>(); |
| 888 Handle<Object> object = InterpreterTester::NewObject("({ val : 123 })"); | 886 Handle<Object> object = InterpreterTester::NewObject("({ val : 123 })"); |
| 889 // Test IC miss. | 887 // Test IC miss. |
| 890 Handle<Object> result; | 888 Handle<Object> result; |
| 891 callable(object).ToHandleChecked(); | 889 callable(object).ToHandleChecked(); |
| 892 CHECK(Runtime::GetObjectProperty(isolate, object, name).ToHandle(&result)); | 890 CHECK(Runtime::GetObjectProperty(isolate, object, name).ToHandle(&result)); |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 984 | 982 |
| 985 Handle<i::String> name = factory->NewStringFromAsciiChecked("func"); | 983 Handle<i::String> name = factory->NewStringFromAsciiChecked("func"); |
| 986 name = factory->string_table()->LookupString(isolate, name); | 984 name = factory->string_table()->LookupString(isolate, name); |
| 987 | 985 |
| 988 // Check with no args. | 986 // Check with no args. |
| 989 { | 987 { |
| 990 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); | 988 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); |
| 991 builder.set_locals_count(1); | 989 builder.set_locals_count(1); |
| 992 builder.set_context_count(0); | 990 builder.set_context_count(0); |
| 993 builder.set_parameter_count(1); | 991 builder.set_parameter_count(1); |
| 994 size_t name_index = builder.GetConstantPoolEntry(name); | 992 builder.LoadNamedProperty(builder.Parameter(0), name, slot_index, i::SLOPPY) |
| 995 builder.LoadNamedProperty(builder.Parameter(0), name_index, slot_index, | |
| 996 i::SLOPPY) | |
| 997 .StoreAccumulatorInRegister(Register(0)) | 993 .StoreAccumulatorInRegister(Register(0)) |
| 998 .Call(Register(0), builder.Parameter(0), 0, 0) | 994 .Call(Register(0), builder.Parameter(0), 0, 0) |
| 999 .Return(); | 995 .Return(); |
| 1000 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 996 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
| 1001 | 997 |
| 1002 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); | 998 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); |
| 1003 auto callable = tester.GetCallable<Handle<Object>>(); | 999 auto callable = tester.GetCallable<Handle<Object>>(); |
| 1004 | 1000 |
| 1005 Handle<Object> object = InterpreterTester::NewObject( | 1001 Handle<Object> object = InterpreterTester::NewObject( |
| 1006 "new (function Obj() { this.func = function() { return 0x265; }})()"); | 1002 "new (function Obj() { this.func = function() { return 0x265; }})()"); |
| 1007 Handle<Object> return_val = callable(object).ToHandleChecked(); | 1003 Handle<Object> return_val = callable(object).ToHandleChecked(); |
| 1008 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(0x265)); | 1004 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(0x265)); |
| 1009 } | 1005 } |
| 1010 | 1006 |
| 1011 // Check that receiver is passed properly. | 1007 // Check that receiver is passed properly. |
| 1012 { | 1008 { |
| 1013 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); | 1009 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); |
| 1014 builder.set_locals_count(1); | 1010 builder.set_locals_count(1); |
| 1015 builder.set_context_count(0); | 1011 builder.set_context_count(0); |
| 1016 builder.set_parameter_count(1); | 1012 builder.set_parameter_count(1); |
| 1017 size_t name_index = builder.GetConstantPoolEntry(name); | 1013 builder.LoadNamedProperty(builder.Parameter(0), name, slot_index, i::SLOPPY) |
| 1018 builder.LoadNamedProperty(builder.Parameter(0), name_index, slot_index, | |
| 1019 i::SLOPPY) | |
| 1020 .StoreAccumulatorInRegister(Register(0)) | 1014 .StoreAccumulatorInRegister(Register(0)) |
| 1021 .Call(Register(0), builder.Parameter(0), 0, 0) | 1015 .Call(Register(0), builder.Parameter(0), 0, 0) |
| 1022 .Return(); | 1016 .Return(); |
| 1023 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 1017 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
| 1024 | 1018 |
| 1025 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); | 1019 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); |
| 1026 auto callable = tester.GetCallable<Handle<Object>>(); | 1020 auto callable = tester.GetCallable<Handle<Object>>(); |
| 1027 | 1021 |
| 1028 Handle<Object> object = InterpreterTester::NewObject( | 1022 Handle<Object> object = InterpreterTester::NewObject( |
| 1029 "new (function Obj() {" | 1023 "new (function Obj() {" |
| 1030 " this.val = 1234;" | 1024 " this.val = 1234;" |
| 1031 " this.func = function() { return this.val; };" | 1025 " this.func = function() { return this.val; };" |
| 1032 "})()"); | 1026 "})()"); |
| 1033 Handle<Object> return_val = callable(object).ToHandleChecked(); | 1027 Handle<Object> return_val = callable(object).ToHandleChecked(); |
| 1034 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(1234)); | 1028 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(1234)); |
| 1035 } | 1029 } |
| 1036 | 1030 |
| 1037 // Check with two parameters (+ receiver). | 1031 // Check with two parameters (+ receiver). |
| 1038 { | 1032 { |
| 1039 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); | 1033 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); |
| 1040 builder.set_locals_count(4); | 1034 builder.set_locals_count(4); |
| 1041 builder.set_context_count(0); | 1035 builder.set_context_count(0); |
| 1042 builder.set_parameter_count(1); | 1036 builder.set_parameter_count(1); |
| 1043 size_t name_index = builder.GetConstantPoolEntry(name); | 1037 builder.LoadNamedProperty(builder.Parameter(0), name, slot_index, i::SLOPPY) |
| 1044 builder.LoadNamedProperty(builder.Parameter(0), name_index, slot_index, | |
| 1045 i::SLOPPY) | |
| 1046 .StoreAccumulatorInRegister(Register(0)) | 1038 .StoreAccumulatorInRegister(Register(0)) |
| 1047 .LoadAccumulatorWithRegister(builder.Parameter(0)) | 1039 .LoadAccumulatorWithRegister(builder.Parameter(0)) |
| 1048 .StoreAccumulatorInRegister(Register(1)) | 1040 .StoreAccumulatorInRegister(Register(1)) |
| 1049 .LoadLiteral(Smi::FromInt(51)) | 1041 .LoadLiteral(Smi::FromInt(51)) |
| 1050 .StoreAccumulatorInRegister(Register(2)) | 1042 .StoreAccumulatorInRegister(Register(2)) |
| 1051 .LoadLiteral(Smi::FromInt(11)) | 1043 .LoadLiteral(Smi::FromInt(11)) |
| 1052 .StoreAccumulatorInRegister(Register(3)) | 1044 .StoreAccumulatorInRegister(Register(3)) |
| 1053 .Call(Register(0), Register(1), 2, 0) | 1045 .Call(Register(0), Register(1), 2, 0) |
| 1054 .Return(); | 1046 .Return(); |
| 1055 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 1047 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
| 1056 | 1048 |
| 1057 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); | 1049 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); |
| 1058 auto callable = tester.GetCallable<Handle<Object>>(); | 1050 auto callable = tester.GetCallable<Handle<Object>>(); |
| 1059 | 1051 |
| 1060 Handle<Object> object = InterpreterTester::NewObject( | 1052 Handle<Object> object = InterpreterTester::NewObject( |
| 1061 "new (function Obj() { " | 1053 "new (function Obj() { " |
| 1062 " this.func = function(a, b) { return a - b; }" | 1054 " this.func = function(a, b) { return a - b; }" |
| 1063 "})()"); | 1055 "})()"); |
| 1064 Handle<Object> return_val = callable(object).ToHandleChecked(); | 1056 Handle<Object> return_val = callable(object).ToHandleChecked(); |
| 1065 CHECK(return_val->SameValue(Smi::FromInt(40))); | 1057 CHECK(return_val->SameValue(Smi::FromInt(40))); |
| 1066 } | 1058 } |
| 1067 | 1059 |
| 1068 // Check with 10 parameters (+ receiver). | 1060 // Check with 10 parameters (+ receiver). |
| 1069 { | 1061 { |
| 1070 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); | 1062 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); |
| 1071 builder.set_locals_count(12); | 1063 builder.set_locals_count(12); |
| 1072 builder.set_context_count(0); | 1064 builder.set_context_count(0); |
| 1073 builder.set_parameter_count(1); | 1065 builder.set_parameter_count(1); |
| 1074 size_t name_index = builder.GetConstantPoolEntry(name); | 1066 builder.LoadNamedProperty(builder.Parameter(0), name, slot_index, i::SLOPPY) |
| 1075 builder.LoadNamedProperty(builder.Parameter(0), name_index, slot_index, | |
| 1076 i::SLOPPY) | |
| 1077 .StoreAccumulatorInRegister(Register(0)) | 1067 .StoreAccumulatorInRegister(Register(0)) |
| 1078 .LoadAccumulatorWithRegister(builder.Parameter(0)) | 1068 .LoadAccumulatorWithRegister(builder.Parameter(0)) |
| 1079 .StoreAccumulatorInRegister(Register(1)) | 1069 .StoreAccumulatorInRegister(Register(1)) |
| 1080 .LoadLiteral(factory->NewStringFromAsciiChecked("a")) | 1070 .LoadLiteral(factory->NewStringFromAsciiChecked("a")) |
| 1081 .StoreAccumulatorInRegister(Register(2)) | 1071 .StoreAccumulatorInRegister(Register(2)) |
| 1082 .LoadLiteral(factory->NewStringFromAsciiChecked("b")) | 1072 .LoadLiteral(factory->NewStringFromAsciiChecked("b")) |
| 1083 .StoreAccumulatorInRegister(Register(3)) | 1073 .StoreAccumulatorInRegister(Register(3)) |
| 1084 .LoadLiteral(factory->NewStringFromAsciiChecked("c")) | 1074 .LoadLiteral(factory->NewStringFromAsciiChecked("c")) |
| 1085 .StoreAccumulatorInRegister(Register(4)) | 1075 .StoreAccumulatorInRegister(Register(4)) |
| 1086 .LoadLiteral(factory->NewStringFromAsciiChecked("d")) | 1076 .LoadLiteral(factory->NewStringFromAsciiChecked("d")) |
| (...skipping 2072 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3159 auto callable = tester.GetCallable<>(); | 3149 auto callable = tester.GetCallable<>(); |
| 3160 | 3150 |
| 3161 Handle<i::Object> return_value = callable().ToHandleChecked(); | 3151 Handle<i::Object> return_value = callable().ToHandleChecked(); |
| 3162 CHECK(return_value->SameValue(*reg_tests[i].second)); | 3152 CHECK(return_value->SameValue(*reg_tests[i].second)); |
| 3163 } | 3153 } |
| 3164 } | 3154 } |
| 3165 | 3155 |
| 3166 } // namespace interpreter | 3156 } // namespace interpreter |
| 3167 } // namespace internal | 3157 } // namespace internal |
| 3168 } // namespace v8 | 3158 } // namespace v8 |
| OLD | NEW |