| 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 726 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 737 i::FeedbackVectorSlot slot = feedback_spec.AddLoadICSlot(); | 737 i::FeedbackVectorSlot slot = feedback_spec.AddLoadICSlot(); |
| 738 | 738 |
| 739 Handle<i::TypeFeedbackVector> vector = | 739 Handle<i::TypeFeedbackVector> vector = |
| 740 i::NewTypeFeedbackVector(isolate, &feedback_spec); | 740 i::NewTypeFeedbackVector(isolate, &feedback_spec); |
| 741 | 741 |
| 742 Handle<i::String> name = factory->NewStringFromAsciiChecked("val"); | 742 Handle<i::String> name = factory->NewStringFromAsciiChecked("val"); |
| 743 name = factory->string_table()->LookupString(isolate, name); | 743 name = factory->string_table()->LookupString(isolate, name); |
| 744 | 744 |
| 745 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 1, | 745 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 1, |
| 746 0, 0); | 746 0, 0); |
| 747 builder.LoadNamedProperty(builder.Parameter(0), name, vector->GetIndex(slot), | 747 builder.LoadNamedProperty(builder.Parameter(0), name, vector->GetIndex(slot)) |
| 748 i::SLOPPY) | |
| 749 .Return(); | 748 .Return(); |
| 750 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 749 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
| 751 | 750 |
| 752 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); | 751 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); |
| 753 auto callable = tester.GetCallable<Handle<Object>>(); | 752 auto callable = tester.GetCallable<Handle<Object>>(); |
| 754 | 753 |
| 755 Handle<Object> object = InterpreterTester::NewObject("({ val : 123 })"); | 754 Handle<Object> object = InterpreterTester::NewObject("({ val : 123 })"); |
| 756 // Test IC miss. | 755 // Test IC miss. |
| 757 Handle<Object> return_val = callable(object).ToHandleChecked(); | 756 Handle<Object> return_val = callable(object).ToHandleChecked(); |
| 758 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(123)); | 757 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(123)); |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 792 | 791 |
| 793 Handle<i::TypeFeedbackVector> vector = | 792 Handle<i::TypeFeedbackVector> vector = |
| 794 i::NewTypeFeedbackVector(isolate, &feedback_spec); | 793 i::NewTypeFeedbackVector(isolate, &feedback_spec); |
| 795 | 794 |
| 796 Handle<i::String> key = factory->NewStringFromAsciiChecked("key"); | 795 Handle<i::String> key = factory->NewStringFromAsciiChecked("key"); |
| 797 key = factory->string_table()->LookupString(isolate, key); | 796 key = factory->string_table()->LookupString(isolate, key); |
| 798 | 797 |
| 799 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 1, | 798 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 1, |
| 800 0, 1); | 799 0, 1); |
| 801 builder.LoadLiteral(key) | 800 builder.LoadLiteral(key) |
| 802 .LoadKeyedProperty(builder.Parameter(0), vector->GetIndex(slot), | 801 .LoadKeyedProperty(builder.Parameter(0), vector->GetIndex(slot)) |
| 803 i::STRICT) | |
| 804 .Return(); | 802 .Return(); |
| 805 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 803 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
| 806 | 804 |
| 807 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); | 805 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); |
| 808 auto callable = tester.GetCallable<Handle<Object>>(); | 806 auto callable = tester.GetCallable<Handle<Object>>(); |
| 809 | 807 |
| 810 Handle<Object> object = InterpreterTester::NewObject("({ key : 123 })"); | 808 Handle<Object> object = InterpreterTester::NewObject("({ key : 123 })"); |
| 811 // Test IC miss. | 809 // Test IC miss. |
| 812 Handle<Object> return_val = callable(object).ToHandleChecked(); | 810 Handle<Object> return_val = callable(object).ToHandleChecked(); |
| 813 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(123)); | 811 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(123)); |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 944 i::NewTypeFeedbackVector(isolate, &feedback_spec); | 942 i::NewTypeFeedbackVector(isolate, &feedback_spec); |
| 945 int slot_index = vector->GetIndex(slot); | 943 int slot_index = vector->GetIndex(slot); |
| 946 | 944 |
| 947 Handle<i::String> name = factory->NewStringFromAsciiChecked("func"); | 945 Handle<i::String> name = factory->NewStringFromAsciiChecked("func"); |
| 948 name = factory->string_table()->LookupString(isolate, name); | 946 name = factory->string_table()->LookupString(isolate, name); |
| 949 | 947 |
| 950 // Check with no args. | 948 // Check with no args. |
| 951 { | 949 { |
| 952 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 1, | 950 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 1, |
| 953 0, 1); | 951 0, 1); |
| 954 builder.LoadNamedProperty(builder.Parameter(0), name, slot_index, i::SLOPPY) | 952 builder.LoadNamedProperty(builder.Parameter(0), name, slot_index) |
| 955 .StoreAccumulatorInRegister(Register(0)) | 953 .StoreAccumulatorInRegister(Register(0)) |
| 956 .Call(Register(0), builder.Parameter(0), 1, 0) | 954 .Call(Register(0), builder.Parameter(0), 1, 0) |
| 957 .Return(); | 955 .Return(); |
| 958 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 956 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
| 959 | 957 |
| 960 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); | 958 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); |
| 961 auto callable = tester.GetCallable<Handle<Object>>(); | 959 auto callable = tester.GetCallable<Handle<Object>>(); |
| 962 | 960 |
| 963 Handle<Object> object = InterpreterTester::NewObject( | 961 Handle<Object> object = InterpreterTester::NewObject( |
| 964 "new (function Obj() { this.func = function() { return 0x265; }})()"); | 962 "new (function Obj() { this.func = function() { return 0x265; }})()"); |
| 965 Handle<Object> return_val = callable(object).ToHandleChecked(); | 963 Handle<Object> return_val = callable(object).ToHandleChecked(); |
| 966 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(0x265)); | 964 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(0x265)); |
| 967 } | 965 } |
| 968 | 966 |
| 969 // Check that receiver is passed properly. | 967 // Check that receiver is passed properly. |
| 970 { | 968 { |
| 971 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 1, | 969 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 1, |
| 972 0, 1); | 970 0, 1); |
| 973 builder.LoadNamedProperty(builder.Parameter(0), name, slot_index, i::SLOPPY) | 971 builder.LoadNamedProperty(builder.Parameter(0), name, slot_index) |
| 974 .StoreAccumulatorInRegister(Register(0)) | 972 .StoreAccumulatorInRegister(Register(0)) |
| 975 .Call(Register(0), builder.Parameter(0), 1, 0) | 973 .Call(Register(0), builder.Parameter(0), 1, 0) |
| 976 .Return(); | 974 .Return(); |
| 977 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 975 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
| 978 | 976 |
| 979 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); | 977 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); |
| 980 auto callable = tester.GetCallable<Handle<Object>>(); | 978 auto callable = tester.GetCallable<Handle<Object>>(); |
| 981 | 979 |
| 982 Handle<Object> object = InterpreterTester::NewObject( | 980 Handle<Object> object = InterpreterTester::NewObject( |
| 983 "new (function Obj() {" | 981 "new (function Obj() {" |
| 984 " this.val = 1234;" | 982 " this.val = 1234;" |
| 985 " this.func = function() { return this.val; };" | 983 " this.func = function() { return this.val; };" |
| 986 "})()"); | 984 "})()"); |
| 987 Handle<Object> return_val = callable(object).ToHandleChecked(); | 985 Handle<Object> return_val = callable(object).ToHandleChecked(); |
| 988 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(1234)); | 986 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(1234)); |
| 989 } | 987 } |
| 990 | 988 |
| 991 // Check with two parameters (+ receiver). | 989 // Check with two parameters (+ receiver). |
| 992 { | 990 { |
| 993 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 1, | 991 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 1, |
| 994 0, 4); | 992 0, 4); |
| 995 builder.LoadNamedProperty(builder.Parameter(0), name, slot_index, i::SLOPPY) | 993 builder.LoadNamedProperty(builder.Parameter(0), name, slot_index) |
| 996 .StoreAccumulatorInRegister(Register(0)) | 994 .StoreAccumulatorInRegister(Register(0)) |
| 997 .LoadAccumulatorWithRegister(builder.Parameter(0)) | 995 .LoadAccumulatorWithRegister(builder.Parameter(0)) |
| 998 .StoreAccumulatorInRegister(Register(1)) | 996 .StoreAccumulatorInRegister(Register(1)) |
| 999 .LoadLiteral(Smi::FromInt(51)) | 997 .LoadLiteral(Smi::FromInt(51)) |
| 1000 .StoreAccumulatorInRegister(Register(2)) | 998 .StoreAccumulatorInRegister(Register(2)) |
| 1001 .LoadLiteral(Smi::FromInt(11)) | 999 .LoadLiteral(Smi::FromInt(11)) |
| 1002 .StoreAccumulatorInRegister(Register(3)) | 1000 .StoreAccumulatorInRegister(Register(3)) |
| 1003 .Call(Register(0), Register(1), 3, 0) | 1001 .Call(Register(0), Register(1), 3, 0) |
| 1004 .Return(); | 1002 .Return(); |
| 1005 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 1003 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
| 1006 | 1004 |
| 1007 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); | 1005 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); |
| 1008 auto callable = tester.GetCallable<Handle<Object>>(); | 1006 auto callable = tester.GetCallable<Handle<Object>>(); |
| 1009 | 1007 |
| 1010 Handle<Object> object = InterpreterTester::NewObject( | 1008 Handle<Object> object = InterpreterTester::NewObject( |
| 1011 "new (function Obj() { " | 1009 "new (function Obj() { " |
| 1012 " this.func = function(a, b) { return a - b; }" | 1010 " this.func = function(a, b) { return a - b; }" |
| 1013 "})()"); | 1011 "})()"); |
| 1014 Handle<Object> return_val = callable(object).ToHandleChecked(); | 1012 Handle<Object> return_val = callable(object).ToHandleChecked(); |
| 1015 CHECK(return_val->SameValue(Smi::FromInt(40))); | 1013 CHECK(return_val->SameValue(Smi::FromInt(40))); |
| 1016 } | 1014 } |
| 1017 | 1015 |
| 1018 // Check with 10 parameters (+ receiver). | 1016 // Check with 10 parameters (+ receiver). |
| 1019 { | 1017 { |
| 1020 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 1, | 1018 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 1, |
| 1021 0, 12); | 1019 0, 12); |
| 1022 builder.LoadNamedProperty(builder.Parameter(0), name, slot_index, i::SLOPPY) | 1020 builder.LoadNamedProperty(builder.Parameter(0), name, slot_index) |
| 1023 .StoreAccumulatorInRegister(Register(0)) | 1021 .StoreAccumulatorInRegister(Register(0)) |
| 1024 .LoadAccumulatorWithRegister(builder.Parameter(0)) | 1022 .LoadAccumulatorWithRegister(builder.Parameter(0)) |
| 1025 .StoreAccumulatorInRegister(Register(1)) | 1023 .StoreAccumulatorInRegister(Register(1)) |
| 1026 .LoadLiteral(factory->NewStringFromAsciiChecked("a")) | 1024 .LoadLiteral(factory->NewStringFromAsciiChecked("a")) |
| 1027 .StoreAccumulatorInRegister(Register(2)) | 1025 .StoreAccumulatorInRegister(Register(2)) |
| 1028 .LoadLiteral(factory->NewStringFromAsciiChecked("b")) | 1026 .LoadLiteral(factory->NewStringFromAsciiChecked("b")) |
| 1029 .StoreAccumulatorInRegister(Register(3)) | 1027 .StoreAccumulatorInRegister(Register(3)) |
| 1030 .LoadLiteral(factory->NewStringFromAsciiChecked("c")) | 1028 .LoadLiteral(factory->NewStringFromAsciiChecked("c")) |
| 1031 .StoreAccumulatorInRegister(Register(4)) | 1029 .StoreAccumulatorInRegister(Register(4)) |
| 1032 .LoadLiteral(factory->NewStringFromAsciiChecked("d")) | 1030 .LoadLiteral(factory->NewStringFromAsciiChecked("d")) |
| (...skipping 3125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4158 Handle<i::Object> return_value = callable().ToHandleChecked(); | 4156 Handle<i::Object> return_value = callable().ToHandleChecked(); |
| 4159 CHECK(return_value->SameValue(*const_decl[i].second)); | 4157 CHECK(return_value->SameValue(*const_decl[i].second)); |
| 4160 } | 4158 } |
| 4161 | 4159 |
| 4162 FLAG_legacy_const = old_flag_legacy_const; | 4160 FLAG_legacy_const = old_flag_legacy_const; |
| 4163 } | 4161 } |
| 4164 | 4162 |
| 4165 } // namespace interpreter | 4163 } // namespace interpreter |
| 4166 } // namespace internal | 4164 } // namespace internal |
| 4167 } // namespace v8 | 4165 } // namespace v8 |
| OLD | NEW |