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

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

Issue 1422033002: [Interpreter] Add support for for..in. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Comment nits. 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/compiler.h" 7 #include "src/compiler.h"
8 #include "src/interpreter/bytecode-array-iterator.h" 8 #include "src/interpreter/bytecode-array-iterator.h"
9 #include "src/interpreter/bytecode-generator.h" 9 #include "src/interpreter/bytecode-generator.h"
10 #include "src/interpreter/interpreter.h" 10 #include "src/interpreter/interpreter.h"
(...skipping 3799 matching lines...) Expand 10 before | Expand all | Expand 10 after
3810 }; 3810 };
3811 3811
3812 for (size_t i = 0; i < arraysize(snippets); i++) { 3812 for (size_t i = 0; i < arraysize(snippets); i++) {
3813 Handle<BytecodeArray> bytecode_array = 3813 Handle<BytecodeArray> bytecode_array =
3814 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); 3814 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet);
3815 CheckBytecodeArrayEqual(snippets[i], bytecode_array); 3815 CheckBytecodeArrayEqual(snippets[i], bytecode_array);
3816 } 3816 }
3817 } 3817 }
3818 3818
3819 3819
3820 TEST(ForIn) {
3821 InitializedHandleScope handle_scope;
3822 BytecodeGeneratorHelper helper;
3823 Zone zone;
3824
3825 int simple_flags =
3826 ArrayLiteral::kDisableMementos | ArrayLiteral::kShallowElements;
3827 int deep_elements_flags =
3828 ObjectLiteral::kFastElements | ObjectLiteral::kDisableMementos;
3829
3830 FeedbackVectorSpec feedback_spec(&zone);
3831 feedback_spec.AddStoreICSlot();
3832 FeedbackVectorSlot slot2 = feedback_spec.AddStoreICSlot();
3833 FeedbackVectorSlot slot3 = feedback_spec.AddStoreICSlot();
3834 FeedbackVectorSlot slot4 = feedback_spec.AddStoreICSlot();
3835 Handle<i::TypeFeedbackVector> vector =
3836 i::NewTypeFeedbackVector(helper.isolate(), &feedback_spec);
3837
3838 ExpectedSnippet<InstanceType> snippets[] = {
3839 {"for (var p in null) {}",
3840 2 * kPointerSize,
3841 1,
3842 2,
3843 {B(LdaUndefined), B(Return)},
3844 0},
3845 {"for (var p in undefined) {}",
3846 2 * kPointerSize,
3847 1,
3848 2,
3849 {B(LdaUndefined), B(Return)},
3850 0},
3851 {"var x = 'potatoes';\n"
3852 "for (var p in x) { return p; }",
3853 5 * kPointerSize,
3854 1,
3855 52,
3856 {
3857 B(LdaConstant), U8(0), //
3858 B(Star), R(1), //
3859 B(Ldar), R(1), //
3860 B(JumpIfUndefined), U8(44), //
3861 B(JumpIfNull), U8(42), //
3862 B(ToObject), //
3863 B(Star), R(3), //
3864 B(CallRuntime), U16(Runtime::kGetPropertyNamesFast), R(3), U8(1), //
3865 B(ForInPrepare), R(3), //
3866 B(JumpIfUndefined), U8(30), //
3867 B(Star), R(4), //
3868 B(LdaZero), //
3869 B(Star), R(3), //
3870 B(ForInDone), R(4), //
3871 B(JumpIfTrue), U8(21), //
3872 B(ForInNext), R(4), R(3), //
3873 B(JumpIfUndefined), U8(11), //
3874 B(Star), R(0), //
3875 B(Ldar), R(0), //
3876 B(Star), R(2), //
3877 B(Ldar), R(2), //
3878 B(Return), //
3879 B(Ldar), R(3), //
3880 B(Inc), //
3881 B(Jump), U8(-23), //
3882 B(LdaUndefined), //
3883 B(Return), //
3884 },
3885 1,
3886 {InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}},
3887 {"var x = 0;\n"
3888 "for (var p in [1,2,3]) { x += p; }",
3889 5 * kPointerSize,
3890 1,
3891 57,
3892 {
3893 B(LdaZero), //
3894 B(Star), R(1), //
3895 B(LdaConstant), U8(0), //
3896 B(CreateArrayLiteral), U8(0), U8(simple_flags), //
3897 B(JumpIfUndefined), U8(47), //
3898 B(JumpIfNull), U8(45), //
3899 B(ToObject), //
3900 B(Star), R(3), //
3901 B(CallRuntime), U16(Runtime::kGetPropertyNamesFast), R(3), U8(1), //
3902 B(ForInPrepare), R(3), //
3903 B(JumpIfUndefined), U8(33), //
3904 B(Star), R(4), //
3905 B(LdaZero), //
3906 B(Star), R(3), //
3907 B(ForInDone), R(4), //
3908 B(JumpIfTrue), U8(24), //
3909 B(ForInNext), R(4), R(3), //
3910 B(JumpIfUndefined), U8(14), //
3911 B(Star), R(0), //
3912 B(Ldar), R(0), //
3913 B(Star), R(2), //
3914 B(Ldar), R(2), //
3915 B(Add), R(1), //
3916 B(Star), R(1), //
3917 B(Ldar), R(3), //
3918 B(Inc), //
3919 B(Jump), U8(-26), //
3920 B(LdaUndefined), //
3921 B(Return), //
3922 },
3923 1,
3924 {InstanceType::FIXED_ARRAY_TYPE}},
3925 {"var x = { 'a': 1, 'b': 2 };\n"
3926 "for (x['a'] in [10, 20, 30]) {\n"
3927 " if (x['a'] == 10) continue;\n"
3928 " if (x['a'] == 20) break;\n"
3929 "}",
3930 4 * kPointerSize,
3931 1,
3932 83,
3933 {
3934 B(LdaConstant), U8(0), //
3935 B(CreateObjectLiteral), U8(0), U8(deep_elements_flags), //
3936 B(Star), R(0), //
3937 B(LdaConstant), U8(1), //
3938 B(CreateArrayLiteral), U8(1), U8(simple_flags), //
3939 B(JumpIfUndefined), U8(69), //
3940 B(JumpIfNull), U8(67), //
3941 B(ToObject), //
3942 B(Star), R(1), //
3943 B(CallRuntime), U16(Runtime::kGetPropertyNamesFast), R(1), U8(1), //
3944 B(ForInPrepare), R(1), //
3945 B(JumpIfUndefined), U8(55), //
3946 B(Star), R(2), //
3947 B(LdaZero), //
3948 B(Star), R(1), //
3949 B(ForInDone), R(2), //
3950 B(JumpIfTrue), U8(46), //
3951 B(ForInNext), R(2), R(1), //
3952 B(JumpIfUndefined), U8(36), //
3953 B(Star), R(3), //
3954 B(StoreICSloppy), R(0), U8(2), U8(vector->GetIndex(slot4)), //
3955 B(LoadICSloppy), R(0), U8(2), U8(vector->GetIndex(slot2)), //
3956 B(Star), R(3), //
3957 B(LdaSmi8), U8(10), //
3958 B(TestEqual), R(3), //
3959 B(JumpIfFalse), U8(4), //
3960 B(Jump), U8(16), //
3961 B(LoadICSloppy), R(0), U8(2), U8(vector->GetIndex(slot3)), //
3962 B(Star), R(3), //
3963 B(LdaSmi8), U8(20), //
3964 B(TestEqual), R(3), //
3965 B(JumpIfFalse), U8(4), //
3966 B(Jump), U8(7), //
3967 B(Ldar), R(1), //
3968 B(Inc), //
3969 B(Jump), U8(-48), //
3970 B(LdaUndefined), //
3971 B(Return), //
3972 },
3973 3,
3974 {InstanceType::FIXED_ARRAY_TYPE, InstanceType::FIXED_ARRAY_TYPE,
3975 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}},
3976 {"var x = [ 10, 11, 12 ] ;\n"
3977 "for (x[0] in [1,2,3]) { return x[3]; }",
3978 5 * kPointerSize,
3979 1,
3980 66,
3981 {
3982 B(LdaConstant), U8(0), //
3983 B(CreateArrayLiteral), U8(0), U8(simple_flags), //
3984 B(Star), R(0), //
3985 B(LdaConstant), U8(1), //
3986 B(CreateArrayLiteral), U8(1), U8(simple_flags), //
3987 B(JumpIfUndefined), U8(52), //
3988 B(JumpIfNull), U8(50), //
3989 B(ToObject), //
3990 B(Star), R(1), //
3991 B(CallRuntime), U16(Runtime::kGetPropertyNamesFast), R(1), U8(1), //
3992 B(ForInPrepare), R(1), //
3993 B(JumpIfUndefined), U8(38), //
3994 B(Star), R(2), //
3995 B(LdaZero), //
3996 B(Star), R(1), //
3997 B(ForInDone), R(2), //
3998 B(JumpIfTrue), U8(29), //
3999 B(ForInNext), R(2), R(1), //
4000 B(JumpIfUndefined), U8(19), //
4001 B(Star), R(3), //
4002 B(LdaZero), //
4003 B(Star), R(4), //
4004 B(Ldar), R(3), //
4005 B(KeyedStoreICSloppy), R(0), R(4), U8(vector->GetIndex(slot3)), //
4006 B(LdaSmi8), U8(3), //
4007 B(KeyedLoadICSloppy), R(0), U8(vector->GetIndex(slot2)), //
4008 B(Return), //
4009 B(Ldar), R(1), //
4010 B(Inc), //
4011 B(Jump), U8(-31), //
4012 B(LdaUndefined), //
4013 B(Return), //
4014 },
4015 2,
4016 {InstanceType::FIXED_ARRAY_TYPE, InstanceType::FIXED_ARRAY_TYPE}},
4017 };
4018
4019 for (size_t i = 0; i < arraysize(snippets); i++) {
4020 Handle<BytecodeArray> bytecode_array =
4021 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet);
4022 CheckBytecodeArrayEqual(snippets[i], bytecode_array);
4023 }
4024 }
4025
4026
3820 TEST(Conditional) { 4027 TEST(Conditional) {
3821 InitializedHandleScope handle_scope; 4028 InitializedHandleScope handle_scope;
3822 BytecodeGeneratorHelper helper; 4029 BytecodeGeneratorHelper helper;
3823 4030
3824 ExpectedSnippet<int> snippets[] = { 4031 ExpectedSnippet<int> snippets[] = {
3825 {"return 1 ? 2 : 3;", 4032 {"return 1 ? 2 : 3;",
3826 0, 4033 0,
3827 1, 4034 1,
3828 12, 4035 12,
3829 { 4036 {
(...skipping 28 matching lines...) Expand all
3858 for (size_t i = 0; i < arraysize(snippets); i++) { 4065 for (size_t i = 0; i < arraysize(snippets); i++) {
3859 Handle<BytecodeArray> bytecode_array = 4066 Handle<BytecodeArray> bytecode_array =
3860 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); 4067 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet);
3861 CheckBytecodeArrayEqual(snippets[i], bytecode_array); 4068 CheckBytecodeArrayEqual(snippets[i], bytecode_array);
3862 } 4069 }
3863 } 4070 }
3864 4071
3865 } // namespace interpreter 4072 } // namespace interpreter
3866 } // namespace internal 4073 } // namespace internal
3867 } // namespace v8 4074 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698