| 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 | 
|---|