| 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 762 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 773 Handle<i::TypeFeedbackVector> vector = | 773 Handle<i::TypeFeedbackVector> vector = |
| 774 i::NewTypeFeedbackVector(isolate, &feedback_spec); | 774 i::NewTypeFeedbackVector(isolate, &feedback_spec); |
| 775 | 775 |
| 776 Handle<i::String> name = factory->NewStringFromAsciiChecked("val"); | 776 Handle<i::String> name = factory->NewStringFromAsciiChecked("val"); |
| 777 name = factory->string_table()->LookupString(isolate, name); | 777 name = factory->string_table()->LookupString(isolate, name); |
| 778 | 778 |
| 779 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); | 779 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); |
| 780 builder.set_locals_count(0); | 780 builder.set_locals_count(0); |
| 781 builder.set_context_count(0); | 781 builder.set_context_count(0); |
| 782 builder.set_parameter_count(1); | 782 builder.set_parameter_count(1); |
| 783 builder.LoadLiteral(name) | 783 size_t name_index = builder.GetConstantPoolEntry(name); |
| 784 .LoadNamedProperty(builder.Parameter(0), vector->GetIndex(slot), | 784 builder.LoadNamedProperty(builder.Parameter(0), name_index, |
| 785 i::SLOPPY) | 785 vector->GetIndex(slot), i::SLOPPY).Return(); |
| 786 .Return(); | |
| 787 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 786 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
| 788 | 787 |
| 789 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); | 788 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); |
| 790 auto callable = tester.GetCallable<Handle<Object>>(); | 789 auto callable = tester.GetCallable<Handle<Object>>(); |
| 791 | 790 |
| 792 Handle<Object> object = InterpreterTester::NewObject("({ val : 123 })"); | 791 Handle<Object> object = InterpreterTester::NewObject("({ val : 123 })"); |
| 793 // Test IC miss. | 792 // Test IC miss. |
| 794 Handle<Object> return_val = callable(object).ToHandleChecked(); | 793 Handle<Object> return_val = callable(object).ToHandleChecked(); |
| 795 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(123)); | 794 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(123)); |
| 796 | 795 |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 872 i::FeedbackVectorSpec feedback_spec(&zone); | 871 i::FeedbackVectorSpec feedback_spec(&zone); |
| 873 i::FeedbackVectorSlot slot = feedback_spec.AddStoreICSlot(); | 872 i::FeedbackVectorSlot slot = feedback_spec.AddStoreICSlot(); |
| 874 | 873 |
| 875 Handle<i::TypeFeedbackVector> vector = | 874 Handle<i::TypeFeedbackVector> vector = |
| 876 i::NewTypeFeedbackVector(isolate, &feedback_spec); | 875 i::NewTypeFeedbackVector(isolate, &feedback_spec); |
| 877 | 876 |
| 878 Handle<i::String> name = factory->NewStringFromAsciiChecked("val"); | 877 Handle<i::String> name = factory->NewStringFromAsciiChecked("val"); |
| 879 name = factory->string_table()->LookupString(isolate, name); | 878 name = factory->string_table()->LookupString(isolate, name); |
| 880 | 879 |
| 881 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); | 880 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); |
| 882 builder.set_locals_count(1); | 881 builder.set_locals_count(0); |
| 883 builder.set_context_count(0); | 882 builder.set_context_count(0); |
| 884 builder.set_parameter_count(1); | 883 builder.set_parameter_count(1); |
| 885 builder.LoadLiteral(name) | 884 size_t name_index = builder.GetConstantPoolEntry(name); |
| 886 .StoreAccumulatorInRegister(Register(0)) | 885 builder.LoadLiteral(Smi::FromInt(999)) |
| 887 .LoadLiteral(Smi::FromInt(999)) | 886 .StoreNamedProperty(builder.Parameter(0), name_index, |
| 888 .StoreNamedProperty(builder.Parameter(0), Register(0), | |
| 889 vector->GetIndex(slot), i::STRICT) | 887 vector->GetIndex(slot), i::STRICT) |
| 890 .Return(); | 888 .Return(); |
| 891 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 889 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
| 892 | 890 |
| 893 InterpreterTester tester(isolate, bytecode_array, vector); | 891 InterpreterTester tester(isolate, bytecode_array, vector); |
| 894 auto callable = tester.GetCallable<Handle<Object>>(); | 892 auto callable = tester.GetCallable<Handle<Object>>(); |
| 895 Handle<Object> object = InterpreterTester::NewObject("({ val : 123 })"); | 893 Handle<Object> object = InterpreterTester::NewObject("({ val : 123 })"); |
| 896 // Test IC miss. | 894 // Test IC miss. |
| 897 Handle<Object> result; | 895 Handle<Object> result; |
| 898 callable(object).ToHandleChecked(); | 896 callable(object).ToHandleChecked(); |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 991 | 989 |
| 992 Handle<i::String> name = factory->NewStringFromAsciiChecked("func"); | 990 Handle<i::String> name = factory->NewStringFromAsciiChecked("func"); |
| 993 name = factory->string_table()->LookupString(isolate, name); | 991 name = factory->string_table()->LookupString(isolate, name); |
| 994 | 992 |
| 995 // Check with no args. | 993 // Check with no args. |
| 996 { | 994 { |
| 997 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); | 995 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); |
| 998 builder.set_locals_count(1); | 996 builder.set_locals_count(1); |
| 999 builder.set_context_count(0); | 997 builder.set_context_count(0); |
| 1000 builder.set_parameter_count(1); | 998 builder.set_parameter_count(1); |
| 1001 builder.LoadLiteral(name) | 999 size_t name_index = builder.GetConstantPoolEntry(name); |
| 1002 .LoadNamedProperty(builder.Parameter(0), slot_index, i::SLOPPY) | 1000 builder.LoadNamedProperty(builder.Parameter(0), name_index, slot_index, |
| 1001 i::SLOPPY) |
| 1003 .StoreAccumulatorInRegister(Register(0)) | 1002 .StoreAccumulatorInRegister(Register(0)) |
| 1004 .Call(Register(0), builder.Parameter(0), 0) | 1003 .Call(Register(0), builder.Parameter(0), 0) |
| 1005 .Return(); | 1004 .Return(); |
| 1006 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 1005 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
| 1007 | 1006 |
| 1008 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); | 1007 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); |
| 1009 auto callable = tester.GetCallable<Handle<Object>>(); | 1008 auto callable = tester.GetCallable<Handle<Object>>(); |
| 1010 | 1009 |
| 1011 Handle<Object> object = InterpreterTester::NewObject( | 1010 Handle<Object> object = InterpreterTester::NewObject( |
| 1012 "new (function Obj() { this.func = function() { return 0x265; }})()"); | 1011 "new (function Obj() { this.func = function() { return 0x265; }})()"); |
| 1013 Handle<Object> return_val = callable(object).ToHandleChecked(); | 1012 Handle<Object> return_val = callable(object).ToHandleChecked(); |
| 1014 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(0x265)); | 1013 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(0x265)); |
| 1015 } | 1014 } |
| 1016 | 1015 |
| 1017 // Check that receiver is passed properly. | 1016 // Check that receiver is passed properly. |
| 1018 { | 1017 { |
| 1019 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); | 1018 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); |
| 1020 builder.set_locals_count(1); | 1019 builder.set_locals_count(1); |
| 1021 builder.set_context_count(0); | 1020 builder.set_context_count(0); |
| 1022 builder.set_parameter_count(1); | 1021 builder.set_parameter_count(1); |
| 1023 builder.LoadLiteral(name) | 1022 size_t name_index = builder.GetConstantPoolEntry(name); |
| 1024 .LoadNamedProperty(builder.Parameter(0), slot_index, i::SLOPPY) | 1023 builder.LoadNamedProperty(builder.Parameter(0), name_index, slot_index, |
| 1024 i::SLOPPY) |
| 1025 .StoreAccumulatorInRegister(Register(0)) | 1025 .StoreAccumulatorInRegister(Register(0)) |
| 1026 .Call(Register(0), builder.Parameter(0), 0) | 1026 .Call(Register(0), builder.Parameter(0), 0) |
| 1027 .Return(); | 1027 .Return(); |
| 1028 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 1028 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
| 1029 | 1029 |
| 1030 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); | 1030 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); |
| 1031 auto callable = tester.GetCallable<Handle<Object>>(); | 1031 auto callable = tester.GetCallable<Handle<Object>>(); |
| 1032 | 1032 |
| 1033 Handle<Object> object = InterpreterTester::NewObject( | 1033 Handle<Object> object = InterpreterTester::NewObject( |
| 1034 "new (function Obj() {" | 1034 "new (function Obj() {" |
| 1035 " this.val = 1234;" | 1035 " this.val = 1234;" |
| 1036 " this.func = function() { return this.val; };" | 1036 " this.func = function() { return this.val; };" |
| 1037 "})()"); | 1037 "})()"); |
| 1038 Handle<Object> return_val = callable(object).ToHandleChecked(); | 1038 Handle<Object> return_val = callable(object).ToHandleChecked(); |
| 1039 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(1234)); | 1039 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(1234)); |
| 1040 } | 1040 } |
| 1041 | 1041 |
| 1042 // Check with two parameters (+ receiver). | 1042 // Check with two parameters (+ receiver). |
| 1043 { | 1043 { |
| 1044 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); | 1044 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); |
| 1045 builder.set_locals_count(4); | 1045 builder.set_locals_count(4); |
| 1046 builder.set_context_count(0); | 1046 builder.set_context_count(0); |
| 1047 builder.set_parameter_count(1); | 1047 builder.set_parameter_count(1); |
| 1048 builder.LoadLiteral(name) | 1048 size_t name_index = builder.GetConstantPoolEntry(name); |
| 1049 .LoadNamedProperty(builder.Parameter(0), slot_index, i::SLOPPY) | 1049 builder.LoadNamedProperty(builder.Parameter(0), name_index, slot_index, |
| 1050 i::SLOPPY) |
| 1050 .StoreAccumulatorInRegister(Register(0)) | 1051 .StoreAccumulatorInRegister(Register(0)) |
| 1051 .LoadAccumulatorWithRegister(builder.Parameter(0)) | 1052 .LoadAccumulatorWithRegister(builder.Parameter(0)) |
| 1052 .StoreAccumulatorInRegister(Register(1)) | 1053 .StoreAccumulatorInRegister(Register(1)) |
| 1053 .LoadLiteral(Smi::FromInt(51)) | 1054 .LoadLiteral(Smi::FromInt(51)) |
| 1054 .StoreAccumulatorInRegister(Register(2)) | 1055 .StoreAccumulatorInRegister(Register(2)) |
| 1055 .LoadLiteral(Smi::FromInt(11)) | 1056 .LoadLiteral(Smi::FromInt(11)) |
| 1056 .StoreAccumulatorInRegister(Register(3)) | 1057 .StoreAccumulatorInRegister(Register(3)) |
| 1057 .Call(Register(0), Register(1), 2) | 1058 .Call(Register(0), Register(1), 2) |
| 1058 .Return(); | 1059 .Return(); |
| 1059 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 1060 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
| 1060 | 1061 |
| 1061 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); | 1062 InterpreterTester tester(handles.main_isolate(), bytecode_array, vector); |
| 1062 auto callable = tester.GetCallable<Handle<Object>>(); | 1063 auto callable = tester.GetCallable<Handle<Object>>(); |
| 1063 | 1064 |
| 1064 Handle<Object> object = InterpreterTester::NewObject( | 1065 Handle<Object> object = InterpreterTester::NewObject( |
| 1065 "new (function Obj() { " | 1066 "new (function Obj() { " |
| 1066 " this.func = function(a, b) { return a - b; }" | 1067 " this.func = function(a, b) { return a - b; }" |
| 1067 "})()"); | 1068 "})()"); |
| 1068 Handle<Object> return_val = callable(object).ToHandleChecked(); | 1069 Handle<Object> return_val = callable(object).ToHandleChecked(); |
| 1069 CHECK(return_val->SameValue(Smi::FromInt(40))); | 1070 CHECK(return_val->SameValue(Smi::FromInt(40))); |
| 1070 } | 1071 } |
| 1071 | 1072 |
| 1072 // Check with 10 parameters (+ receiver). | 1073 // Check with 10 parameters (+ receiver). |
| 1073 { | 1074 { |
| 1074 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); | 1075 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); |
| 1075 builder.set_locals_count(12); | 1076 builder.set_locals_count(12); |
| 1076 builder.set_context_count(0); | 1077 builder.set_context_count(0); |
| 1077 builder.set_parameter_count(1); | 1078 builder.set_parameter_count(1); |
| 1078 builder.LoadLiteral(name) | 1079 size_t name_index = builder.GetConstantPoolEntry(name); |
| 1079 .LoadNamedProperty(builder.Parameter(0), slot_index, i::SLOPPY) | 1080 builder.LoadNamedProperty(builder.Parameter(0), name_index, slot_index, |
| 1081 i::SLOPPY) |
| 1080 .StoreAccumulatorInRegister(Register(0)) | 1082 .StoreAccumulatorInRegister(Register(0)) |
| 1081 .LoadAccumulatorWithRegister(builder.Parameter(0)) | 1083 .LoadAccumulatorWithRegister(builder.Parameter(0)) |
| 1082 .StoreAccumulatorInRegister(Register(1)) | 1084 .StoreAccumulatorInRegister(Register(1)) |
| 1083 .LoadLiteral(factory->NewStringFromAsciiChecked("a")) | 1085 .LoadLiteral(factory->NewStringFromAsciiChecked("a")) |
| 1084 .StoreAccumulatorInRegister(Register(2)) | 1086 .StoreAccumulatorInRegister(Register(2)) |
| 1085 .LoadLiteral(factory->NewStringFromAsciiChecked("b")) | 1087 .LoadLiteral(factory->NewStringFromAsciiChecked("b")) |
| 1086 .StoreAccumulatorInRegister(Register(3)) | 1088 .StoreAccumulatorInRegister(Register(3)) |
| 1087 .LoadLiteral(factory->NewStringFromAsciiChecked("c")) | 1089 .LoadLiteral(factory->NewStringFromAsciiChecked("c")) |
| 1088 .StoreAccumulatorInRegister(Register(4)) | 1090 .StoreAccumulatorInRegister(Register(4)) |
| 1089 .LoadLiteral(factory->NewStringFromAsciiChecked("d")) | 1091 .LoadLiteral(factory->NewStringFromAsciiChecked("d")) |
| (...skipping 965 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2055 "(function() { try { f(); } catch(e) { return e; }})()"; | 2057 "(function() { try { f(); } catch(e) { return e; }})()"; |
| 2056 | 2058 |
| 2057 for (size_t i = 0; i < arraysize(throws); i++) { | 2059 for (size_t i = 0; i < arraysize(throws); i++) { |
| 2058 std::string source(InterpreterTester::SourceForBody(throws[i].first)); | 2060 std::string source(InterpreterTester::SourceForBody(throws[i].first)); |
| 2059 InterpreterTester tester(handles.main_isolate(), source.c_str()); | 2061 InterpreterTester tester(handles.main_isolate(), source.c_str()); |
| 2060 tester.GetCallable<>(); | 2062 tester.GetCallable<>(); |
| 2061 Handle<Object> thrown_obj = v8::Utils::OpenHandle(*CompileRun(try_wrapper)); | 2063 Handle<Object> thrown_obj = v8::Utils::OpenHandle(*CompileRun(try_wrapper)); |
| 2062 CHECK(thrown_obj->SameValue(*throws[i].second)); | 2064 CHECK(thrown_obj->SameValue(*throws[i].second)); |
| 2063 } | 2065 } |
| 2064 } | 2066 } |
| OLD | NEW |