Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(437)

Side by Side Diff: test/cctest/interpreter/test-interpreter.cc

Issue 1419003002: [Interpreter] Unify global and unallocated variable access. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698