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

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

Issue 1386313005: [Interpreter] Adds Object literal support. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@int_literal_2
Patch Set: Created 5 years, 2 months 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 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698