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/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 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
88 | 88 |
89 // Structure for containing expected bytecode snippets. | 89 // Structure for containing expected bytecode snippets. |
90 template<typename T> | 90 template<typename T> |
91 struct ExpectedSnippet { | 91 struct ExpectedSnippet { |
92 const char* code_snippet; | 92 const char* code_snippet; |
93 int frame_size; | 93 int frame_size; |
94 int parameter_count; | 94 int parameter_count; |
95 int bytecode_length; | 95 int bytecode_length; |
96 const uint8_t bytecode[512]; | 96 const uint8_t bytecode[512]; |
97 int constant_count; | 97 int constant_count; |
98 T constants[4]; | 98 T constants[6]; |
99 }; | 99 }; |
100 | 100 |
101 | 101 |
102 static void CheckConstant(int expected, Object* actual) { | 102 static void CheckConstant(int expected, Object* actual) { |
103 CHECK_EQ(expected, Smi::cast(actual)->value()); | 103 CHECK_EQ(expected, Smi::cast(actual)->value()); |
104 } | 104 } |
105 | 105 |
106 | 106 |
107 static void CheckConstant(double expected, Object* actual) { | 107 static void CheckConstant(double expected, Object* actual) { |
108 CHECK_EQ(expected, HeapNumber::cast(actual)->value()); | 108 CHECK_EQ(expected, HeapNumber::cast(actual)->value()); |
(...skipping 984 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1093 B(ToBoolean), // | 1093 B(ToBoolean), // |
1094 B(JumpIfFalse), U8(7), // | 1094 B(JumpIfFalse), U8(7), // |
1095 B(LdaSmi8), U8(1), // | 1095 B(LdaSmi8), U8(1), // |
1096 B(Return), // | 1096 B(Return), // |
1097 B(Jump), U8(5), // | 1097 B(Jump), U8(5), // |
1098 B(LdaSmi8), U8(-1), // | 1098 B(LdaSmi8), U8(-1), // |
1099 B(Return), // | 1099 B(Return), // |
1100 B(LdaUndefined), // | 1100 B(LdaUndefined), // |
1101 B(Return)}, // | 1101 B(Return)}, // |
1102 0, | 1102 0, |
1103 {unused, unused, unused, unused}}, | 1103 {unused, unused, unused, unused, unused, unused}}, |
1104 {"function f() { if ('lucky') { return 1; } else { return -1; } } f();", | 1104 {"function f() { if ('lucky') { return 1; } else { return -1; } } f();", |
1105 0, | 1105 0, |
1106 1, | 1106 1, |
1107 15, | 1107 15, |
1108 {B(LdaConstant), U8(0), // | 1108 {B(LdaConstant), U8(0), // |
1109 B(ToBoolean), // | 1109 B(ToBoolean), // |
1110 B(JumpIfFalse), U8(7), // | 1110 B(JumpIfFalse), U8(7), // |
1111 B(LdaSmi8), U8(1), // | 1111 B(LdaSmi8), U8(1), // |
1112 B(Return), // | 1112 B(Return), // |
1113 B(Jump), U8(5), // | 1113 B(Jump), U8(5), // |
1114 B(LdaSmi8), U8(-1), // | 1114 B(LdaSmi8), U8(-1), // |
1115 B(Return), // | 1115 B(Return), // |
1116 B(LdaUndefined), // | 1116 B(LdaUndefined), // |
1117 B(Return)}, // | 1117 B(Return)}, // |
1118 1, | 1118 1, |
1119 {helper.factory()->NewStringFromStaticChars("lucky"), unused, unused, | 1119 {helper.factory()->NewStringFromStaticChars("lucky"), unused, unused, |
1120 unused}}, | 1120 unused, unused, unused}}, |
1121 {"function f() { if (false) { return 1; } else { return -1; } } f();", | 1121 {"function f() { if (false) { return 1; } else { return -1; } } f();", |
1122 0, | 1122 0, |
1123 1, | 1123 1, |
1124 13, | 1124 13, |
1125 {B(LdaFalse), // | 1125 {B(LdaFalse), // |
1126 B(JumpIfFalse), U8(7), // | 1126 B(JumpIfFalse), U8(7), // |
1127 B(LdaSmi8), U8(1), // | 1127 B(LdaSmi8), U8(1), // |
1128 B(Return), // | 1128 B(Return), // |
1129 B(Jump), U8(5), // | 1129 B(Jump), U8(5), // |
1130 B(LdaSmi8), U8(-1), // | 1130 B(LdaSmi8), U8(-1), // |
1131 B(Return), // | 1131 B(Return), // |
1132 B(LdaUndefined), // | 1132 B(LdaUndefined), // |
1133 B(Return)}, // | 1133 B(Return)}, // |
1134 0, | 1134 0, |
1135 {unused, unused, unused, unused}}, | 1135 {unused, unused, unused, unused, unused, unused}}, |
1136 {"function f(a) { if (a <= 0) { return 200; } else { return -200; } }" | 1136 {"function f(a) { if (a <= 0) { return 200; } else { return -200; } }" |
1137 "f(99);", | 1137 "f(99);", |
1138 kPointerSize, | 1138 kPointerSize, |
1139 2, | 1139 2, |
1140 19, | 1140 19, |
1141 {B(Ldar), R(helper.kLastParamIndex), // | 1141 {B(Ldar), R(helper.kLastParamIndex), // |
1142 B(Star), R(0), // | 1142 B(Star), R(0), // |
1143 B(LdaZero), // | 1143 B(LdaZero), // |
1144 B(TestLessThanOrEqual), R(0), // | 1144 B(TestLessThanOrEqual), R(0), // |
1145 B(JumpIfFalse), U8(7), // | 1145 B(JumpIfFalse), U8(7), // |
1146 B(LdaConstant), U8(0), // | 1146 B(LdaConstant), U8(0), // |
1147 B(Return), // | 1147 B(Return), // |
1148 B(Jump), U8(5), // | 1148 B(Jump), U8(5), // |
1149 B(LdaConstant), U8(1), // | 1149 B(LdaConstant), U8(1), // |
1150 B(Return), // | 1150 B(Return), // |
1151 B(LdaUndefined), // | 1151 B(LdaUndefined), // |
1152 B(Return)}, // | 1152 B(Return)}, // |
1153 2, | 1153 2, |
1154 {helper.factory()->NewNumberFromInt(200), | 1154 {helper.factory()->NewNumberFromInt(200), |
1155 helper.factory()->NewNumberFromInt(-200), unused, unused}}, | 1155 helper.factory()->NewNumberFromInt(-200), unused, unused, unused, |
| 1156 unused}}, |
1156 {"function f(a, b) { if (a in b) { return 200; } }" | 1157 {"function f(a, b) { if (a in b) { return 200; } }" |
1157 "f('prop', { prop: 'yes'});", | 1158 "f('prop', { prop: 'yes'});", |
1158 kPointerSize, | 1159 kPointerSize, |
1159 3, | 1160 3, |
1160 15, | 1161 15, |
1161 {B(Ldar), R(helper.kLastParamIndex - 1), // | 1162 {B(Ldar), R(helper.kLastParamIndex - 1), // |
1162 B(Star), R(0), // | 1163 B(Star), R(0), // |
1163 B(Ldar), R(helper.kLastParamIndex), // | 1164 B(Ldar), R(helper.kLastParamIndex), // |
1164 B(TestIn), R(0), // | 1165 B(TestIn), R(0), // |
1165 B(JumpIfFalse), U8(5), // | 1166 B(JumpIfFalse), U8(5), // |
1166 B(LdaConstant), U8(0), // | 1167 B(LdaConstant), U8(0), // |
1167 B(Return), // | 1168 B(Return), // |
1168 B(LdaUndefined), // | 1169 B(LdaUndefined), // |
1169 B(Return)}, // | 1170 B(Return)}, // |
1170 1, | 1171 1, |
1171 {helper.factory()->NewNumberFromInt(200), unused, unused, unused}}, | 1172 {helper.factory()->NewNumberFromInt(200), unused, unused, unused, unused, |
| 1173 unused}}, |
1172 {"function f(z) { var a = 0; var b = 0; if (a === 0.01) { " | 1174 {"function f(z) { var a = 0; var b = 0; if (a === 0.01) { " |
1173 #define X "b = a; a = b; " | 1175 #define X "b = a; a = b; " |
1174 X X X X X X X X X X X X X X X X X X X X X X X X | 1176 X X X X X X X X X X X X X X X X X X X X X X X X |
1175 #undef X | 1177 #undef X |
1176 " return 200; } else { return -200; } } f(0.001)", | 1178 " return 200; } else { return -200; } } f(0.001)", |
1177 3 * kPointerSize, | 1179 3 * kPointerSize, |
1178 2, | 1180 2, |
1179 218, | 1181 218, |
1180 {B(LdaZero), // | 1182 {B(LdaZero), // |
1181 B(Star), R(0), // | 1183 B(Star), R(0), // |
(...skipping 11 matching lines...) Expand all Loading... |
1193 B(Return), // | 1195 B(Return), // |
1194 B(Jump), U8(5), // | 1196 B(Jump), U8(5), // |
1195 B(LdaConstant), U8(3), // | 1197 B(LdaConstant), U8(3), // |
1196 B(Return), // | 1198 B(Return), // |
1197 B(LdaUndefined), // | 1199 B(LdaUndefined), // |
1198 B(Return)}, // | 1200 B(Return)}, // |
1199 4, | 1201 4, |
1200 {helper.factory()->NewHeapNumber(0.01), | 1202 {helper.factory()->NewHeapNumber(0.01), |
1201 helper.factory()->NewNumberFromInt(200), | 1203 helper.factory()->NewNumberFromInt(200), |
1202 helper.factory()->NewNumberFromInt(199), | 1204 helper.factory()->NewNumberFromInt(199), |
1203 helper.factory()->NewNumberFromInt(-200)}}, | 1205 helper.factory()->NewNumberFromInt(-200), |
| 1206 unused, unused}}, |
1204 {"function f(a, b) {\n" | 1207 {"function f(a, b) {\n" |
1205 " if (a == b) { return 1; }\n" | 1208 " if (a == b) { return 1; }\n" |
1206 " if (a === b) { return 1; }\n" | 1209 " if (a === b) { return 1; }\n" |
1207 " if (a < b) { return 1; }\n" | 1210 " if (a < b) { return 1; }\n" |
1208 " if (a > b) { return 1; }\n" | 1211 " if (a > b) { return 1; }\n" |
1209 " if (a <= b) { return 1; }\n" | 1212 " if (a <= b) { return 1; }\n" |
1210 " if (a >= b) { return 1; }\n" | 1213 " if (a >= b) { return 1; }\n" |
1211 " if (a in b) { return 1; }\n" | 1214 " if (a in b) { return 1; }\n" |
1212 " if (a instanceof b) { return 1; }\n" | 1215 " if (a instanceof b) { return 1; }\n" |
1213 " /* if (a != b) { return 1; } */" // TODO(oth) Ast visitor yields | 1216 " /* if (a != b) { return 1; } */" // TODO(oth) Ast visitor yields |
(...skipping 17 matching lines...) Expand all Loading... |
1231 IF_CONDITION_RETURN(TestLessThan) // | 1234 IF_CONDITION_RETURN(TestLessThan) // |
1232 IF_CONDITION_RETURN(TestGreaterThan) // | 1235 IF_CONDITION_RETURN(TestGreaterThan) // |
1233 IF_CONDITION_RETURN(TestLessThanOrEqual) // | 1236 IF_CONDITION_RETURN(TestLessThanOrEqual) // |
1234 IF_CONDITION_RETURN(TestGreaterThanOrEqual) // | 1237 IF_CONDITION_RETURN(TestGreaterThanOrEqual) // |
1235 IF_CONDITION_RETURN(TestIn) // | 1238 IF_CONDITION_RETURN(TestIn) // |
1236 IF_CONDITION_RETURN(TestInstanceOf) // | 1239 IF_CONDITION_RETURN(TestInstanceOf) // |
1237 #undef IF_CONDITION_RETURN | 1240 #undef IF_CONDITION_RETURN |
1238 B(LdaZero), // | 1241 B(LdaZero), // |
1239 B(Return)}, // | 1242 B(Return)}, // |
1240 0, | 1243 0, |
1241 {unused, unused, unused, unused}}, | 1244 {unused, unused, unused, unused, unused, unused}}, |
1242 }; | 1245 }; |
1243 | 1246 |
1244 for (size_t i = 0; i < arraysize(snippets); i++) { | 1247 for (size_t i = 0; i < arraysize(snippets); i++) { |
1245 Handle<BytecodeArray> bytecode_array = | 1248 Handle<BytecodeArray> bytecode_array = |
1246 helper.MakeBytecode(snippets[i].code_snippet, helper.kFunctionName); | 1249 helper.MakeBytecode(snippets[i].code_snippet, helper.kFunctionName); |
1247 CheckBytecodeArrayEqual(snippets[i], bytecode_array); | 1250 CheckBytecodeArrayEqual(snippets[i], bytecode_array); |
1248 } | 1251 } |
1249 } | 1252 } |
1250 | 1253 |
1251 | 1254 |
(...skipping 654 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1906 InstanceType::FIXED_ARRAY_TYPE}}, | 1909 InstanceType::FIXED_ARRAY_TYPE}}, |
1907 }; | 1910 }; |
1908 | 1911 |
1909 for (size_t i = 0; i < arraysize(snippets); i++) { | 1912 for (size_t i = 0; i < arraysize(snippets); i++) { |
1910 Handle<BytecodeArray> bytecode_array = | 1913 Handle<BytecodeArray> bytecode_array = |
1911 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); | 1914 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); |
1912 CheckBytecodeArrayEqual(snippets[i], bytecode_array); | 1915 CheckBytecodeArrayEqual(snippets[i], bytecode_array); |
1913 } | 1916 } |
1914 } | 1917 } |
1915 | 1918 |
| 1919 |
| 1920 TEST(ObjectLiterals) { |
| 1921 InitializedHandleScope handle_scope; |
| 1922 BytecodeGeneratorHelper helper; |
| 1923 |
| 1924 int simple_flags = ObjectLiteral::kFastElements | |
| 1925 ObjectLiteral::kShallowProperties | |
| 1926 ObjectLiteral::kDisableMementos; |
| 1927 int deep_elements_flags = |
| 1928 ObjectLiteral::kFastElements | ObjectLiteral::kDisableMementos; |
| 1929 ExpectedSnippet<InstanceType> snippets[] = { |
| 1930 {"return { };", |
| 1931 0, |
| 1932 1, |
| 1933 6, |
| 1934 { |
| 1935 B(LdaConstant), U8(0), // |
| 1936 B(CreateObjectLiteral), U8(0), U8(simple_flags), // |
| 1937 B(Return) // |
| 1938 }, |
| 1939 1, |
| 1940 {InstanceType::FIXED_ARRAY_TYPE}}, |
| 1941 {"return { name: 'string', val: 9.2 };", |
| 1942 0, |
| 1943 1, |
| 1944 6, |
| 1945 { |
| 1946 B(LdaConstant), U8(0), // |
| 1947 B(CreateObjectLiteral), U8(0), U8(deep_elements_flags), // |
| 1948 B(Return) // |
| 1949 }, |
| 1950 1, |
| 1951 {InstanceType::FIXED_ARRAY_TYPE}}, |
| 1952 {"var a = 1; return { name: 'string', val: a };", |
| 1953 3 * kPointerSize, |
| 1954 1, |
| 1955 24, |
| 1956 { |
| 1957 B(LdaSmi8), U8(1), // |
| 1958 B(Star), R(0), // |
| 1959 B(LdaConstant), U8(0), // |
| 1960 B(CreateObjectLiteral), U8(0), U8(deep_elements_flags), // |
| 1961 B(Star), R(1), // |
| 1962 B(LdaConstant), U8(1), // |
| 1963 B(Star), R(2), // |
| 1964 B(Ldar), R(0), // |
| 1965 B(StoreICSloppy), R(1), R(2), U8(3), // |
| 1966 B(Ldar), R(1), // |
| 1967 B(Return), // |
| 1968 }, |
| 1969 2, |
| 1970 {InstanceType::FIXED_ARRAY_TYPE, |
| 1971 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}}, |
| 1972 {"var a = 1; return { val: a, val: a + 1 };", |
| 1973 4 * kPointerSize, |
| 1974 1, |
| 1975 32, |
| 1976 { |
| 1977 B(LdaSmi8), U8(1), // |
| 1978 B(Star), R(0), // |
| 1979 B(LdaConstant), U8(0), // |
| 1980 B(CreateObjectLiteral), U8(0), U8(deep_elements_flags), // |
| 1981 B(Star), R(1), // |
| 1982 B(Ldar), R(0), // |
| 1983 B(LdaConstant), U8(1), // |
| 1984 B(Star), R(2), // |
| 1985 B(Ldar), R(0), // |
| 1986 B(Star), R(3), // |
| 1987 B(LdaSmi8), U8(1), // |
| 1988 B(Add), R(3), // |
| 1989 B(StoreICSloppy), R(1), R(2), U8(3), // |
| 1990 B(Ldar), R(1), // |
| 1991 B(Return), // |
| 1992 }, |
| 1993 2, |
| 1994 {InstanceType::FIXED_ARRAY_TYPE, |
| 1995 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}}, |
| 1996 {"return { func: function() { } };", |
| 1997 2 * kPointerSize, |
| 1998 1, |
| 1999 22, |
| 2000 { |
| 2001 B(LdaConstant), U8(0), // |
| 2002 B(CreateObjectLiteral), U8(0), U8(deep_elements_flags), // |
| 2003 B(Star), R(0), // |
| 2004 B(LdaConstant), U8(1), // |
| 2005 B(Star), R(1), // |
| 2006 B(LdaConstant), U8(2), // |
| 2007 B(CreateClosure), U8(0), // |
| 2008 B(StoreICSloppy), R(0), R(1), U8(3), // |
| 2009 B(Ldar), R(0), // |
| 2010 B(Return), // |
| 2011 }, |
| 2012 3, |
| 2013 {InstanceType::FIXED_ARRAY_TYPE, |
| 2014 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, |
| 2015 InstanceType::SHARED_FUNCTION_INFO_TYPE}}, |
| 2016 {"return { func(a) { return a; } };", |
| 2017 2 * kPointerSize, |
| 2018 1, |
| 2019 22, |
| 2020 { |
| 2021 B(LdaConstant), U8(0), // |
| 2022 B(CreateObjectLiteral), U8(0), U8(deep_elements_flags), // |
| 2023 B(Star), R(0), // |
| 2024 B(LdaConstant), U8(1), // |
| 2025 B(Star), R(1), // |
| 2026 B(LdaConstant), U8(2), // |
| 2027 B(CreateClosure), U8(0), // |
| 2028 B(StoreICSloppy), R(0), R(1), U8(3), // |
| 2029 B(Ldar), R(0), // |
| 2030 B(Return), // |
| 2031 }, |
| 2032 3, |
| 2033 {InstanceType::FIXED_ARRAY_TYPE, |
| 2034 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, |
| 2035 InstanceType::SHARED_FUNCTION_INFO_TYPE}}, |
| 2036 {"return { get a() { return 2; } };", |
| 2037 5 * kPointerSize, |
| 2038 1, |
| 2039 31, |
| 2040 { |
| 2041 B(LdaConstant), U8(0), // |
| 2042 B(CreateObjectLiteral), U8(0), U8(deep_elements_flags), // |
| 2043 B(Star), R(0), // |
| 2044 B(LdaConstant), U8(1), // |
| 2045 B(Star), R(1), // |
| 2046 B(LdaConstant), U8(2), // |
| 2047 B(CreateClosure), U8(0), // |
| 2048 B(Star), R(2), // |
| 2049 B(LdaNull), // |
| 2050 B(Star), R(3), // |
| 2051 B(LdaZero), // |
| 2052 B(Star), R(4), // |
| 2053 B(CallRuntime), U16(Runtime::kDefineAccessorPropertyUnchecked), // |
| 2054 R(0), U8(5), // |
| 2055 B(Ldar), R(0), // |
| 2056 B(Return), // |
| 2057 }, |
| 2058 3, |
| 2059 {InstanceType::FIXED_ARRAY_TYPE, |
| 2060 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, |
| 2061 InstanceType::SHARED_FUNCTION_INFO_TYPE}}, |
| 2062 {"return { get a() { return this.x; }, set a(val) { this.x = val } };", |
| 2063 5 * kPointerSize, |
| 2064 1, |
| 2065 34, |
| 2066 { |
| 2067 B(LdaConstant), U8(0), // |
| 2068 B(CreateObjectLiteral), U8(0), U8(deep_elements_flags), // |
| 2069 B(Star), R(0), // |
| 2070 B(LdaConstant), U8(1), // |
| 2071 B(Star), R(1), // |
| 2072 B(LdaConstant), U8(2), // |
| 2073 B(CreateClosure), U8(0), // |
| 2074 B(Star), R(2), // |
| 2075 B(LdaConstant), U8(3), // |
| 2076 B(CreateClosure), U8(0), // |
| 2077 B(Star), R(3), // |
| 2078 B(LdaZero), // |
| 2079 B(Star), R(4), // |
| 2080 B(CallRuntime), U16(Runtime::kDefineAccessorPropertyUnchecked), // |
| 2081 R(0), U8(5), // |
| 2082 B(Ldar), R(0), // |
| 2083 B(Return), // |
| 2084 }, |
| 2085 4, |
| 2086 {InstanceType::FIXED_ARRAY_TYPE, |
| 2087 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, |
| 2088 InstanceType::SHARED_FUNCTION_INFO_TYPE, |
| 2089 InstanceType::SHARED_FUNCTION_INFO_TYPE}}, |
| 2090 {"return { get a() { return this.x; }, set b(val) { this.y = val } };", |
| 2091 5 * kPointerSize, |
| 2092 1, |
| 2093 52, |
| 2094 { |
| 2095 B(LdaConstant), U8(0), // |
| 2096 B(CreateObjectLiteral), U8(0), U8(deep_elements_flags), // |
| 2097 B(Star), R(0), // |
| 2098 B(LdaConstant), U8(1), // |
| 2099 B(Star), R(1), // |
| 2100 B(LdaConstant), U8(2), // |
| 2101 B(CreateClosure), U8(0), // |
| 2102 B(Star), R(2), // |
| 2103 B(LdaNull), // |
| 2104 B(Star), R(3), // |
| 2105 B(LdaZero), // |
| 2106 B(Star), R(4), // |
| 2107 B(CallRuntime), U16(Runtime::kDefineAccessorPropertyUnchecked), // |
| 2108 R(0), U8(5), // |
| 2109 B(LdaConstant), U8(3), // |
| 2110 B(Star), R(1), // |
| 2111 B(LdaNull), // |
| 2112 B(Star), R(2), // |
| 2113 B(LdaConstant), U8(4), // |
| 2114 B(CreateClosure), U8(0), // |
| 2115 B(Star), R(3), // |
| 2116 B(LdaZero), // |
| 2117 B(Star), R(4), // |
| 2118 B(CallRuntime), U16(Runtime::kDefineAccessorPropertyUnchecked), // |
| 2119 R(0), U8(5), // |
| 2120 B(Ldar), R(0), // |
| 2121 B(Return), // |
| 2122 }, |
| 2123 5, |
| 2124 {InstanceType::FIXED_ARRAY_TYPE, |
| 2125 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, |
| 2126 InstanceType::SHARED_FUNCTION_INFO_TYPE, |
| 2127 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, |
| 2128 InstanceType::SHARED_FUNCTION_INFO_TYPE}}, |
| 2129 {"var a = 1; return { 1: a };", |
| 2130 5 * kPointerSize, |
| 2131 1, |
| 2132 30, |
| 2133 { |
| 2134 B(LdaSmi8), U8(1), // |
| 2135 B(Star), R(0), // |
| 2136 B(LdaConstant), U8(0), // |
| 2137 B(CreateObjectLiteral), U8(0), U8(deep_elements_flags), // |
| 2138 B(Star), R(1), // |
| 2139 B(LdaSmi8), U8(1), // |
| 2140 B(Star), R(2), // |
| 2141 B(Ldar), R(0), // |
| 2142 B(Star), R(3), // |
| 2143 B(LdaZero), // |
| 2144 B(Star), R(4), // |
| 2145 B(CallRuntime), U16(Runtime::kSetProperty), R(1), U8(4), // |
| 2146 B(Ldar), R(1), // |
| 2147 B(Return), // |
| 2148 }, |
| 2149 1, |
| 2150 {InstanceType::FIXED_ARRAY_TYPE}}, |
| 2151 {"return { __proto__: null }", |
| 2152 2 * kPointerSize, |
| 2153 1, |
| 2154 18, |
| 2155 { |
| 2156 B(LdaConstant), U8(0), // |
| 2157 B(CreateObjectLiteral), U8(0), U8(simple_flags), // |
| 2158 B(Star), R(0), // |
| 2159 B(LdaNull), B(Star), R(1), // |
| 2160 B(CallRuntime), U16(Runtime::kInternalSetPrototype), R(0), U8(2), // |
| 2161 B(Ldar), R(0), // |
| 2162 B(Return), // |
| 2163 }, |
| 2164 1, |
| 2165 {InstanceType::FIXED_ARRAY_TYPE}}, |
| 2166 {"var a = 'test'; return { [a]: 1 }", |
| 2167 5 * kPointerSize, |
| 2168 1, |
| 2169 31, |
| 2170 { |
| 2171 B(LdaConstant), U8(0), // |
| 2172 B(Star), R(0), // |
| 2173 B(LdaConstant), U8(1), // |
| 2174 B(CreateObjectLiteral), U8(0), U8(simple_flags), // |
| 2175 B(Star), R(1), // |
| 2176 B(Ldar), R(0), // |
| 2177 B(ToName), // |
| 2178 B(Star), R(2), // |
| 2179 B(LdaSmi8), U8(1), // |
| 2180 B(Star), R(3), // |
| 2181 B(LdaZero), // |
| 2182 B(Star), R(4), // |
| 2183 B(CallRuntime), U16(Runtime::kDefineDataPropertyUnchecked), R(1), // |
| 2184 U8(4), // |
| 2185 B(Ldar), R(1), // |
| 2186 B(Return), // |
| 2187 }, |
| 2188 2, |
| 2189 {InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, |
| 2190 InstanceType::FIXED_ARRAY_TYPE}}, |
| 2191 {"var a = 'test'; return { val: a, [a]: 1 }", |
| 2192 5 * kPointerSize, |
| 2193 1, |
| 2194 41, |
| 2195 { |
| 2196 B(LdaConstant), U8(0), // |
| 2197 B(Star), R(0), // |
| 2198 B(LdaConstant), U8(1), // |
| 2199 B(CreateObjectLiteral), U8(0), U8(deep_elements_flags), // |
| 2200 B(Star), R(1), // |
| 2201 B(LdaConstant), U8(2), // |
| 2202 B(Star), R(2), // |
| 2203 B(Ldar), R(0), // |
| 2204 B(StoreICSloppy), R(1), R(2), U8(3), // |
| 2205 B(Ldar), R(0), // |
| 2206 B(ToName), // |
| 2207 B(Star), R(2), // |
| 2208 B(LdaSmi8), U8(1), // |
| 2209 B(Star), R(3), // |
| 2210 B(LdaZero), // |
| 2211 B(Star), R(4), // |
| 2212 B(CallRuntime), U16(Runtime::kDefineDataPropertyUnchecked), R(1), // |
| 2213 U8(4), // |
| 2214 B(Ldar), R(1), // |
| 2215 B(Return), // |
| 2216 }, |
| 2217 3, |
| 2218 {InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, |
| 2219 InstanceType::FIXED_ARRAY_TYPE, |
| 2220 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}}, |
| 2221 {"var a = 'test'; return { [a]: 1, __proto__: {} }", |
| 2222 5 * kPointerSize, |
| 2223 1, |
| 2224 43, |
| 2225 { |
| 2226 B(LdaConstant), U8(0), // |
| 2227 B(Star), R(0), // |
| 2228 B(LdaConstant), U8(1), // |
| 2229 B(CreateObjectLiteral), U8(1), U8(simple_flags), // |
| 2230 B(Star), R(1), // |
| 2231 B(Ldar), R(0), // |
| 2232 B(ToName), // |
| 2233 B(Star), R(2), // |
| 2234 B(LdaSmi8), U8(1), // |
| 2235 B(Star), R(3), // |
| 2236 B(LdaZero), // |
| 2237 B(Star), R(4), // |
| 2238 B(CallRuntime), U16(Runtime::kDefineDataPropertyUnchecked), R(1), // |
| 2239 U8(4), // |
| 2240 B(LdaConstant), U8(1), // |
| 2241 B(CreateObjectLiteral), U8(0), U8(13), // |
| 2242 B(Star), R(2), // |
| 2243 B(CallRuntime), U16(Runtime::kInternalSetPrototype), R(1), U8(2), // |
| 2244 B(Ldar), R(1), // |
| 2245 B(Return), // |
| 2246 }, |
| 2247 2, |
| 2248 {InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, |
| 2249 InstanceType::FIXED_ARRAY_TYPE}}, |
| 2250 {"var n = 'name'; return { [n]: 'val', get a() { }, set a(b) {} };", |
| 2251 5 * kPointerSize, |
| 2252 1, |
| 2253 69, |
| 2254 { |
| 2255 B(LdaConstant), U8(0), // |
| 2256 B(Star), R(0), // |
| 2257 B(LdaConstant), U8(1), // |
| 2258 B(CreateObjectLiteral), U8(0), U8(simple_flags), // |
| 2259 B(Star), R(1), // |
| 2260 B(Ldar), R(0), // |
| 2261 B(ToName), // |
| 2262 B(Star), R(2), // |
| 2263 B(LdaConstant), U8(2), // |
| 2264 B(Star), R(3), // |
| 2265 B(LdaZero), // |
| 2266 B(Star), R(4), // |
| 2267 B(CallRuntime), U16(Runtime::kDefineDataPropertyUnchecked), R(1), // |
| 2268 U8(4), // |
| 2269 B(LdaConstant), U8(3), // |
| 2270 B(ToName), // |
| 2271 B(Star), R(2), // |
| 2272 B(LdaConstant), U8(4), // |
| 2273 B(CreateClosure), U8(0), // |
| 2274 B(Star), R(3), // |
| 2275 B(LdaZero), // |
| 2276 B(Star), R(4), // |
| 2277 B(CallRuntime), U16(Runtime::kDefineGetterPropertyUnchecked), // |
| 2278 R(1), U8(4), // |
| 2279 B(LdaConstant), U8(3), // |
| 2280 B(ToName), // |
| 2281 B(Star), R(2), // |
| 2282 B(LdaConstant), U8(5), // |
| 2283 B(CreateClosure), U8(0), // |
| 2284 B(Star), R(3), // |
| 2285 B(LdaZero), // |
| 2286 B(Star), R(4), // |
| 2287 B(CallRuntime), U16(Runtime::kDefineSetterPropertyUnchecked), // |
| 2288 R(1), U8(4), // |
| 2289 B(Ldar), R(1), // |
| 2290 B(Return), // |
| 2291 }, |
| 2292 6, |
| 2293 {InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, |
| 2294 InstanceType::FIXED_ARRAY_TYPE, |
| 2295 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, |
| 2296 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, |
| 2297 InstanceType::SHARED_FUNCTION_INFO_TYPE, |
| 2298 InstanceType::SHARED_FUNCTION_INFO_TYPE}}, |
| 2299 }; |
| 2300 |
| 2301 for (size_t i = 0; i < arraysize(snippets); i++) { |
| 2302 Handle<BytecodeArray> bytecode_array = |
| 2303 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); |
| 2304 CheckBytecodeArrayEqual(snippets[i], bytecode_array); |
| 2305 } |
| 2306 } |
| 2307 |
| 2308 |
| 2309 TEST(TopLevelObjectLiterals) { |
| 2310 InitializedHandleScope handle_scope; |
| 2311 BytecodeGeneratorHelper helper; |
| 2312 |
| 2313 int has_function_flags = ObjectLiteral::kFastElements | |
| 2314 ObjectLiteral::kHasFunction | |
| 2315 ObjectLiteral::kDisableMementos; |
| 2316 ExpectedSnippet<InstanceType> snippets[] = { |
| 2317 {"var a = { func: function() { } };", |
| 2318 7 * kPointerSize, |
| 2319 1, |
| 2320 69, |
| 2321 { |
| 2322 B(Ldar), R(Register::function_closure().index()), // |
| 2323 B(Star), R(2), // |
| 2324 B(LdaConstant), U8(0), // |
| 2325 B(Star), R(3), // |
| 2326 B(CallRuntime), U16(Runtime::kNewScriptContext), R(2), U8(2), // |
| 2327 B(PushContext), R(1), // |
| 2328 B(LdaConstant), U8(1), // |
| 2329 B(Star), R(2), // |
| 2330 B(LdaZero), // |
| 2331 B(Star), R(3), // |
| 2332 B(CallRuntime), U16(Runtime::kDeclareGlobals), R(2), U8(2), // |
| 2333 B(LdaConstant), U8(2), // |
| 2334 B(Star), R(2), // |
| 2335 B(LdaZero), // |
| 2336 B(Star), R(3), // |
| 2337 B(LdaConstant), U8(3), // |
| 2338 B(CreateObjectLiteral), U8(0), U8(has_function_flags), // |
| 2339 B(Star), R(5), // |
| 2340 B(LdaConstant), U8(4), // |
| 2341 B(Star), R(6), // |
| 2342 B(LdaConstant), U8(5), // |
| 2343 B(CreateClosure), U8(1), // |
| 2344 B(StoreICSloppy), R(5), R(6), U8(3), // |
| 2345 B(CallRuntime), U16(Runtime::kToFastProperties), R(5), U8(1), // |
| 2346 B(Ldar), R(5), // |
| 2347 B(Star), R(4), // |
| 2348 B(CallRuntime), U16(Runtime::kInitializeVarGlobal), R(2), U8(3), // |
| 2349 B(LdaUndefined), // |
| 2350 B(Return), // |
| 2351 }, |
| 2352 6, |
| 2353 {InstanceType::FIXED_ARRAY_TYPE, |
| 2354 InstanceType::FIXED_ARRAY_TYPE, |
| 2355 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, |
| 2356 InstanceType::FIXED_ARRAY_TYPE, |
| 2357 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, |
| 2358 InstanceType::SHARED_FUNCTION_INFO_TYPE}}, |
| 2359 }; |
| 2360 |
| 2361 for (size_t i = 0; i < arraysize(snippets); i++) { |
| 2362 Handle<BytecodeArray> bytecode_array = |
| 2363 helper.MakeTopLevelBytecode(snippets[i].code_snippet); |
| 2364 CheckBytecodeArrayEqual(snippets[i], bytecode_array); |
| 2365 } |
| 2366 } |
| 2367 |
1916 } // namespace interpreter | 2368 } // namespace interpreter |
1917 } // namespace internal | 2369 } // namespace internal |
1918 } // namespace v8 | 2370 } // namespace v8 |
OLD | NEW |