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 <fstream> | 5 #include <fstream> |
6 | 6 |
7 #include "src/v8.h" | 7 #include "src/v8.h" |
8 | 8 |
9 #include "src/compiler.h" | 9 #include "src/compiler.h" |
10 #include "src/interpreter/bytecode-array-iterator.h" | 10 #include "src/interpreter/bytecode-array-iterator.h" |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
106 for (const char* snippet : snippet_list) { | 106 for (const char* snippet : snippet_list) { |
107 std::string source_code; | 107 std::string source_code; |
108 if (prologue) source_code += prologue; | 108 if (prologue) source_code += prologue; |
109 source_code += snippet; | 109 source_code += snippet; |
110 if (epilogue) source_code += epilogue; | 110 if (epilogue) source_code += epilogue; |
111 printer.PrintExpectation(actual_stream, source_code); | 111 printer.PrintExpectation(actual_stream, source_code); |
112 } | 112 } |
113 return actual_stream.str(); | 113 return actual_stream.str(); |
114 } | 114 } |
115 | 115 |
| 116 bool CompareTexts(const std::string& generated, const std::string& expected) { |
| 117 std::istringstream generated_stream(generated); |
| 118 std::istringstream expected_stream(expected); |
| 119 std::string generated_line; |
| 120 std::string expected_line; |
| 121 // Line number does not include golden file header. |
| 122 int line_number = 0; |
| 123 |
| 124 do { |
| 125 std::getline(generated_stream, generated_line); |
| 126 std::getline(expected_stream, expected_line); |
| 127 |
| 128 if (!generated_stream.good() && !expected_stream.good()) { |
| 129 return true; |
| 130 } |
| 131 |
| 132 if (!generated_stream.good()) { |
| 133 std::cerr << "Expected has extra lines after line " << line_number |
| 134 << "\n"; |
| 135 std::cerr << " Expected: '" << expected_line << "'\n"; |
| 136 return false; |
| 137 } else if (!expected_stream.good()) { |
| 138 std::cerr << "Generated has extra lines after line " << line_number |
| 139 << "\n"; |
| 140 std::cerr << " Generated: '" << generated_line << "'\n"; |
| 141 return false; |
| 142 } |
| 143 |
| 144 if (generated_line != expected_line) { |
| 145 std::cerr << "Inputs differ at line " << line_number << "\n"; |
| 146 std::cerr << " Generated: '" << generated_line << "'\n"; |
| 147 std::cerr << " Expected: '" << expected_line << "'\n"; |
| 148 return false; |
| 149 } |
| 150 line_number++; |
| 151 } while (true); |
| 152 } |
| 153 |
116 using ConstantPoolType = BytecodeExpectationsPrinter::ConstantPoolType; | 154 using ConstantPoolType = BytecodeExpectationsPrinter::ConstantPoolType; |
117 | 155 |
118 TEST(PrimitiveReturnStatements) { | 156 TEST(PrimitiveReturnStatements) { |
119 InitializedIgnitionHandleScope scope; | 157 InitializedIgnitionHandleScope scope; |
120 BytecodeExpectationsPrinter printer(CcTest::isolate(), | 158 BytecodeExpectationsPrinter printer(CcTest::isolate(), |
121 ConstantPoolType::kNumber); | 159 ConstantPoolType::kNumber); |
122 const char* snippets[] = { | 160 const char* snippets[] = { |
123 "", | 161 "", |
124 | 162 |
125 "return;", | 163 "return;\n", |
126 | 164 |
127 "return null;", | 165 "return null;\n", |
128 | 166 |
129 "return true;", | 167 "return true;\n", |
130 | 168 |
131 "return false;", | 169 "return false;\n", |
132 | 170 |
133 "return 0;", | 171 "return 0;\n", |
134 | 172 |
135 "return +1;", | 173 "return +1;\n", |
136 | 174 |
137 "return -1;", | 175 "return -1;\n", |
138 | 176 |
139 "return +127;", | 177 "return +127;\n", |
140 | 178 |
141 "return -128;", | 179 "return -128;\n", |
142 }; | 180 }; |
143 | 181 |
144 CHECK_EQ(BuildActual(printer, snippets), | 182 CHECK(CompareTexts(BuildActual(printer, snippets), |
145 LoadGolden("PrimitiveReturnStatements.golden")); | 183 LoadGolden("PrimitiveReturnStatements.golden"))); |
146 } | 184 } |
147 | 185 |
148 TEST(PrimitiveExpressions) { | 186 TEST(PrimitiveExpressions) { |
149 InitializedIgnitionHandleScope scope; | 187 InitializedIgnitionHandleScope scope; |
150 BytecodeExpectationsPrinter printer(CcTest::isolate(), | 188 BytecodeExpectationsPrinter printer(CcTest::isolate(), |
151 ConstantPoolType::kNumber); | 189 ConstantPoolType::kNumber); |
152 const char* snippets[] = { | 190 const char* snippets[] = { |
153 "var x = 0; return x;", | 191 "var x = 0; return x;\n", |
154 | 192 |
155 "var x = 0; return x + 3;", | 193 "var x = 0; return x + 3;\n", |
156 | 194 |
157 "var x = 0; return x - 3;", | 195 "var x = 0; return x - 3;\n", |
158 | 196 |
159 "var x = 4; return x * 3;", | 197 "var x = 4; return x * 3;\n", |
160 | 198 |
161 "var x = 4; return x / 3;", | 199 "var x = 4; return x / 3;\n", |
162 | 200 |
163 "var x = 4; return x % 3;", | 201 "var x = 4; return x % 3;\n", |
164 | 202 |
165 "var x = 1; return x | 2;", | 203 "var x = 1; return x | 2;\n", |
166 | 204 |
167 "var x = 1; return x ^ 2;", | 205 "var x = 1; return x ^ 2;\n", |
168 | 206 |
169 "var x = 1; return x & 2;", | 207 "var x = 1; return x & 2;\n", |
170 | 208 |
171 "var x = 10; return x << 3;", | 209 "var x = 10; return x << 3;\n", |
172 | 210 |
173 "var x = 10; return x >> 3;", | 211 "var x = 10; return x >> 3;\n", |
174 | 212 |
175 "var x = 10; return x >>> 3;", | 213 "var x = 10; return x >>> 3;\n", |
176 | 214 |
177 "var x = 0; return (x, 3);", | 215 "var x = 0; return (x, 3);\n", |
178 }; | 216 }; |
179 | 217 |
180 CHECK_EQ(BuildActual(printer, snippets), | 218 CHECK(CompareTexts(BuildActual(printer, snippets), |
181 LoadGolden("PrimitiveExpressions.golden")); | 219 LoadGolden("PrimitiveExpressions.golden"))); |
182 } | 220 } |
183 | 221 |
184 TEST(LogicalExpressions) { | 222 TEST(LogicalExpressions) { |
185 InitializedIgnitionHandleScope scope; | 223 InitializedIgnitionHandleScope scope; |
186 BytecodeExpectationsPrinter printer(CcTest::isolate(), | 224 BytecodeExpectationsPrinter printer(CcTest::isolate(), |
187 ConstantPoolType::kNumber); | 225 ConstantPoolType::kNumber); |
188 const char* snippets[] = { | 226 const char* snippets[] = { |
189 "var x = 0; return x || 3;", | 227 "var x = 0; return x || 3;\n", |
190 | 228 |
191 "var x = 0; return (x == 1) || 3;", | 229 "var x = 0; return (x == 1) || 3;\n", |
192 | 230 |
193 "var x = 0; return x && 3;", | 231 "var x = 0; return x && 3;\n", |
194 | 232 |
195 "var x = 0; return (x == 0) && 3;", | 233 "var x = 0; return (x == 0) && 3;\n", |
196 | 234 |
197 "var x = 0; return x || (1, 2, 3);", | 235 "var x = 0; return x || (1, 2, 3);\n", |
198 | 236 |
199 "var a = 2, b = 3, c = 4; return a || (a, b, a, b, c = 5, 3);", | 237 "var a = 2, b = 3, c = 4; return a || (a, b, a, b, c = 5, 3);\n", |
200 | 238 |
201 "var x = 1; var a = 2, b = 3; return x || (" // | 239 "var x = 1; var a = 2, b = 3; return x || (" // |
202 REPEAT_32("\n a = 1, b = 2, ") // | 240 REPEAT_32("\n a = 1, b = 2, ") // |
203 "3);", | 241 "3);\n", |
204 | 242 |
205 "var x = 0; var a = 2, b = 3; return x && (" // | 243 "var x = 0; var a = 2, b = 3; return x && (" // |
206 REPEAT_32("\n a = 1, b = 2, ") // | 244 REPEAT_32("\n a = 1, b = 2, ") // |
207 "3);", | 245 "3);\n", |
208 | 246 |
209 "var x = 1; var a = 2, b = 3; return (x > 3) || (" // | 247 "var x = 1; var a = 2, b = 3; return (x > 3) || (" // |
210 REPEAT_32("\n a = 1, b = 2, ") // | 248 REPEAT_32("\n a = 1, b = 2, ") // |
211 "3);", | 249 "3);\n", |
212 | 250 |
213 "var x = 0; var a = 2, b = 3; return (x < 5) && (" // | 251 "var x = 0; var a = 2, b = 3; return (x < 5) && (" // |
214 REPEAT_32("\n a = 1, b = 2, ") // | 252 REPEAT_32("\n a = 1, b = 2, ") // |
215 "3);", | 253 "3);\n", |
216 | 254 |
217 "return 0 && 3;", | 255 "return 0 && 3;\n", |
218 | 256 |
219 "return 1 || 3;", | 257 "return 1 || 3;\n", |
220 | 258 |
221 "var x = 1; return x && 3 || 0, 1;", | 259 "var x = 1; return x && 3 || 0, 1;\n", |
222 }; | 260 }; |
223 | 261 |
224 CHECK_EQ(BuildActual(printer, snippets), | 262 CHECK(CompareTexts(BuildActual(printer, snippets), |
225 LoadGolden("LogicalExpressions.golden")); | 263 LoadGolden("LogicalExpressions.golden"))); |
226 } | 264 } |
227 | 265 |
228 TEST(Parameters) { | 266 TEST(Parameters) { |
229 InitializedIgnitionHandleScope scope; | 267 InitializedIgnitionHandleScope scope; |
230 BytecodeExpectationsPrinter printer(CcTest::isolate(), | 268 BytecodeExpectationsPrinter printer(CcTest::isolate(), |
231 ConstantPoolType::kNumber); | 269 ConstantPoolType::kNumber); |
232 printer.set_wrap(false); | 270 printer.set_wrap(false); |
233 printer.set_test_function_name("f"); | 271 printer.set_test_function_name("f"); |
234 | 272 |
235 const char* snippets[] = { | 273 const char* snippets[] = { |
236 "function f() { return this; }", | 274 "function f() { return this; }", |
237 | 275 |
238 "function f(arg1) { return arg1; }", | 276 "function f(arg1) { return arg1; }", |
239 | 277 |
240 "function f(arg1) { return this; }", | 278 "function f(arg1) { return this; }", |
241 | 279 |
242 "function f(arg1, arg2, arg3, arg4, arg5, arg6, arg7) { return arg4; }", | 280 "function f(arg1, arg2, arg3, arg4, arg5, arg6, arg7) { return arg4; }", |
243 | 281 |
244 "function f(arg1, arg2, arg3, arg4, arg5, arg6, arg7) { return this; }", | 282 "function f(arg1, arg2, arg3, arg4, arg5, arg6, arg7) { return this; }", |
245 | 283 |
246 "function f(arg1) { arg1 = 1; }", | 284 "function f(arg1) { arg1 = 1; }", |
247 | 285 |
248 "function f(arg1, arg2, arg3, arg4) { arg2 = 1; }", | 286 "function f(arg1, arg2, arg3, arg4) { arg2 = 1; }", |
249 }; | 287 }; |
250 | 288 |
251 CHECK_EQ(BuildActual(printer, snippets, "", "\nf();"), | 289 CHECK(CompareTexts(BuildActual(printer, snippets, "", "\nf();"), |
252 LoadGolden("Parameters.golden")); | 290 LoadGolden("Parameters.golden"))); |
253 } | 291 } |
254 | 292 |
255 TEST(IntegerConstants) { | 293 TEST(IntegerConstants) { |
256 InitializedIgnitionHandleScope scope; | 294 InitializedIgnitionHandleScope scope; |
257 BytecodeExpectationsPrinter printer(CcTest::isolate(), | 295 BytecodeExpectationsPrinter printer(CcTest::isolate(), |
258 ConstantPoolType::kNumber); | 296 ConstantPoolType::kNumber); |
259 const char* snippets[] = { | 297 const char* snippets[] = { |
260 "return 12345678;", | 298 "return 12345678;\n", |
261 | 299 |
262 "var a = 1234; return 5678;", | 300 "var a = 1234; return 5678;\n", |
263 | 301 |
264 "var a = 1234; return 1234;", | 302 "var a = 1234; return 1234;\n", |
265 }; | 303 }; |
266 | 304 |
267 CHECK_EQ(BuildActual(printer, snippets), | 305 CHECK(CompareTexts(BuildActual(printer, snippets), |
268 LoadGolden("IntegerConstants.golden")); | 306 LoadGolden("IntegerConstants.golden"))); |
269 } | 307 } |
270 | 308 |
271 TEST(HeapNumberConstants) { | 309 TEST(HeapNumberConstants) { |
272 InitializedIgnitionHandleScope scope; | 310 InitializedIgnitionHandleScope scope; |
273 BytecodeExpectationsPrinter printer(CcTest::isolate(), | 311 BytecodeExpectationsPrinter printer(CcTest::isolate(), |
274 ConstantPoolType::kNumber); | 312 ConstantPoolType::kNumber); |
275 const char* snippets[] = { | 313 const char* snippets[] = { |
276 "return 1.2;", | 314 "return 1.2;\n", |
277 | 315 |
278 "var a = 1.2; return 2.6;", | 316 "var a = 1.2; return 2.6;\n", |
279 | 317 |
280 "var a = 3.14; return 3.14;", | 318 "var a = 3.14; return 3.14;\n", |
281 | 319 |
282 "var a;" // | 320 "var a;" // |
283 REPEAT_256("\na = 1.414;") // | 321 REPEAT_256("\na = 1.414;") // |
284 " a = 3.14;", | 322 " a = 3.14;\n", |
285 }; | 323 }; |
286 | 324 |
287 CHECK_EQ(BuildActual(printer, snippets), | 325 CHECK(CompareTexts(BuildActual(printer, snippets), |
288 LoadGolden("HeapNumberConstants.golden")); | 326 LoadGolden("HeapNumberConstants.golden"))); |
289 } | 327 } |
290 | 328 |
291 TEST(StringConstants) { | 329 TEST(StringConstants) { |
292 InitializedIgnitionHandleScope scope; | 330 InitializedIgnitionHandleScope scope; |
293 BytecodeExpectationsPrinter printer(CcTest::isolate(), | 331 BytecodeExpectationsPrinter printer(CcTest::isolate(), |
294 ConstantPoolType::kString); | 332 ConstantPoolType::kString); |
295 const char* snippets[] = { | 333 const char* snippets[] = { |
296 "return \"This is a string\";", | 334 "return \"This is a string\";\n", |
297 | 335 |
298 "var a = \"First string\"; return \"Second string\";", | 336 "var a = \"First string\"; return \"Second string\";\n", |
299 | 337 |
300 "var a = \"Same string\"; return \"Same string\";", | 338 "var a = \"Same string\"; return \"Same string\";\n", |
301 }; | 339 }; |
302 | 340 |
303 CHECK_EQ(BuildActual(printer, snippets), | 341 CHECK(CompareTexts(BuildActual(printer, snippets), |
304 LoadGolden("StringConstants.golden")); | 342 LoadGolden("StringConstants.golden"))); |
305 } | 343 } |
306 | 344 |
307 TEST(PropertyLoads) { | 345 TEST(PropertyLoads) { |
308 InitializedIgnitionHandleScope scope; | 346 InitializedIgnitionHandleScope scope; |
309 BytecodeExpectationsPrinter printer(CcTest::isolate(), | 347 BytecodeExpectationsPrinter printer(CcTest::isolate(), |
310 ConstantPoolType::kString); | 348 ConstantPoolType::kString); |
311 printer.set_wrap(false); | 349 printer.set_wrap(false); |
312 printer.set_test_function_name("f"); | 350 printer.set_test_function_name("f"); |
313 | 351 |
314 const char* snippets[] = { | 352 const char* snippets[] = { |
315 "function f(a) { return a.name; }\n" | 353 "function f(a) { return a.name; }\n" |
316 "f({name : \"test\"});", | 354 "f({name : \"test\"});\n", |
317 | 355 |
318 "function f(a) { return a[\"key\"]; }\n" | 356 "function f(a) { return a[\"key\"]; }\n" |
319 "f({key : \"test\"});", | 357 "f({key : \"test\"});\n", |
320 | 358 |
321 "function f(a) { return a[100]; }\n" | 359 "function f(a) { return a[100]; }\n" |
322 "f({100 : \"test\"});", | 360 "f({100 : \"test\"});\n", |
323 | 361 |
324 "function f(a, b) { return a[b]; }\n" | 362 "function f(a, b) { return a[b]; }\n" |
325 "f({arg : \"test\"}, \"arg\");", | 363 "f({arg : \"test\"}, \"arg\");\n", |
326 | 364 |
327 "function f(a) { var b = a.name; return a[-124]; }\n" | 365 "function f(a) { var b = a.name; return a[-124]; }\n" |
328 "f({\"-124\" : \"test\", name : 123 })", | 366 "f({\"-124\" : \"test\", name : 123 })", |
329 | 367 |
330 "function f(a) {\n" | 368 "function f(a) {\n" |
331 " var b;\n" | 369 " var b;\n" |
332 " b = a.name;\n" | 370 " b = a.name;\n" |
333 REPEAT_127(" b = a.name;\n") | 371 REPEAT_127(" b = a.name;\n") |
334 " return a.name;\n" | 372 " return a.name;\n" |
335 "}\n" | 373 "}\n" |
336 "f({name : \"test\"})\n", | 374 "f({name : \"test\"})\n", |
337 | 375 |
338 "function f(a, b) {\n" | 376 "function f(a, b) {\n" |
339 " var c;\n" | 377 " var c;\n" |
340 " c = a[b];\n" | 378 " c = a[b];\n" |
341 REPEAT_127(" c = a[b];\n") | 379 REPEAT_127(" c = a[b];\n") |
342 " return a[b];\n" | 380 " return a[b];\n" |
343 "}\n" | 381 "}\n" |
344 "f({name : \"test\"}, \"name\")\n", | 382 "f({name : \"test\"}, \"name\")\n", |
345 }; | 383 }; |
346 | 384 |
347 CHECK_EQ(BuildActual(printer, snippets), LoadGolden("PropertyLoads.golden")); | 385 CHECK(CompareTexts(BuildActual(printer, snippets), |
| 386 LoadGolden("PropertyLoads.golden"))); |
348 } | 387 } |
349 | 388 |
350 TEST(PropertyStores) { | 389 TEST(PropertyStores) { |
351 InitializedIgnitionHandleScope scope; | 390 InitializedIgnitionHandleScope scope; |
352 BytecodeExpectationsPrinter printer(CcTest::isolate(), | 391 BytecodeExpectationsPrinter printer(CcTest::isolate(), |
353 ConstantPoolType::kString); | 392 ConstantPoolType::kString); |
354 printer.set_wrap(false); | 393 printer.set_wrap(false); |
355 printer.set_test_function_name("f"); | 394 printer.set_test_function_name("f"); |
356 | 395 |
357 const char* snippets[] = { | 396 const char* snippets[] = { |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
400 | 439 |
401 "function f(a, b) {\n" | 440 "function f(a, b) {\n" |
402 " 'use strict';\n" | 441 " 'use strict';\n" |
403 " a[b] = 1;\n" | 442 " a[b] = 1;\n" |
404 REPEAT_127(" a[b] = 1;\n") | 443 REPEAT_127(" a[b] = 1;\n") |
405 " a[b] = 2;\n" | 444 " a[b] = 2;\n" |
406 "}\n" | 445 "}\n" |
407 "f({name : \"test\"})\n", | 446 "f({name : \"test\"})\n", |
408 }; | 447 }; |
409 | 448 |
410 CHECK_EQ(BuildActual(printer, snippets), LoadGolden("PropertyStores.golden")); | 449 CHECK(CompareTexts(BuildActual(printer, snippets), |
| 450 LoadGolden("PropertyStores.golden"))); |
411 } | 451 } |
412 | 452 |
413 #define FUNC_ARG "new (function Obj() { this.func = function() { return; }})()" | 453 #define FUNC_ARG "new (function Obj() { this.func = function() { return; }})()" |
414 | 454 |
415 TEST(PropertyCall) { | 455 TEST(PropertyCall) { |
416 InitializedIgnitionHandleScope scope; | 456 InitializedIgnitionHandleScope scope; |
417 BytecodeExpectationsPrinter printer(CcTest::isolate(), | 457 BytecodeExpectationsPrinter printer(CcTest::isolate(), |
418 ConstantPoolType::kString); | 458 ConstantPoolType::kString); |
419 printer.set_wrap(false); | 459 printer.set_wrap(false); |
420 printer.set_test_function_name("f"); | 460 printer.set_test_function_name("f"); |
421 | 461 |
422 const char* snippets[] = { | 462 const char* snippets[] = { |
423 "function f(a) { return a.func(); }\n" | 463 "function f(a) { return a.func(); }\n" |
424 "f(" FUNC_ARG ")", | 464 "f(" FUNC_ARG ")", |
425 | 465 |
426 "function f(a, b, c) { return a.func(b, c); }\n" | 466 "function f(a, b, c) { return a.func(b, c); }\n" |
427 "f(" FUNC_ARG ", 1, 2)", | 467 "f(" FUNC_ARG ", 1, 2)", |
428 | 468 |
429 "function f(a, b) { return a.func(b + b, b); }\n" | 469 "function f(a, b) { return a.func(b + b, b); }\n" |
430 "f(" FUNC_ARG ", 1)", | 470 "f(" FUNC_ARG ", 1)", |
431 | 471 |
432 "function f(a) {\n" | 472 "function f(a) {\n" |
433 " a.func;\n" // | 473 " a.func;\n" // |
434 REPEAT_127(" a.func;\n") // | 474 REPEAT_127(" a.func;\n") // |
435 " return a.func(); }\n" | 475 " return a.func(); }\n" |
436 "f(" FUNC_ARG ")", | 476 "f(" FUNC_ARG ")", |
437 }; | 477 }; |
438 | 478 |
439 CHECK_EQ(BuildActual(printer, snippets), LoadGolden("PropertyCall.golden")); | 479 CHECK(CompareTexts(BuildActual(printer, snippets), |
| 480 LoadGolden("PropertyCall.golden"))); |
440 } | 481 } |
441 | 482 |
442 TEST(LoadGlobal) { | 483 TEST(LoadGlobal) { |
443 InitializedIgnitionHandleScope scope; | 484 InitializedIgnitionHandleScope scope; |
444 BytecodeExpectationsPrinter printer(CcTest::isolate(), | 485 BytecodeExpectationsPrinter printer(CcTest::isolate(), |
445 ConstantPoolType::kString); | 486 ConstantPoolType::kString); |
446 printer.set_wrap(false); | 487 printer.set_wrap(false); |
447 printer.set_test_function_name("f"); | 488 printer.set_test_function_name("f"); |
448 | 489 |
449 const char* snippets[] = { | 490 const char* snippets[] = { |
450 "var a = 1;\n" | 491 "var a = 1;\n" |
451 "function f() { return a; }\n" | 492 "function f() { return a; }\n" |
452 "f()", | 493 "f()", |
453 | 494 |
454 "function t() { }\n" | 495 "function t() { }\n" |
455 "function f() { return t; }\n" | 496 "function f() { return t; }\n" |
456 "f()", | 497 "f()", |
457 | 498 |
458 "a = 1;\n" | 499 "a = 1;\n" |
459 "function f() { return a; }\n" | 500 "function f() { return a; }\n" |
460 "f()", | 501 "f()", |
461 | 502 |
462 "a = 1;\n" | 503 "a = 1;\n" |
463 "function f(b) {\n" | 504 "function f(b) {\n" |
464 " b.name;\n" | 505 " b.name;\n" |
465 REPEAT_127(" b.name;\n") | 506 REPEAT_127(" b.name;\n") |
466 " return a;\n" | 507 " return a;\n" |
467 "}\n" | 508 "}\n" |
468 "f({name: 1});", | 509 "f({name: 1});\n", |
469 }; | 510 }; |
470 | 511 |
471 CHECK_EQ(BuildActual(printer, snippets), LoadGolden("LoadGlobal.golden")); | 512 CHECK(CompareTexts(BuildActual(printer, snippets), |
| 513 LoadGolden("LoadGlobal.golden"))); |
472 } | 514 } |
473 | 515 |
474 TEST(StoreGlobal) { | 516 TEST(StoreGlobal) { |
475 InitializedIgnitionHandleScope scope; | 517 InitializedIgnitionHandleScope scope; |
476 BytecodeExpectationsPrinter printer(CcTest::isolate(), | 518 BytecodeExpectationsPrinter printer(CcTest::isolate(), |
477 ConstantPoolType::kString); | 519 ConstantPoolType::kString); |
478 printer.set_wrap(false); | 520 printer.set_wrap(false); |
479 printer.set_test_function_name("f"); | 521 printer.set_test_function_name("f"); |
480 | 522 |
481 const char* snippets[] = { | 523 const char* snippets[] = { |
482 "var a = 1;\n" | 524 "var a = 1;\n" |
483 "function f() { a = 2; }\n" | 525 "function f() { a = 2; }\n" |
484 "f();", | 526 "f();\n", |
485 | 527 |
486 "var a = \"test\"; function f(b) { a = b; }\n" | 528 "var a = \"test\"; function f(b) { a = b; }\n" |
487 "f(\"global\");", | 529 "f(\"global\");\n", |
488 | 530 |
489 "'use strict'; var a = 1;\n" | 531 "'use strict'; var a = 1;\n" |
490 "function f() { a = 2; }\n" | 532 "function f() { a = 2; }\n" |
491 "f();", | 533 "f();\n", |
492 | 534 |
493 "a = 1;\n" | 535 "a = 1;\n" |
494 "function f() { a = 2; }\n" | 536 "function f() { a = 2; }\n" |
495 "f();", | 537 "f();\n", |
496 | 538 |
497 "a = 1;\n" | 539 "a = 1;\n" |
498 "function f(b) {\n" | 540 "function f(b) {\n" |
499 " b.name;\n" | 541 " b.name;\n" |
500 REPEAT_127(" b.name;\n") | 542 REPEAT_127(" b.name;\n") |
501 " a = 2;\n" | 543 " a = 2;\n" |
502 "}\n" | 544 "}\n" |
503 "f({name: 1});", | 545 "f({name: 1});\n", |
504 | 546 |
505 "a = 1;\n" | 547 "a = 1;\n" |
506 "function f(b) {\n" | 548 "function f(b) {\n" |
507 " 'use strict';\n" | 549 " 'use strict';\n" |
508 " b.name;\n" | 550 " b.name;\n" |
509 REPEAT_127(" b.name;\n") | 551 REPEAT_127(" b.name;\n") |
510 " a = 2;\n" | 552 " a = 2;\n" |
511 "}\n" | 553 "}\n" |
512 "f({name: 1});", | 554 "f({name: 1});\n", |
513 }; | 555 }; |
514 | 556 |
515 CHECK_EQ(BuildActual(printer, snippets), LoadGolden("StoreGlobal.golden")); | 557 CHECK(CompareTexts(BuildActual(printer, snippets), |
| 558 LoadGolden("StoreGlobal.golden"))); |
516 } | 559 } |
517 | 560 |
518 TEST(CallGlobal) { | 561 TEST(CallGlobal) { |
519 InitializedIgnitionHandleScope scope; | 562 InitializedIgnitionHandleScope scope; |
520 BytecodeExpectationsPrinter printer(CcTest::isolate(), | 563 BytecodeExpectationsPrinter printer(CcTest::isolate(), |
521 ConstantPoolType::kString); | 564 ConstantPoolType::kString); |
522 printer.set_wrap(false); | 565 printer.set_wrap(false); |
523 printer.set_test_function_name("f"); | 566 printer.set_test_function_name("f"); |
524 | 567 |
525 const char* snippets[] = { | 568 const char* snippets[] = { |
526 "function t() { }\n" | 569 "function t() { }\n" |
527 "function f() { return t(); }\n" | 570 "function f() { return t(); }\n" |
528 "f();", | 571 "f();\n", |
529 | 572 |
530 "function t(a, b, c) { }\n" | 573 "function t(a, b, c) { }\n" |
531 "function f() { return t(1, 2, 3); }\n" | 574 "function f() { return t(1, 2, 3); }\n" |
532 "f();", | 575 "f();\n", |
533 }; | 576 }; |
534 | 577 |
535 CHECK_EQ(BuildActual(printer, snippets), LoadGolden("CallGlobal.golden")); | 578 CHECK(CompareTexts(BuildActual(printer, snippets), |
| 579 LoadGolden("CallGlobal.golden"))); |
536 } | 580 } |
537 | 581 |
538 TEST(CallRuntime) { | 582 TEST(CallRuntime) { |
539 InitializedIgnitionHandleScope scope; | 583 InitializedIgnitionHandleScope scope; |
540 BytecodeExpectationsPrinter printer(CcTest::isolate(), | 584 BytecodeExpectationsPrinter printer(CcTest::isolate(), |
541 ConstantPoolType::kMixed); | 585 ConstantPoolType::kMixed); |
542 printer.set_wrap(false); | 586 printer.set_wrap(false); |
543 printer.set_test_function_name("f"); | 587 printer.set_test_function_name("f"); |
544 | 588 |
545 const char* snippets[] = { | 589 const char* snippets[] = { |
546 "function f() { %TheHole() }\n" | 590 "function f() { %TheHole() }\n" |
547 "f();", | 591 "f();\n", |
548 | 592 |
549 "function f(a) { return %IsArray(a) }\n" | 593 "function f(a) { return %IsArray(a) }\n" |
550 "f(undefined);", | 594 "f(undefined);\n", |
551 | 595 |
552 "function f() { return %Add(1, 2) }\n" | 596 "function f() { return %Add(1, 2) }\n" |
553 "f();", | 597 "f();\n", |
554 | 598 |
555 "function f() { return %spread_iterable([1]) }\n" | 599 "function f() { return %spread_iterable([1]) }\n" |
556 "f();", | 600 "f();\n", |
557 }; | 601 }; |
558 | 602 |
559 CHECK_EQ(BuildActual(printer, snippets), LoadGolden("CallRuntime.golden")); | 603 CHECK(CompareTexts(BuildActual(printer, snippets), |
| 604 LoadGolden("CallRuntime.golden"))); |
560 } | 605 } |
561 | 606 |
562 TEST(IfConditions) { | 607 TEST(IfConditions) { |
563 InitializedIgnitionHandleScope scope; | 608 InitializedIgnitionHandleScope scope; |
564 BytecodeExpectationsPrinter printer(CcTest::isolate(), | 609 BytecodeExpectationsPrinter printer(CcTest::isolate(), |
565 ConstantPoolType::kMixed); | 610 ConstantPoolType::kMixed); |
566 printer.set_wrap(false); | 611 printer.set_wrap(false); |
567 printer.set_test_function_name("f"); | 612 printer.set_test_function_name("f"); |
568 | 613 |
569 const char* snippets[] = { | 614 const char* snippets[] = { |
570 "function f() {\n" | 615 "function f() {\n" |
571 " if (0) {\n" | 616 " if (0) {\n" |
572 " return 1;\n" | 617 " return 1;\n" |
573 " } else {\n" | 618 " } else {\n" |
574 " return -1;\n" | 619 " return -1;\n" |
575 " }\n" | 620 " }\n" |
576 "};\n" | 621 "};\n" |
577 "f();", | 622 "f();\n", |
578 | 623 |
579 "function f() {\n" | 624 "function f() {\n" |
580 " if ('lucky') {\n" | 625 " if ('lucky') {\n" |
581 " return 1;\n" | 626 " return 1;\n" |
582 " } else {\n" | 627 " } else {\n" |
583 " return -1;\n" | 628 " return -1;\n" |
584 " }\n" | 629 " }\n" |
585 "};\n" | 630 "};\n" |
586 "f();", | 631 "f();\n", |
587 | 632 |
588 "function f() {\n" | 633 "function f() {\n" |
589 " if (false) {\n" | 634 " if (false) {\n" |
590 " return 1;\n" | 635 " return 1;\n" |
591 " } else {\n" | 636 " } else {\n" |
592 " return -1;\n" | 637 " return -1;\n" |
593 " }\n" | 638 " }\n" |
594 "};\n" | 639 "};\n" |
595 "f();", | 640 "f();\n", |
596 | 641 |
597 "function f() {\n" | 642 "function f() {\n" |
598 " if (false) {\n" | 643 " if (false) {\n" |
599 " return 1;\n" | 644 " return 1;\n" |
600 " }\n" | 645 " }\n" |
601 "};\n" | 646 "};\n" |
602 "f();", | 647 "f();\n", |
603 | 648 |
604 "function f() {\n" | 649 "function f() {\n" |
605 " var a = 1;\n" | 650 " var a = 1;\n" |
606 " if (a) {\n" | 651 " if (a) {\n" |
607 " a += 1;\n" | 652 " a += 1;\n" |
608 " } else {\n" | 653 " } else {\n" |
609 " return 2;\n" | 654 " return 2;\n" |
610 " }\n" | 655 " }\n" |
611 "};\n" | 656 "};\n" |
612 "f();", | 657 "f();\n", |
613 | 658 |
614 "function f(a) {\n" | 659 "function f(a) {\n" |
615 " if (a <= 0) {\n" | 660 " if (a <= 0) {\n" |
616 " return 200;\n" | 661 " return 200;\n" |
617 " } else {\n" | 662 " } else {\n" |
618 " return -200;\n" | 663 " return -200;\n" |
619 " }\n" | 664 " }\n" |
620 "};\n" | 665 "};\n" |
621 "f(99);", | 666 "f(99);\n", |
622 | 667 |
623 "function f(a, b) { if (a in b) { return 200; } }" | 668 "function f(a, b) { if (a in b) { return 200; } }" |
624 "f('prop', { prop: 'yes'});", | 669 "f('prop', { prop: 'yes'});\n", |
625 | 670 |
626 "function f(z) { var a = 0; var b = 0; if (a === 0.01) {\n" | 671 "function f(z) { var a = 0; var b = 0; if (a === 0.01) {\n" |
627 REPEAT_64(" b = a; a = b;\n") | 672 REPEAT_64(" b = a; a = b;\n") |
628 " return 200; } else { return -200; } } f(0.001);", | 673 " return 200; } else { return -200; } } f(0.001);\n", |
629 | 674 |
630 "function f() {\n" | 675 "function f() {\n" |
631 " var a = 0; var b = 0;\n" | 676 " var a = 0; var b = 0;\n" |
632 " if (a) {\n" | 677 " if (a) {\n" |
633 REPEAT_64(" b = a; a = b;\n") | 678 REPEAT_64(" b = a; a = b;\n") |
634 " return 200; } else { return -200; }\n" | 679 " return 200; } else { return -200; }\n" |
635 "};\n" | 680 "};\n" |
636 "f();", | 681 "f();\n", |
637 | 682 |
638 "function f(a, b) {\n" | 683 "function f(a, b) {\n" |
639 " if (a == b) { return 1; }\n" | 684 " if (a == b) { return 1; }\n" |
640 " if (a === b) { return 1; }\n" | 685 " if (a === b) { return 1; }\n" |
641 " if (a < b) { return 1; }\n" | 686 " if (a < b) { return 1; }\n" |
642 " if (a > b) { return 1; }\n" | 687 " if (a > b) { return 1; }\n" |
643 " if (a <= b) { return 1; }\n" | 688 " if (a <= b) { return 1; }\n" |
644 " if (a >= b) { return 1; }\n" | 689 " if (a >= b) { return 1; }\n" |
645 " if (a in b) { return 1; }\n" | 690 " if (a in b) { return 1; }\n" |
646 " if (a instanceof b) { return 1; }\n" | 691 " if (a instanceof b) { return 1; }\n" |
647 " return 0;\n" | 692 " return 0;\n" |
648 "}\n" | 693 "}\n" |
649 "f(1, 1);", | 694 "f(1, 1);\n", |
650 | 695 |
651 "function f() {\n" | 696 "function f() {\n" |
652 " var a = 0;\n" | 697 " var a = 0;\n" |
653 " if (a) {\n" | 698 " if (a) {\n" |
654 " return 20;\n" | 699 " return 20;\n" |
655 " } else {\n" | 700 " } else {\n" |
656 " return -20;\n" | 701 " return -20;\n" |
657 " }\n" | 702 " }\n" |
658 "};\n" | 703 "};\n" |
659 "f();", | 704 "f();\n", |
660 }; | 705 }; |
661 | 706 |
662 CHECK_EQ(BuildActual(printer, snippets), LoadGolden("IfConditions.golden")); | 707 CHECK(CompareTexts(BuildActual(printer, snippets), |
| 708 LoadGolden("IfConditions.golden"))); |
663 } | 709 } |
664 | 710 |
665 TEST(DeclareGlobals) { | 711 TEST(DeclareGlobals) { |
666 InitializedIgnitionHandleScope scope; | 712 InitializedIgnitionHandleScope scope; |
667 BytecodeExpectationsPrinter printer(CcTest::isolate(), | 713 BytecodeExpectationsPrinter printer(CcTest::isolate(), |
668 ConstantPoolType::kMixed); | 714 ConstantPoolType::kMixed); |
669 printer.set_wrap(false); | 715 printer.set_wrap(false); |
670 printer.set_test_function_name("f"); | 716 printer.set_test_function_name("f"); |
671 printer.set_execute(false); | 717 printer.set_execute(false); |
672 printer.set_top_level(true); | 718 printer.set_top_level(true); |
673 | 719 |
674 const char* snippets[] = { | 720 const char* snippets[] = { |
675 "var a = 1;", | 721 "var a = 1;\n", |
676 | 722 |
677 "function f() {}", | 723 "function f() {}\n", |
678 | 724 |
679 "var a = 1;\n" | 725 "var a = 1;\n" |
680 "a=2;", | 726 "a=2;\n", |
681 | 727 |
682 "function f() {}\n" | 728 "function f() {}\n" |
683 "f();", | 729 "f();\n", |
684 }; | 730 }; |
685 | 731 |
686 CHECK_EQ(BuildActual(printer, snippets), LoadGolden("DeclareGlobals.golden")); | 732 CHECK(CompareTexts(BuildActual(printer, snippets), |
| 733 LoadGolden("DeclareGlobals.golden"))); |
687 } | 734 } |
688 | 735 |
689 TEST(BreakableBlocks) { | 736 TEST(BreakableBlocks) { |
690 InitializedIgnitionHandleScope scope; | 737 InitializedIgnitionHandleScope scope; |
691 BytecodeExpectationsPrinter printer(CcTest::isolate(), | 738 BytecodeExpectationsPrinter printer(CcTest::isolate(), |
692 ConstantPoolType::kMixed); | 739 ConstantPoolType::kMixed); |
693 | 740 |
694 const char* snippets[] = { | 741 const char* snippets[] = { |
695 "var x = 0;\n" | 742 "var x = 0;\n" |
696 "label: {\n" | 743 "label: {\n" |
697 " x = x + 1;\n" | 744 " x = x + 1;\n" |
698 " break label;\n" | 745 " break label;\n" |
699 " x = x + 1;\n" | 746 " x = x + 1;\n" |
700 "}\n" | 747 "}\n" |
701 "return x;", | 748 "return x;\n", |
702 | 749 |
703 "var sum = 0;\n" | 750 "var sum = 0;\n" |
704 "outer: {\n" | 751 "outer: {\n" |
705 " for (var x = 0; x < 10; ++x) {\n" | 752 " for (var x = 0; x < 10; ++x) {\n" |
706 " for (var y = 0; y < 3; ++y) {\n" | 753 " for (var y = 0; y < 3; ++y) {\n" |
707 " ++sum;\n" | 754 " ++sum;\n" |
708 " if (x + y == 12) { break outer; }\n" | 755 " if (x + y == 12) { break outer; }\n" |
709 " }\n" | 756 " }\n" |
710 " }\n" | 757 " }\n" |
711 "}\n" | 758 "}\n" |
712 "return sum;", | 759 "return sum;\n", |
713 | 760 |
714 "outer: {\n" | 761 "outer: {\n" |
715 " let y = 10;\n" | 762 " let y = 10;\n" |
716 " function f() { return y; }\n" | 763 " function f() { return y; }\n" |
717 " break outer;\n" | 764 " break outer;\n" |
718 "}\n", | 765 "}\n", |
719 | 766 |
720 "let x = 1;\n" | 767 "let x = 1;\n" |
721 "outer: {\n" | 768 "outer: {\n" |
722 " inner: {\n" | 769 " inner: {\n" |
723 " let y = 2;\n" | 770 " let y = 2;\n" |
724 " function f() { return x + y; }\n" | 771 " function f() { return x + y; }\n" |
725 " if (y) break outer;\n" | 772 " if (y) break outer;\n" |
726 " y = 3;\n" | 773 " y = 3;\n" |
727 " }\n" | 774 " }\n" |
728 "}\n" | 775 "}\n" |
729 "x = 4;", | 776 "x = 4;\n", |
730 }; | 777 }; |
731 | 778 |
732 CHECK_EQ(BuildActual(printer, snippets), | 779 CHECK(CompareTexts(BuildActual(printer, snippets), |
733 LoadGolden("BreakableBlocks.golden")); | 780 LoadGolden("BreakableBlocks.golden"))); |
734 } | 781 } |
735 | 782 |
736 TEST(BasicLoops) { | 783 TEST(BasicLoops) { |
737 InitializedIgnitionHandleScope scope; | 784 InitializedIgnitionHandleScope scope; |
738 BytecodeExpectationsPrinter printer(CcTest::isolate(), | 785 BytecodeExpectationsPrinter printer(CcTest::isolate(), |
739 ConstantPoolType::kMixed); | 786 ConstantPoolType::kMixed); |
740 const char* snippets[] = { | 787 const char* snippets[] = { |
741 "var x = 0;\n" | 788 "var x = 0;\n" |
742 "while (false) { x = 99; break; continue; }\n" | 789 "while (false) { x = 99; break; continue; }\n" |
743 "return x;", | 790 "return x;\n", |
744 | 791 |
745 "var x = 0;\n" | 792 "var x = 0;\n" |
746 "while (false) {\n" | 793 "while (false) {\n" |
747 " x = x + 1;\n" | 794 " x = x + 1;\n" |
748 "};\n" | 795 "};\n" |
749 "return x;", | 796 "return x;\n", |
750 | 797 |
751 "var x = 0;\n" | 798 "var x = 0;\n" |
752 "var y = 1;\n" | 799 "var y = 1;\n" |
753 "while (x < 10) {\n" | 800 "while (x < 10) {\n" |
754 " y = y * 12;\n" | 801 " y = y * 12;\n" |
755 " x = x + 1;\n" | 802 " x = x + 1;\n" |
756 " if (x == 3) continue;\n" | 803 " if (x == 3) continue;\n" |
757 " if (x == 4) break;\n" | 804 " if (x == 4) break;\n" |
758 "}\n" | 805 "}\n" |
759 "return y;", | 806 "return y;\n", |
760 | 807 |
761 "var i = 0;\n" | 808 "var i = 0;\n" |
762 "while (true) {\n" | 809 "while (true) {\n" |
763 " if (i < 0) continue;\n" | 810 " if (i < 0) continue;\n" |
764 " if (i == 3) break;\n" | 811 " if (i == 3) break;\n" |
765 " if (i == 4) break;\n" | 812 " if (i == 4) break;\n" |
766 " if (i == 10) continue;\n" | 813 " if (i == 10) continue;\n" |
767 " if (i == 5) break;\n" | 814 " if (i == 5) break;\n" |
768 " i = i + 1;\n" | 815 " i = i + 1;\n" |
769 "}\n" | 816 "}\n" |
770 "return i;", | 817 "return i;\n", |
771 | 818 |
772 "var i = 0;\n" | 819 "var i = 0;\n" |
773 "while (true) {\n" | 820 "while (true) {\n" |
774 " while (i < 3) {\n" | 821 " while (i < 3) {\n" |
775 " if (i == 2) break;\n" | 822 " if (i == 2) break;\n" |
776 " i = i + 1;\n" | 823 " i = i + 1;\n" |
777 " }\n" | 824 " }\n" |
778 " i = i + 1;\n" | 825 " i = i + 1;\n" |
779 " break;\n" | 826 " break;\n" |
780 "}\n" | 827 "}\n" |
781 "return i;", | 828 "return i;\n", |
782 | 829 |
783 "var x = 10;\n" | 830 "var x = 10;\n" |
784 "var y = 1;\n" | 831 "var y = 1;\n" |
785 "while (x) {\n" | 832 "while (x) {\n" |
786 " y = y * 12;\n" | 833 " y = y * 12;\n" |
787 " x = x - 1;\n" | 834 " x = x - 1;\n" |
788 "}\n" | 835 "}\n" |
789 "return y;", | 836 "return y;\n", |
790 | 837 |
791 "var x = 0; var y = 1;\n" | 838 "var x = 0; var y = 1;\n" |
792 "do {\n" | 839 "do {\n" |
793 " y = y * 10;\n" | 840 " y = y * 10;\n" |
794 " if (x == 5) break;\n" | 841 " if (x == 5) break;\n" |
795 " if (x == 6) continue;\n" | 842 " if (x == 6) continue;\n" |
796 " x = x + 1;\n" | 843 " x = x + 1;\n" |
797 "} while (x < 10);\n" | 844 "} while (x < 10);\n" |
798 "return y;", | 845 "return y;\n", |
799 | 846 |
800 "var x = 10;\n" | 847 "var x = 10;\n" |
801 "var y = 1;\n" | 848 "var y = 1;\n" |
802 "do {\n" | 849 "do {\n" |
803 " y = y * 12;\n" | 850 " y = y * 12;\n" |
804 " x = x - 1;\n" | 851 " x = x - 1;\n" |
805 "} while (x);\n" | 852 "} while (x);\n" |
806 "return y;", | 853 "return y;\n", |
807 | 854 |
808 "var x = 0; var y = 1;\n" | 855 "var x = 0; var y = 1;\n" |
809 "do {\n" | 856 "do {\n" |
810 " y = y * 10;\n" | 857 " y = y * 10;\n" |
811 " if (x == 5) break;\n" | 858 " if (x == 5) break;\n" |
812 " x = x + 1;\n" | 859 " x = x + 1;\n" |
813 " if (x == 6) continue;\n" | 860 " if (x == 6) continue;\n" |
814 "} while (false);\n" | 861 "} while (false);\n" |
815 "return y;", | 862 "return y;\n", |
816 | 863 |
817 "var x = 0; var y = 1;\n" | 864 "var x = 0; var y = 1;\n" |
818 "do {\n" | 865 "do {\n" |
819 " y = y * 10;\n" | 866 " y = y * 10;\n" |
820 " if (x == 5) break;\n" | 867 " if (x == 5) break;\n" |
821 " x = x + 1;\n" | 868 " x = x + 1;\n" |
822 " if (x == 6) continue;\n" | 869 " if (x == 6) continue;\n" |
823 "} while (true);\n" | 870 "} while (true);\n" |
824 "return y;", | 871 "return y;\n", |
825 | 872 |
826 "var x = 0;\n" | 873 "var x = 0;\n" |
827 "for (;;) {\n" | 874 "for (;;) {\n" |
828 " if (x == 1) break;\n" | 875 " if (x == 1) break;\n" |
829 " if (x == 2) continue;\n" | 876 " if (x == 2) continue;\n" |
830 " x = x + 1;\n" | 877 " x = x + 1;\n" |
831 "}", | 878 "}\n", |
832 | 879 |
833 "for (var x = 0;;) {\n" | 880 "for (var x = 0;;) {\n" |
834 " if (x == 1) break;\n" | 881 " if (x == 1) break;\n" |
835 " if (x == 2) continue;\n" | 882 " if (x == 2) continue;\n" |
836 " x = x + 1;\n" | 883 " x = x + 1;\n" |
837 "}", | 884 "}\n", |
838 | 885 |
839 "var x = 0;\n" | 886 "var x = 0;\n" |
840 "for (;; x = x + 1) {\n" | 887 "for (;; x = x + 1) {\n" |
841 " if (x == 1) break;\n" | 888 " if (x == 1) break;\n" |
842 " if (x == 2) continue;\n" | 889 " if (x == 2) continue;\n" |
843 "}", | 890 "}\n", |
844 | 891 |
845 "for (var x = 0;; x = x + 1) {\n" | 892 "for (var x = 0;; x = x + 1) {\n" |
846 " if (x == 1) break;\n" | 893 " if (x == 1) break;\n" |
847 " if (x == 2) continue;\n" | 894 " if (x == 2) continue;\n" |
848 "}", | 895 "}\n", |
849 | 896 |
850 "var u = 0;\n" | 897 "var u = 0;\n" |
851 "for (var i = 0; i < 100; i = i + 1) {\n" | 898 "for (var i = 0; i < 100; i = i + 1) {\n" |
852 " u = u + 1;\n" | 899 " u = u + 1;\n" |
853 " continue;\n" | 900 " continue;\n" |
854 "}", | 901 "}\n", |
855 | 902 |
856 "var y = 1;\n" | 903 "var y = 1;\n" |
857 "for (var x = 10; x; --x) {\n" | 904 "for (var x = 10; x; --x) {\n" |
858 " y = y * 12;\n" | 905 " y = y * 12;\n" |
859 "}\n" | 906 "}\n" |
860 "return y;", | 907 "return y;\n", |
861 | 908 |
862 "var x = 0;\n" | 909 "var x = 0;\n" |
863 "for (var i = 0; false; i++) {\n" | 910 "for (var i = 0; false; i++) {\n" |
864 " x = x + 1;\n" | 911 " x = x + 1;\n" |
865 "};\n" | 912 "};\n" |
866 "return x;", | 913 "return x;\n", |
867 | 914 |
868 "var x = 0;\n" | 915 "var x = 0;\n" |
869 "for (var i = 0; true; ++i) {\n" | 916 "for (var i = 0; true; ++i) {\n" |
870 " x = x + 1;\n" | 917 " x = x + 1;\n" |
871 " if (x == 20) break;\n" | 918 " if (x == 20) break;\n" |
872 "};\n" | 919 "};\n" |
873 "return x;", | 920 "return x;\n", |
874 | 921 |
875 "var a = 0;\n" | 922 "var a = 0;\n" |
876 "while (a) {\n" | 923 "while (a) {\n" |
877 " { \n" | 924 " { \n" |
878 " let z = 1;\n" | 925 " let z = 1;\n" |
879 " function f() { z = 2; }\n" | 926 " function f() { z = 2; }\n" |
880 " if (z) continue;\n" | 927 " if (z) continue;\n" |
881 " z++;\n" | 928 " z++;\n" |
882 " }\n" | 929 " }\n" |
883 "}", | 930 "}\n", |
884 }; | 931 }; |
885 | 932 |
886 CHECK_EQ(BuildActual(printer, snippets), LoadGolden("BasicLoops.golden")); | 933 CHECK(CompareTexts(BuildActual(printer, snippets), |
| 934 LoadGolden("BasicLoops.golden"))); |
887 } | 935 } |
888 | 936 |
889 TEST(JumpsRequiringConstantWideOperands) { | 937 TEST(JumpsRequiringConstantWideOperands) { |
890 InitializedIgnitionHandleScope scope; | 938 InitializedIgnitionHandleScope scope; |
891 BytecodeExpectationsPrinter printer(CcTest::isolate(), | 939 BytecodeExpectationsPrinter printer(CcTest::isolate(), |
892 ConstantPoolType::kNumber); | 940 ConstantPoolType::kNumber); |
893 const char* snippets[] = { | 941 const char* snippets[] = { |
894 REPEAT_256("var x = 0.1;\n") | 942 REPEAT_256("var x = 0.1;\n") |
895 REPEAT_32("var x = 0.2;\n") | 943 REPEAT_32("var x = 0.2;\n") |
896 REPEAT_16("var x = 0.3;\n") | 944 REPEAT_16("var x = 0.3;\n") |
897 REPEAT_8("var x = 0.4;\n") | 945 REPEAT_8("var x = 0.4;\n") |
898 "for (var i = 0; i < 3; i++) {\n" | 946 "for (var i = 0; i < 3; i++) {\n" |
899 " if (i == 1) continue;\n" | 947 " if (i == 1) continue;\n" |
900 " if (i == 2) break;\n" | 948 " if (i == 2) break;\n" |
901 "}\n" | 949 "}\n" |
902 "return 3;", | 950 "return 3;\n", |
903 }; | 951 }; |
904 | 952 |
905 CHECK_EQ(BuildActual(printer, snippets), | 953 CHECK(CompareTexts(BuildActual(printer, snippets), |
906 LoadGolden("JumpsRequiringConstantWideOperands.golden")); | 954 LoadGolden("JumpsRequiringConstantWideOperands.golden"))); |
907 } | 955 } |
908 | 956 |
909 TEST(UnaryOperators) { | 957 TEST(UnaryOperators) { |
910 InitializedIgnitionHandleScope scope; | 958 InitializedIgnitionHandleScope scope; |
911 BytecodeExpectationsPrinter printer(CcTest::isolate(), | 959 BytecodeExpectationsPrinter printer(CcTest::isolate(), |
912 ConstantPoolType::kNumber); | 960 ConstantPoolType::kNumber); |
913 const char* snippets[] = { | 961 const char* snippets[] = { |
914 "var x = 0;\n" | 962 "var x = 0;\n" |
915 "while (x != 10) {\n" | 963 "while (x != 10) {\n" |
916 " x = x + 10;\n" | 964 " x = x + 10;\n" |
917 "}\n" | 965 "}\n" |
918 "return x;", | 966 "return x;\n", |
919 | 967 |
920 "var x = false;\n" | 968 "var x = false;\n" |
921 "do {\n" | 969 "do {\n" |
922 " x = !x;\n" | 970 " x = !x;\n" |
923 "} while(x == false);\n" | 971 "} while(x == false);\n" |
924 "return x;", | 972 "return x;\n", |
925 | 973 |
926 "var x = 101;\n" | 974 "var x = 101;\n" |
927 "return void(x * 3);", | 975 "return void(x * 3);\n", |
928 | 976 |
929 "var x = 1234;\n" | 977 "var x = 1234;\n" |
930 "var y = void (x * x - 1);\n" | 978 "var y = void (x * x - 1);\n" |
931 "return y;", | 979 "return y;\n", |
932 | 980 |
933 "var x = 13;\n" | 981 "var x = 13;\n" |
934 "return ~x;", | 982 "return ~x;\n", |
935 | 983 |
936 "var x = 13;\n" | 984 "var x = 13;\n" |
937 "return +x;", | 985 "return +x;\n", |
938 | 986 |
939 "var x = 13;\n" | 987 "var x = 13;\n" |
940 "return -x;", | 988 "return -x;\n", |
941 }; | 989 }; |
942 | 990 |
943 CHECK_EQ(BuildActual(printer, snippets), LoadGolden("UnaryOperators.golden")); | 991 CHECK(CompareTexts(BuildActual(printer, snippets), |
| 992 LoadGolden("UnaryOperators.golden"))); |
944 } | 993 } |
945 | 994 |
946 TEST(Typeof) { | 995 TEST(Typeof) { |
947 InitializedIgnitionHandleScope scope; | 996 InitializedIgnitionHandleScope scope; |
948 BytecodeExpectationsPrinter printer(CcTest::isolate(), | 997 BytecodeExpectationsPrinter printer(CcTest::isolate(), |
949 ConstantPoolType::kString); | 998 ConstantPoolType::kString); |
950 printer.set_wrap(false); | 999 printer.set_wrap(false); |
951 printer.set_test_function_name("f"); | 1000 printer.set_test_function_name("f"); |
952 | 1001 |
953 const char* snippets[] = { | 1002 const char* snippets[] = { |
954 "function f() {\n" | 1003 "function f() {\n" |
955 " var x = 13;\n" | 1004 " var x = 13;\n" |
956 " return typeof(x);\n" | 1005 " return typeof(x);\n" |
957 "};", | 1006 "};", |
958 | 1007 |
959 "var x = 13;\n" | 1008 "var x = 13;\n" |
960 "function f() {\n" | 1009 "function f() {\n" |
961 " return typeof(x);\n" | 1010 " return typeof(x);\n" |
962 "};", | 1011 "};", |
963 }; | 1012 }; |
964 | 1013 |
965 CHECK_EQ(BuildActual(printer, snippets, "", "\nf();"), | 1014 CHECK(CompareTexts(BuildActual(printer, snippets, "", "\nf();"), |
966 LoadGolden("Typeof.golden")); | 1015 LoadGolden("Typeof.golden"))); |
967 } | 1016 } |
968 | 1017 |
969 TEST(Delete) { | 1018 TEST(Delete) { |
970 InitializedIgnitionHandleScope scope; | 1019 InitializedIgnitionHandleScope scope; |
971 BytecodeExpectationsPrinter printer(CcTest::isolate(), | 1020 BytecodeExpectationsPrinter printer(CcTest::isolate(), |
972 ConstantPoolType::kMixed); | 1021 ConstantPoolType::kMixed); |
973 | 1022 |
974 const char* snippets[] = { | 1023 const char* snippets[] = { |
975 "var a = {x:13, y:14}; return delete a.x;", | 1024 "var a = {x:13, y:14}; return delete a.x;\n", |
976 | 1025 |
977 "'use strict'; var a = {x:13, y:14}; return delete a.x;", | 1026 "'use strict'; var a = {x:13, y:14}; return delete a.x;\n", |
978 | 1027 |
979 "var a = {1:13, 2:14}; return delete a[2];", | 1028 "var a = {1:13, 2:14}; return delete a[2];\n", |
980 | 1029 |
981 "var a = 10; return delete a;", | 1030 "var a = 10; return delete a;\n", |
982 | 1031 |
983 "'use strict';\n" | 1032 "'use strict';\n" |
984 "var a = {1:10};\n" | 1033 "var a = {1:10};\n" |
985 "(function f1() {return a;});\n" | 1034 "(function f1() {return a;});\n" |
986 "return delete a[1];", | 1035 "return delete a[1];\n", |
987 | 1036 |
988 "return delete 'test';", | 1037 "return delete 'test';\n", |
989 }; | 1038 }; |
990 | 1039 |
991 CHECK_EQ(BuildActual(printer, snippets), LoadGolden("Delete.golden")); | 1040 CHECK(CompareTexts(BuildActual(printer, snippets), |
| 1041 LoadGolden("Delete.golden"))); |
992 } | 1042 } |
993 | 1043 |
994 TEST(GlobalDelete) { | 1044 TEST(GlobalDelete) { |
995 InitializedIgnitionHandleScope scope; | 1045 InitializedIgnitionHandleScope scope; |
996 BytecodeExpectationsPrinter printer(CcTest::isolate(), | 1046 BytecodeExpectationsPrinter printer(CcTest::isolate(), |
997 ConstantPoolType::kMixed); | 1047 ConstantPoolType::kMixed); |
998 printer.set_wrap(false); | 1048 printer.set_wrap(false); |
999 printer.set_test_function_name("f"); | 1049 printer.set_test_function_name("f"); |
1000 | 1050 |
1001 const char* snippets[] = { | 1051 const char* snippets[] = { |
1002 "var a = {x:13, y:14};\n" | 1052 "var a = {x:13, y:14};\n" |
1003 "function f() {\n" | 1053 "function f() {\n" |
1004 " return delete a.x;\n" | 1054 " return delete a.x;\n" |
1005 "};\n" | 1055 "};\n" |
1006 "f();", | 1056 "f();\n", |
1007 | 1057 |
1008 "a = {1:13, 2:14};\n" | 1058 "a = {1:13, 2:14};\n" |
1009 "function f() {\n" | 1059 "function f() {\n" |
1010 " 'use strict';\n" | 1060 " 'use strict';\n" |
1011 " return delete a[1];\n" | 1061 " return delete a[1];\n" |
1012 "};\n" | 1062 "};\n" |
1013 "f();", | 1063 "f();\n", |
1014 | 1064 |
1015 "var a = {x:13, y:14};\n" | 1065 "var a = {x:13, y:14};\n" |
1016 "function f() {\n" | 1066 "function f() {\n" |
1017 " return delete a;\n" | 1067 " return delete a;\n" |
1018 "};\n" | 1068 "};\n" |
1019 "f();", | 1069 "f();\n", |
1020 | 1070 |
1021 "b = 30;\n" | 1071 "b = 30;\n" |
1022 "function f() {\n" | 1072 "function f() {\n" |
1023 " return delete b;\n" | 1073 " return delete b;\n" |
1024 "};\n" | 1074 "};\n" |
1025 "f();", | 1075 "f();\n", |
1026 }; | 1076 }; |
1027 | 1077 |
1028 CHECK_EQ(BuildActual(printer, snippets), LoadGolden("GlobalDelete.golden")); | 1078 CHECK(CompareTexts(BuildActual(printer, snippets), |
| 1079 LoadGolden("GlobalDelete.golden"))); |
1029 } | 1080 } |
1030 | 1081 |
1031 TEST(FunctionLiterals) { | 1082 TEST(FunctionLiterals) { |
1032 InitializedIgnitionHandleScope scope; | 1083 InitializedIgnitionHandleScope scope; |
1033 BytecodeExpectationsPrinter printer(CcTest::isolate(), | 1084 BytecodeExpectationsPrinter printer(CcTest::isolate(), |
1034 ConstantPoolType::kMixed); | 1085 ConstantPoolType::kMixed); |
1035 | 1086 |
1036 const char* snippets[] = { | 1087 const char* snippets[] = { |
1037 "return function(){ }", | 1088 "return function(){ }\n", |
1038 | 1089 |
1039 "return (function(){ })()", | 1090 "return (function(){ })()\n", |
1040 | 1091 |
1041 "return (function(x){ return x; })(1)", | 1092 "return (function(x){ return x; })(1)\n", |
1042 }; | 1093 }; |
1043 | 1094 |
1044 CHECK_EQ(BuildActual(printer, snippets), | 1095 CHECK(CompareTexts(BuildActual(printer, snippets), |
1045 LoadGolden("FunctionLiterals.golden")); | 1096 LoadGolden("FunctionLiterals.golden"))); |
1046 } | 1097 } |
1047 | 1098 |
1048 TEST(RegExpLiterals) { | 1099 TEST(RegExpLiterals) { |
1049 InitializedIgnitionHandleScope scope; | 1100 InitializedIgnitionHandleScope scope; |
1050 BytecodeExpectationsPrinter printer(CcTest::isolate(), | 1101 BytecodeExpectationsPrinter printer(CcTest::isolate(), |
1051 ConstantPoolType::kString); | 1102 ConstantPoolType::kString); |
1052 | 1103 |
1053 const char* snippets[] = { | 1104 const char* snippets[] = { |
1054 "return /ab+d/;", | 1105 "return /ab+d/;\n", |
1055 | 1106 |
1056 "return /(\\w+)\\s(\\w+)/i;", | 1107 "return /(\\w+)\\s(\\w+)/i;\n", |
1057 | 1108 |
1058 "return /ab+d/.exec('abdd');", | 1109 "return /ab+d/.exec('abdd');\n", |
1059 }; | 1110 }; |
1060 | 1111 |
1061 CHECK_EQ(BuildActual(printer, snippets), LoadGolden("RegExpLiterals.golden")); | 1112 CHECK(CompareTexts(BuildActual(printer, snippets), |
| 1113 LoadGolden("RegExpLiterals.golden"))); |
1062 } | 1114 } |
1063 | 1115 |
1064 TEST(RegExpLiteralsWide) { | 1116 TEST(RegExpLiteralsWide) { |
1065 InitializedIgnitionHandleScope scope; | 1117 InitializedIgnitionHandleScope scope; |
1066 BytecodeExpectationsPrinter printer(CcTest::isolate(), | 1118 BytecodeExpectationsPrinter printer(CcTest::isolate(), |
1067 ConstantPoolType::kMixed); | 1119 ConstantPoolType::kMixed); |
1068 | 1120 |
1069 const char* snippets[] = { | 1121 const char* snippets[] = { |
1070 "var a;" // | 1122 "var a;" // |
1071 REPEAT_256("\na = 1.23;") // | 1123 REPEAT_256("\na = 1.23;") // |
1072 "\nreturn /ab+d/;", | 1124 "\nreturn /ab+d/;\n", |
1073 }; | 1125 }; |
1074 | 1126 |
1075 CHECK_EQ(BuildActual(printer, snippets), | 1127 CHECK(CompareTexts(BuildActual(printer, snippets), |
1076 LoadGolden("RegExpLiteralsWide.golden")); | 1128 LoadGolden("RegExpLiteralsWide.golden"))); |
1077 } | 1129 } |
1078 | 1130 |
1079 TEST(ArrayLiterals) { | 1131 TEST(ArrayLiterals) { |
1080 InitializedIgnitionHandleScope scope; | 1132 InitializedIgnitionHandleScope scope; |
1081 BytecodeExpectationsPrinter printer(CcTest::isolate(), | 1133 BytecodeExpectationsPrinter printer(CcTest::isolate(), |
1082 ConstantPoolType::kMixed); | 1134 ConstantPoolType::kMixed); |
1083 | 1135 |
1084 const char* snippets[] = { | 1136 const char* snippets[] = { |
1085 "return [ 1, 2 ];", | 1137 "return [ 1, 2 ];\n", |
1086 | 1138 |
1087 "var a = 1; return [ a, a + 1 ];", | 1139 "var a = 1; return [ a, a + 1 ];\n", |
1088 | 1140 |
1089 "return [ [ 1, 2 ], [ 3 ] ];", | 1141 "return [ [ 1, 2 ], [ 3 ] ];\n", |
1090 | 1142 |
1091 "var a = 1; return [ [ a, 2 ], [ a + 2 ] ];", | 1143 "var a = 1; return [ [ a, 2 ], [ a + 2 ] ];\n", |
1092 }; | 1144 }; |
1093 | 1145 |
1094 CHECK_EQ(BuildActual(printer, snippets), LoadGolden("ArrayLiterals.golden")); | 1146 CHECK(CompareTexts(BuildActual(printer, snippets), |
| 1147 LoadGolden("ArrayLiterals.golden"))); |
1095 } | 1148 } |
1096 | 1149 |
1097 TEST(ArrayLiteralsWide) { | 1150 TEST(ArrayLiteralsWide) { |
1098 InitializedIgnitionHandleScope scope; | 1151 InitializedIgnitionHandleScope scope; |
1099 BytecodeExpectationsPrinter printer(CcTest::isolate(), | 1152 BytecodeExpectationsPrinter printer(CcTest::isolate(), |
1100 ConstantPoolType::kMixed); | 1153 ConstantPoolType::kMixed); |
1101 | 1154 |
1102 const char* snippets[] = { | 1155 const char* snippets[] = { |
1103 "var a;" // | 1156 "var a;" // |
1104 REPEAT_256("\na = 1.23;") // | 1157 REPEAT_256("\na = 1.23;") // |
1105 "\nreturn [ 1 , 2 ];", | 1158 "\nreturn [ 1 , 2 ];\n", |
1106 }; | 1159 }; |
1107 | 1160 |
1108 CHECK_EQ(BuildActual(printer, snippets), | 1161 CHECK(CompareTexts(BuildActual(printer, snippets), |
1109 LoadGolden("ArrayLiteralsWide.golden")); | 1162 LoadGolden("ArrayLiteralsWide.golden"))); |
1110 } | 1163 } |
1111 | 1164 |
1112 TEST(ObjectLiterals) { | 1165 TEST(ObjectLiterals) { |
1113 InitializedIgnitionHandleScope scope; | 1166 InitializedIgnitionHandleScope scope; |
1114 BytecodeExpectationsPrinter printer(CcTest::isolate(), | 1167 BytecodeExpectationsPrinter printer(CcTest::isolate(), |
1115 ConstantPoolType::kMixed); | 1168 ConstantPoolType::kMixed); |
1116 | 1169 |
1117 const char* snippets[] = { | 1170 const char* snippets[] = { |
1118 "return { };", | 1171 "return { };\n", |
1119 | 1172 |
1120 "return { name: 'string', val: 9.2 };", | 1173 "return { name: 'string', val: 9.2 };\n", |
1121 | 1174 |
1122 "var a = 1; return { name: 'string', val: a };", | 1175 "var a = 1; return { name: 'string', val: a };\n", |
1123 | 1176 |
1124 "var a = 1; return { val: a, val: a + 1 };", | 1177 "var a = 1; return { val: a, val: a + 1 };\n", |
1125 | 1178 |
1126 "return { func: function() { } };", | 1179 "return { func: function() { } };\n", |
1127 | 1180 |
1128 "return { func(a) { return a; } };", | 1181 "return { func(a) { return a; } };\n", |
1129 | 1182 |
1130 "return { get a() { return 2; } };", | 1183 "return { get a() { return 2; } };\n", |
1131 | 1184 |
1132 "return { get a() { return this.x; }, set a(val) { this.x = val } };", | 1185 "return { get a() { return this.x; }, set a(val) { this.x = val } };\n", |
1133 | 1186 |
1134 "return { set b(val) { this.y = val } };", | 1187 "return { set b(val) { this.y = val } };\n", |
1135 | 1188 |
1136 "var a = 1; return { 1: a };", | 1189 "var a = 1; return { 1: a };\n", |
1137 | 1190 |
1138 "return { __proto__: null };", | 1191 "return { __proto__: null };\n", |
1139 | 1192 |
1140 "var a = 'test'; return { [a]: 1 };", | 1193 "var a = 'test'; return { [a]: 1 };\n", |
1141 | 1194 |
1142 "var a = 'test'; return { val: a, [a]: 1 };", | 1195 "var a = 'test'; return { val: a, [a]: 1 };\n", |
1143 | 1196 |
1144 "var a = 'test'; return { [a]: 1, __proto__: {} };", | 1197 "var a = 'test'; return { [a]: 1, __proto__: {} };\n", |
1145 | 1198 |
1146 "var n = 'name'; return { [n]: 'val', get a() { }, set a(b) {} };", | 1199 "var n = 'name'; return { [n]: 'val', get a() { }, set a(b) {} };\n", |
1147 }; | 1200 }; |
1148 | 1201 |
1149 CHECK_EQ(BuildActual(printer, snippets), LoadGolden("ObjectLiterals.golden")); | 1202 CHECK(CompareTexts(BuildActual(printer, snippets), |
| 1203 LoadGolden("ObjectLiterals.golden"))); |
1150 } | 1204 } |
1151 | 1205 |
1152 TEST(ObjectLiteralsWide) { | 1206 TEST(ObjectLiteralsWide) { |
1153 InitializedIgnitionHandleScope scope; | 1207 InitializedIgnitionHandleScope scope; |
1154 BytecodeExpectationsPrinter printer(CcTest::isolate(), | 1208 BytecodeExpectationsPrinter printer(CcTest::isolate(), |
1155 ConstantPoolType::kMixed); | 1209 ConstantPoolType::kMixed); |
1156 const char* snippets[] = { | 1210 const char* snippets[] = { |
1157 "var a;" // | 1211 "var a;" // |
1158 REPEAT_256("\na = 1.23;") // | 1212 REPEAT_256("\na = 1.23;") // |
1159 "\nreturn { name: 'string', val: 9.2 };", | 1213 "\nreturn { name: 'string', val: 9.2 };\n", |
1160 }; | 1214 }; |
1161 | 1215 |
1162 CHECK_EQ(BuildActual(printer, snippets), | 1216 CHECK(CompareTexts(BuildActual(printer, snippets), |
1163 LoadGolden("ObjectLiteralsWide.golden")); | 1217 LoadGolden("ObjectLiteralsWide.golden"))); |
1164 } | 1218 } |
1165 | 1219 |
1166 TEST(TopLevelObjectLiterals) { | 1220 TEST(TopLevelObjectLiterals) { |
1167 InitializedIgnitionHandleScope scope; | 1221 InitializedIgnitionHandleScope scope; |
1168 BytecodeExpectationsPrinter printer(CcTest::isolate(), | 1222 BytecodeExpectationsPrinter printer(CcTest::isolate(), |
1169 ConstantPoolType::kMixed); | 1223 ConstantPoolType::kMixed); |
1170 printer.set_wrap(false); | 1224 printer.set_wrap(false); |
1171 printer.set_test_function_name("f"); | 1225 printer.set_test_function_name("f"); |
1172 printer.set_execute(false); | 1226 printer.set_execute(false); |
1173 printer.set_top_level(true); | 1227 printer.set_top_level(true); |
1174 | 1228 |
1175 const char* snippets[] = { | 1229 const char* snippets[] = { |
1176 "var a = { func: function() { } };", | 1230 "var a = { func: function() { } };\n", |
1177 }; | 1231 }; |
1178 | 1232 |
1179 CHECK_EQ(BuildActual(printer, snippets), | 1233 CHECK(CompareTexts(BuildActual(printer, snippets), |
1180 LoadGolden("TopLevelObjectLiterals.golden")); | 1234 LoadGolden("TopLevelObjectLiterals.golden"))); |
1181 } | 1235 } |
1182 | 1236 |
1183 TEST(TryCatch) { | 1237 TEST(TryCatch) { |
1184 InitializedIgnitionHandleScope scope; | 1238 InitializedIgnitionHandleScope scope; |
1185 BytecodeExpectationsPrinter printer(CcTest::isolate(), | 1239 BytecodeExpectationsPrinter printer(CcTest::isolate(), |
1186 ConstantPoolType::kString); | 1240 ConstantPoolType::kString); |
1187 | 1241 |
1188 const char* snippets[] = { | 1242 const char* snippets[] = { |
1189 "try { return 1; } catch(e) { return 2; }", | 1243 "try { return 1; } catch(e) { return 2; }\n", |
1190 | 1244 |
1191 "var a;\n" | 1245 "var a;\n" |
1192 "try { a = 1 } catch(e1) {};\n" | 1246 "try { a = 1 } catch(e1) {};\n" |
1193 "try { a = 2 } catch(e2) { a = 3 }", | 1247 "try { a = 2 } catch(e2) { a = 3 }\n", |
1194 }; | 1248 }; |
1195 | 1249 |
1196 CHECK_EQ(BuildActual(printer, snippets), LoadGolden("TryCatch.golden")); | 1250 CHECK(CompareTexts(BuildActual(printer, snippets), |
| 1251 LoadGolden("TryCatch.golden"))); |
1197 } | 1252 } |
1198 | 1253 |
1199 TEST(TryFinally) { | 1254 TEST(TryFinally) { |
1200 InitializedIgnitionHandleScope scope; | 1255 InitializedIgnitionHandleScope scope; |
1201 BytecodeExpectationsPrinter printer(CcTest::isolate(), | 1256 BytecodeExpectationsPrinter printer(CcTest::isolate(), |
1202 ConstantPoolType::kString); | 1257 ConstantPoolType::kString); |
1203 const char* snippets[] = { | 1258 const char* snippets[] = { |
1204 "var a = 1;\n" | 1259 "var a = 1;\n" |
1205 "try { a = 2; } finally { a = 3; }", | 1260 "try { a = 2; } finally { a = 3; }\n", |
1206 | 1261 |
1207 "var a = 1;\n" | 1262 "var a = 1;\n" |
1208 "try { a = 2; } catch(e) { a = 20 } finally { a = 3; }", | 1263 "try { a = 2; } catch(e) { a = 20 } finally { a = 3; }\n", |
1209 | 1264 |
1210 "var a; try {\n" | 1265 "var a; try {\n" |
1211 " try { a = 1 } catch(e) { a = 2 }\n" | 1266 " try { a = 1 } catch(e) { a = 2 }\n" |
1212 "} catch(e) { a = 20 } finally { a = 3; }", | 1267 "} catch(e) { a = 20 } finally { a = 3; }\n", |
1213 }; | 1268 }; |
1214 | 1269 |
1215 CHECK_EQ(BuildActual(printer, snippets), LoadGolden("TryFinally.golden")); | 1270 CHECK(CompareTexts(BuildActual(printer, snippets), |
| 1271 LoadGolden("TryFinally.golden"))); |
1216 } | 1272 } |
1217 | 1273 |
1218 TEST(Throw) { | 1274 TEST(Throw) { |
1219 InitializedIgnitionHandleScope scope; | 1275 InitializedIgnitionHandleScope scope; |
1220 BytecodeExpectationsPrinter printer(CcTest::isolate(), | 1276 BytecodeExpectationsPrinter printer(CcTest::isolate(), |
1221 ConstantPoolType::kString); | 1277 ConstantPoolType::kString); |
1222 const char* snippets[] = { | 1278 const char* snippets[] = { |
1223 "throw 1;", | 1279 "throw 1;\n", |
1224 | 1280 |
1225 "throw 'Error';", | 1281 "throw 'Error';\n", |
1226 | 1282 |
1227 "var a = 1; if (a) { throw 'Error'; };", | 1283 "var a = 1; if (a) { throw 'Error'; };\n", |
1228 }; | 1284 }; |
1229 | 1285 |
1230 CHECK_EQ(BuildActual(printer, snippets), LoadGolden("Throw.golden")); | 1286 CHECK( |
| 1287 CompareTexts(BuildActual(printer, snippets), LoadGolden("Throw.golden"))); |
1231 } | 1288 } |
1232 | 1289 |
1233 TEST(CallNew) { | 1290 TEST(CallNew) { |
1234 InitializedIgnitionHandleScope scope; | 1291 InitializedIgnitionHandleScope scope; |
1235 BytecodeExpectationsPrinter printer(CcTest::isolate(), | 1292 BytecodeExpectationsPrinter printer(CcTest::isolate(), |
1236 ConstantPoolType::kMixed); | 1293 ConstantPoolType::kMixed); |
1237 printer.set_wrap(false); | 1294 printer.set_wrap(false); |
1238 printer.set_test_function_name("f"); | 1295 printer.set_test_function_name("f"); |
1239 | 1296 |
1240 const char* snippets[] = { | 1297 const char* snippets[] = { |
1241 "function bar() { this.value = 0; }\n" | 1298 "function bar() { this.value = 0; }\n" |
1242 "function f() { return new bar(); }\n" | 1299 "function f() { return new bar(); }\n" |
1243 "f();", | 1300 "f();\n", |
1244 | 1301 |
1245 "function bar(x) { this.value = 18; this.x = x;}\n" | 1302 "function bar(x) { this.value = 18; this.x = x;}\n" |
1246 "function f() { return new bar(3); }\n" | 1303 "function f() { return new bar(3); }\n" |
1247 "f();", | 1304 "f();\n", |
1248 | 1305 |
1249 "function bar(w, x, y, z) {\n" | 1306 "function bar(w, x, y, z) {\n" |
1250 " this.value = 18;\n" | 1307 " this.value = 18;\n" |
1251 " this.x = x;\n" | 1308 " this.x = x;\n" |
1252 " this.y = y;\n" | 1309 " this.y = y;\n" |
1253 " this.z = z;\n" | 1310 " this.z = z;\n" |
1254 "}\n" | 1311 "}\n" |
1255 "function f() { return new bar(3, 4, 5); }\n" | 1312 "function f() { return new bar(3, 4, 5); }\n" |
1256 "f();", | 1313 "f();\n", |
1257 }; | 1314 }; |
1258 | 1315 |
1259 CHECK_EQ(BuildActual(printer, snippets), LoadGolden("CallNew.golden")); | 1316 CHECK(CompareTexts(BuildActual(printer, snippets), |
| 1317 LoadGolden("CallNew.golden"))); |
1260 } | 1318 } |
1261 | 1319 |
1262 TEST(ContextVariables) { | 1320 TEST(ContextVariables) { |
1263 // The wide check below relies on MIN_CONTEXT_SLOTS + 3 + 249 == 256, if this | 1321 // The wide check below relies on MIN_CONTEXT_SLOTS + 3 + 249 == 256, if this |
1264 // ever changes, the REPEAT_XXX should be changed to output the correct number | 1322 // ever changes, the REPEAT_XXX should be changed to output the correct number |
1265 // of unique variables to trigger the wide slot load / store. | 1323 // of unique variables to trigger the wide slot load / store. |
1266 STATIC_ASSERT(Context::MIN_CONTEXT_SLOTS + 3 + 249 == 256); | 1324 STATIC_ASSERT(Context::MIN_CONTEXT_SLOTS + 3 + 249 == 256); |
1267 | 1325 |
1268 InitializedIgnitionHandleScope scope; | 1326 InitializedIgnitionHandleScope scope; |
1269 BytecodeExpectationsPrinter printer(CcTest::isolate(), | 1327 BytecodeExpectationsPrinter printer(CcTest::isolate(), |
1270 ConstantPoolType::kMixed); | 1328 ConstantPoolType::kMixed); |
1271 const char* snippets[] = { | 1329 const char* snippets[] = { |
1272 "var a; return function() { a = 1; };", | 1330 "var a; return function() { a = 1; };\n", |
1273 | 1331 |
1274 "var a = 1; return function() { a = 2; };", | 1332 "var a = 1; return function() { a = 2; };\n", |
1275 | 1333 |
1276 "var a = 1; var b = 2; return function() { a = 2; b = 3 };", | 1334 "var a = 1; var b = 2; return function() { a = 2; b = 3 };\n", |
1277 | 1335 |
1278 "var a; (function() { a = 2; })(); return a;", | 1336 "var a; (function() { a = 2; })(); return a;\n", |
1279 | 1337 |
1280 "'use strict';\n" | 1338 "'use strict';\n" |
1281 "let a = 1;\n" | 1339 "let a = 1;\n" |
1282 "{ let b = 2; return function() { a + b; }; }", | 1340 "{ let b = 2; return function() { a + b; }; }\n", |
1283 | 1341 |
1284 "'use strict';\n" | 1342 "'use strict';\n" |
1285 REPEAT_249_UNIQUE_VARS() | 1343 REPEAT_249_UNIQUE_VARS() |
1286 "eval();\n" | 1344 "eval();\n" |
1287 "var b = 100;\n" | 1345 "var b = 100;\n" |
1288 "return b", | 1346 "return b\n", |
1289 }; | 1347 }; |
1290 | 1348 |
1291 CHECK_EQ(BuildActual(printer, snippets), | 1349 CHECK(CompareTexts(BuildActual(printer, snippets), |
1292 LoadGolden("ContextVariables.golden")); | 1350 LoadGolden("ContextVariables.golden"))); |
1293 } | 1351 } |
1294 | 1352 |
1295 TEST(ContextParameters) { | 1353 TEST(ContextParameters) { |
1296 InitializedIgnitionHandleScope scope; | 1354 InitializedIgnitionHandleScope scope; |
1297 BytecodeExpectationsPrinter printer(CcTest::isolate(), | 1355 BytecodeExpectationsPrinter printer(CcTest::isolate(), |
1298 ConstantPoolType::kMixed); | 1356 ConstantPoolType::kMixed); |
1299 printer.set_wrap(false); | 1357 printer.set_wrap(false); |
1300 printer.set_test_function_name("f"); | 1358 printer.set_test_function_name("f"); |
1301 | 1359 |
1302 const char* snippets[] = { | 1360 const char* snippets[] = { |
1303 "function f(arg1) { return function() { arg1 = 2; }; }", | 1361 "function f(arg1) { return function() { arg1 = 2; }; }", |
1304 | 1362 |
1305 "function f(arg1) { var a = function() { arg1 = 2; }; return arg1; }", | 1363 "function f(arg1) { var a = function() { arg1 = 2; }; return arg1; }", |
1306 | 1364 |
1307 "function f(a1, a2, a3, a4) { return function() { a1 = a3; }; }", | 1365 "function f(a1, a2, a3, a4) { return function() { a1 = a3; }; }", |
1308 | 1366 |
1309 "function f() { var self = this; return function() { self = 2; }; }", | 1367 "function f() { var self = this; return function() { self = 2; }; }", |
1310 }; | 1368 }; |
1311 | 1369 |
1312 CHECK_EQ(BuildActual(printer, snippets, "", "\nf();"), | 1370 CHECK(CompareTexts(BuildActual(printer, snippets, "", "\nf();"), |
1313 LoadGolden("ContextParameters.golden")); | 1371 LoadGolden("ContextParameters.golden"))); |
1314 } | 1372 } |
1315 | 1373 |
1316 TEST(OuterContextVariables) { | 1374 TEST(OuterContextVariables) { |
1317 InitializedIgnitionHandleScope scope; | 1375 InitializedIgnitionHandleScope scope; |
1318 BytecodeExpectationsPrinter printer(CcTest::isolate(), | 1376 BytecodeExpectationsPrinter printer(CcTest::isolate(), |
1319 ConstantPoolType::kMixed); | 1377 ConstantPoolType::kMixed); |
1320 printer.set_wrap(false); | 1378 printer.set_wrap(false); |
1321 printer.set_test_function_name("f"); | 1379 printer.set_test_function_name("f"); |
1322 | 1380 |
1323 const char* snippets[] = { | 1381 const char* snippets[] = { |
1324 "function Outer() {\n" | 1382 "function Outer() {\n" |
1325 " var outerVar = 1;\n" | 1383 " var outerVar = 1;\n" |
1326 " function Inner(innerArg) {\n" | 1384 " function Inner(innerArg) {\n" |
1327 " this.innerFunc = function() { return outerVar * innerArg; }\n" | 1385 " this.innerFunc = function() { return outerVar * innerArg; }\n" |
1328 " }\n" | 1386 " }\n" |
1329 " this.getInnerFunc = function() { return new Inner(1).innerFunc; }\n" | 1387 " this.getInnerFunc = function() { return new Inner(1).innerFunc; }\n" |
1330 "}\n" | 1388 "}\n" |
1331 "var f = new Outer().getInnerFunc();", | 1389 "var f = new Outer().getInnerFunc();", |
1332 | 1390 |
1333 "function Outer() {\n" | 1391 "function Outer() {\n" |
1334 " var outerVar = 1;\n" | 1392 " var outerVar = 1;\n" |
1335 " function Inner(innerArg) {\n" | 1393 " function Inner(innerArg) {\n" |
1336 " this.innerFunc = function() { outerVar = innerArg; }\n" | 1394 " this.innerFunc = function() { outerVar = innerArg; }\n" |
1337 " }\n" | 1395 " }\n" |
1338 " this.getInnerFunc = function() { return new Inner(1).innerFunc; }\n" | 1396 " this.getInnerFunc = function() { return new Inner(1).innerFunc; }\n" |
1339 "}\n" | 1397 "}\n" |
1340 "var f = new Outer().getInnerFunc();", | 1398 "var f = new Outer().getInnerFunc();", |
1341 }; | 1399 }; |
1342 | 1400 |
1343 CHECK_EQ(BuildActual(printer, snippets, "", "\nf();"), | 1401 CHECK(CompareTexts(BuildActual(printer, snippets, "", "\nf();"), |
1344 LoadGolden("OuterContextVariables.golden")); | 1402 LoadGolden("OuterContextVariables.golden"))); |
1345 } | 1403 } |
1346 | 1404 |
1347 TEST(CountOperators) { | 1405 TEST(CountOperators) { |
1348 InitializedIgnitionHandleScope scope; | 1406 InitializedIgnitionHandleScope scope; |
1349 BytecodeExpectationsPrinter printer(CcTest::isolate(), | 1407 BytecodeExpectationsPrinter printer(CcTest::isolate(), |
1350 ConstantPoolType::kMixed); | 1408 ConstantPoolType::kMixed); |
1351 const char* snippets[] = { | 1409 const char* snippets[] = { |
1352 "var a = 1; return ++a;", | 1410 "var a = 1; return ++a;\n", |
1353 | 1411 |
1354 "var a = 1; return a++;", | 1412 "var a = 1; return a++;\n", |
1355 | 1413 |
1356 "var a = 1; return --a;", | 1414 "var a = 1; return --a;\n", |
1357 | 1415 |
1358 "var a = 1; return a--;", | 1416 "var a = 1; return a--;\n", |
1359 | 1417 |
1360 "var a = { val: 1 }; return a.val++;", | 1418 "var a = { val: 1 }; return a.val++;\n", |
1361 | 1419 |
1362 "var a = { val: 1 }; return --a.val;", | 1420 "var a = { val: 1 }; return --a.val;\n", |
1363 | 1421 |
1364 "var name = 'var'; var a = { val: 1 }; return a[name]--;", | 1422 "var name = 'var'; var a = { val: 1 }; return a[name]--;\n", |
1365 | 1423 |
1366 "var name = 'var'; var a = { val: 1 }; return ++a[name];", | 1424 "var name = 'var'; var a = { val: 1 }; return ++a[name];\n", |
1367 | 1425 |
1368 "var a = 1; var b = function() { return a }; return ++a;", | 1426 "var a = 1; var b = function() { return a }; return ++a;\n", |
1369 | 1427 |
1370 "var a = 1; var b = function() { return a }; return a--;", | 1428 "var a = 1; var b = function() { return a }; return a--;\n", |
1371 | 1429 |
1372 "var idx = 1; var a = [1, 2]; return a[idx++] = 2;", | 1430 "var idx = 1; var a = [1, 2]; return a[idx++] = 2;\n", |
1373 }; | 1431 }; |
1374 | 1432 |
1375 CHECK_EQ(BuildActual(printer, snippets), LoadGolden("CountOperators.golden")); | 1433 CHECK(CompareTexts(BuildActual(printer, snippets), |
| 1434 LoadGolden("CountOperators.golden"))); |
1376 } | 1435 } |
1377 | 1436 |
1378 TEST(GlobalCountOperators) { | 1437 TEST(GlobalCountOperators) { |
1379 InitializedIgnitionHandleScope scope; | 1438 InitializedIgnitionHandleScope scope; |
1380 BytecodeExpectationsPrinter printer(CcTest::isolate(), | 1439 BytecodeExpectationsPrinter printer(CcTest::isolate(), |
1381 ConstantPoolType::kString); | 1440 ConstantPoolType::kString); |
1382 printer.set_wrap(false); | 1441 printer.set_wrap(false); |
1383 printer.set_test_function_name("f"); | 1442 printer.set_test_function_name("f"); |
1384 | 1443 |
1385 const char* snippets[] = { | 1444 const char* snippets[] = { |
1386 "var global = 1;\n" | 1445 "var global = 1;\n" |
1387 "function f() { return ++global; }\n" | 1446 "function f() { return ++global; }\n" |
1388 "f();", | 1447 "f();\n", |
1389 | 1448 |
1390 "var global = 1;\n" | 1449 "var global = 1;\n" |
1391 "function f() { return global--; }\n" | 1450 "function f() { return global--; }\n" |
1392 "f();", | 1451 "f();\n", |
1393 | 1452 |
1394 "unallocated = 1;\n" | 1453 "unallocated = 1;\n" |
1395 "function f() { 'use strict'; return --unallocated; }\n" | 1454 "function f() { 'use strict'; return --unallocated; }\n" |
1396 "f();", | 1455 "f();\n", |
1397 | 1456 |
1398 "unallocated = 1;\n" | 1457 "unallocated = 1;\n" |
1399 "function f() { return unallocated++; }\n" | 1458 "function f() { return unallocated++; }\n" |
1400 "f();", | 1459 "f();\n", |
1401 }; | 1460 }; |
1402 | 1461 |
1403 CHECK_EQ(BuildActual(printer, snippets), | 1462 CHECK(CompareTexts(BuildActual(printer, snippets), |
1404 LoadGolden("GlobalCountOperators.golden")); | 1463 LoadGolden("GlobalCountOperators.golden"))); |
1405 } | 1464 } |
1406 | 1465 |
1407 TEST(CompoundExpressions) { | 1466 TEST(CompoundExpressions) { |
1408 InitializedIgnitionHandleScope scope; | 1467 InitializedIgnitionHandleScope scope; |
1409 BytecodeExpectationsPrinter printer(CcTest::isolate(), | 1468 BytecodeExpectationsPrinter printer(CcTest::isolate(), |
1410 ConstantPoolType::kMixed); | 1469 ConstantPoolType::kMixed); |
1411 const char* snippets[] = { | 1470 const char* snippets[] = { |
1412 "var a = 1; a += 2;", | 1471 "var a = 1; a += 2;\n", |
1413 | 1472 |
1414 "var a = 1; a /= 2;", | 1473 "var a = 1; a /= 2;\n", |
1415 | 1474 |
1416 "var a = { val: 2 }; a.name *= 2;", | 1475 "var a = { val: 2 }; a.name *= 2;\n", |
1417 | 1476 |
1418 "var a = { 1: 2 }; a[1] ^= 2;", | 1477 "var a = { 1: 2 }; a[1] ^= 2;\n", |
1419 | 1478 |
1420 "var a = 1; (function f() { return a; }); a |= 24;", | 1479 "var a = 1; (function f() { return a; }); a |= 24;\n", |
1421 }; | 1480 }; |
1422 | 1481 |
1423 CHECK_EQ(BuildActual(printer, snippets), | 1482 CHECK(CompareTexts(BuildActual(printer, snippets), |
1424 LoadGolden("CompoundExpressions.golden")); | 1483 LoadGolden("CompoundExpressions.golden"))); |
1425 } | 1484 } |
1426 | 1485 |
1427 TEST(GlobalCompoundExpressions) { | 1486 TEST(GlobalCompoundExpressions) { |
1428 InitializedIgnitionHandleScope scope; | 1487 InitializedIgnitionHandleScope scope; |
1429 BytecodeExpectationsPrinter printer(CcTest::isolate(), | 1488 BytecodeExpectationsPrinter printer(CcTest::isolate(), |
1430 ConstantPoolType::kString); | 1489 ConstantPoolType::kString); |
1431 printer.set_wrap(false); | 1490 printer.set_wrap(false); |
1432 printer.set_test_function_name("f"); | 1491 printer.set_test_function_name("f"); |
1433 | 1492 |
1434 const char* snippets[] = { | 1493 const char* snippets[] = { |
1435 "var global = 1;\n" | 1494 "var global = 1;\n" |
1436 "function f() { return global &= 1; }\n" | 1495 "function f() { return global &= 1; }\n" |
1437 "f();", | 1496 "f();\n", |
1438 | 1497 |
1439 "unallocated = 1;\n" | 1498 "unallocated = 1;\n" |
1440 "function f() { return unallocated += 1; }\n" | 1499 "function f() { return unallocated += 1; }\n" |
1441 "f();", | 1500 "f();\n", |
1442 }; | 1501 }; |
1443 | 1502 |
1444 CHECK_EQ(BuildActual(printer, snippets), | 1503 CHECK(CompareTexts(BuildActual(printer, snippets), |
1445 LoadGolden("GlobalCompoundExpressions.golden")); | 1504 LoadGolden("GlobalCompoundExpressions.golden"))); |
1446 } | 1505 } |
1447 | 1506 |
1448 TEST(CreateArguments) { | 1507 TEST(CreateArguments) { |
1449 InitializedIgnitionHandleScope scope; | 1508 InitializedIgnitionHandleScope scope; |
1450 BytecodeExpectationsPrinter printer(CcTest::isolate(), | 1509 BytecodeExpectationsPrinter printer(CcTest::isolate(), |
1451 ConstantPoolType::kString); | 1510 ConstantPoolType::kString); |
1452 printer.set_wrap(false); | 1511 printer.set_wrap(false); |
1453 printer.set_test_function_name("f"); | 1512 printer.set_test_function_name("f"); |
1454 | 1513 |
1455 const char* snippets[] = { | 1514 const char* snippets[] = { |
1456 "function f() { return arguments; }", | 1515 "function f() { return arguments; }", |
1457 | 1516 |
1458 "function f() { return arguments[0]; }", | 1517 "function f() { return arguments[0]; }", |
1459 | 1518 |
1460 "function f() { 'use strict'; return arguments; }", | 1519 "function f() { 'use strict'; return arguments; }", |
1461 | 1520 |
1462 "function f(a) { return arguments[0]; }", | 1521 "function f(a) { return arguments[0]; }", |
1463 | 1522 |
1464 "function f(a, b, c) { return arguments; }", | 1523 "function f(a, b, c) { return arguments; }", |
1465 | 1524 |
1466 "function f(a, b, c) { 'use strict'; return arguments; }", | 1525 "function f(a, b, c) { 'use strict'; return arguments; }", |
1467 }; | 1526 }; |
1468 | 1527 |
1469 CHECK_EQ(BuildActual(printer, snippets, "", "\nf();"), | 1528 CHECK(CompareTexts(BuildActual(printer, snippets, "", "\nf();"), |
1470 LoadGolden("CreateArguments.golden")); | 1529 LoadGolden("CreateArguments.golden"))); |
1471 } | 1530 } |
1472 | 1531 |
1473 TEST(CreateRestParameter) { | 1532 TEST(CreateRestParameter) { |
1474 InitializedIgnitionHandleScope scope; | 1533 InitializedIgnitionHandleScope scope; |
1475 BytecodeExpectationsPrinter printer(CcTest::isolate(), | 1534 BytecodeExpectationsPrinter printer(CcTest::isolate(), |
1476 ConstantPoolType::kNumber); | 1535 ConstantPoolType::kNumber); |
1477 printer.set_wrap(false); | 1536 printer.set_wrap(false); |
1478 printer.set_test_function_name("f"); | 1537 printer.set_test_function_name("f"); |
1479 | 1538 |
1480 const char* snippets[] = { | 1539 const char* snippets[] = { |
1481 "function f(...restArgs) { return restArgs; }", | 1540 "function f(...restArgs) { return restArgs; }", |
1482 | 1541 |
1483 "function f(a, ...restArgs) { return restArgs; }", | 1542 "function f(a, ...restArgs) { return restArgs; }", |
1484 | 1543 |
1485 "function f(a, ...restArgs) { return restArgs[0]; }", | 1544 "function f(a, ...restArgs) { return restArgs[0]; }", |
1486 | 1545 |
1487 "function f(a, ...restArgs) { return restArgs[0] + arguments[0]; }", | 1546 "function f(a, ...restArgs) { return restArgs[0] + arguments[0]; }", |
1488 }; | 1547 }; |
1489 | 1548 |
1490 CHECK_EQ(BuildActual(printer, snippets, "", "\nf();"), | 1549 CHECK(CompareTexts(BuildActual(printer, snippets, "", "\nf();"), |
1491 LoadGolden("CreateRestParameter.golden")); | 1550 LoadGolden("CreateRestParameter.golden"))); |
1492 } | 1551 } |
1493 | 1552 |
1494 TEST(ForIn) { | 1553 TEST(ForIn) { |
1495 InitializedIgnitionHandleScope scope; | 1554 InitializedIgnitionHandleScope scope; |
1496 BytecodeExpectationsPrinter printer(CcTest::isolate(), | 1555 BytecodeExpectationsPrinter printer(CcTest::isolate(), |
1497 ConstantPoolType::kMixed); | 1556 ConstantPoolType::kMixed); |
1498 const char* snippets[] = { | 1557 const char* snippets[] = { |
1499 "for (var p in null) {}", | 1558 "for (var p in null) {}\n", |
1500 | 1559 |
1501 "for (var p in undefined) {}", | 1560 "for (var p in undefined) {}\n", |
1502 | 1561 |
1503 "for (var p in undefined) {}", | 1562 "for (var p in undefined) {}\n", |
1504 | 1563 |
1505 "var x = 'potatoes';\n" | 1564 "var x = 'potatoes';\n" |
1506 "for (var p in x) { return p; }", | 1565 "for (var p in x) { return p; }\n", |
1507 | 1566 |
1508 "var x = 0;\n" | 1567 "var x = 0;\n" |
1509 "for (var p in [1,2,3]) { x += p; }", | 1568 "for (var p in [1,2,3]) { x += p; }\n", |
1510 | 1569 |
1511 "var x = { 'a': 1, 'b': 2 };\n" | 1570 "var x = { 'a': 1, 'b': 2 };\n" |
1512 "for (x['a'] in [10, 20, 30]) {\n" | 1571 "for (x['a'] in [10, 20, 30]) {\n" |
1513 " if (x['a'] == 10) continue;\n" | 1572 " if (x['a'] == 10) continue;\n" |
1514 " if (x['a'] == 20) break;\n" | 1573 " if (x['a'] == 20) break;\n" |
1515 "}", | 1574 "}\n", |
1516 | 1575 |
1517 "var x = [ 10, 11, 12 ] ;\n" | 1576 "var x = [ 10, 11, 12 ] ;\n" |
1518 "for (x[0] in [1,2,3]) { return x[3]; }", | 1577 "for (x[0] in [1,2,3]) { return x[3]; }\n", |
1519 }; | 1578 }; |
1520 | 1579 |
1521 CHECK_EQ(BuildActual(printer, snippets), LoadGolden("ForIn.golden")); | 1580 CHECK( |
| 1581 CompareTexts(BuildActual(printer, snippets), LoadGolden("ForIn.golden"))); |
1522 } | 1582 } |
1523 | 1583 |
1524 TEST(ForOf) { | 1584 TEST(ForOf) { |
1525 InitializedIgnitionHandleScope scope; | 1585 InitializedIgnitionHandleScope scope; |
1526 BytecodeExpectationsPrinter printer(CcTest::isolate(), | 1586 BytecodeExpectationsPrinter printer(CcTest::isolate(), |
1527 ConstantPoolType::kMixed); | 1587 ConstantPoolType::kMixed); |
1528 const char* snippets[] = { | 1588 const char* snippets[] = { |
1529 "for (var p of [0, 1, 2]) {}", | 1589 "for (var p of [0, 1, 2]) {}\n", |
1530 | 1590 |
1531 "var x = 'potatoes';\n" | 1591 "var x = 'potatoes';\n" |
1532 "for (var p of x) { return p; }", | 1592 "for (var p of x) { return p; }\n", |
1533 | 1593 |
1534 "for (var x of [10, 20, 30]) {\n" | 1594 "for (var x of [10, 20, 30]) {\n" |
1535 " if (x == 10) continue;\n" | 1595 " if (x == 10) continue;\n" |
1536 " if (x == 20) break;\n" | 1596 " if (x == 20) break;\n" |
1537 "}", | 1597 "}\n", |
1538 | 1598 |
1539 "var x = { 'a': 1, 'b': 2 };\n" | 1599 "var x = { 'a': 1, 'b': 2 };\n" |
1540 "for (x['a'] of [1,2,3]) { return x['a']; }", | 1600 "for (x['a'] of [1,2,3]) { return x['a']; }\n", |
1541 }; | 1601 }; |
1542 | 1602 |
1543 CHECK_EQ(BuildActual(printer, snippets), LoadGolden("ForOf.golden")); | 1603 CHECK( |
| 1604 CompareTexts(BuildActual(printer, snippets), LoadGolden("ForOf.golden"))); |
1544 } | 1605 } |
1545 | 1606 |
1546 TEST(Conditional) { | 1607 TEST(Conditional) { |
1547 InitializedIgnitionHandleScope scope; | 1608 InitializedIgnitionHandleScope scope; |
1548 BytecodeExpectationsPrinter printer(CcTest::isolate(), | 1609 BytecodeExpectationsPrinter printer(CcTest::isolate(), |
1549 ConstantPoolType::kNumber); | 1610 ConstantPoolType::kNumber); |
1550 const char* snippets[] = { | 1611 const char* snippets[] = { |
1551 "return 1 ? 2 : 3;", | 1612 "return 1 ? 2 : 3;\n", |
1552 | 1613 |
1553 "return 1 ? 2 ? 3 : 4 : 5;", | 1614 "return 1 ? 2 ? 3 : 4 : 5;\n", |
1554 }; | 1615 }; |
1555 | 1616 |
1556 CHECK_EQ(BuildActual(printer, snippets), LoadGolden("Conditional.golden")); | 1617 CHECK(CompareTexts(BuildActual(printer, snippets), |
| 1618 LoadGolden("Conditional.golden"))); |
1557 } | 1619 } |
1558 | 1620 |
1559 TEST(Switch) { | 1621 TEST(Switch) { |
1560 InitializedIgnitionHandleScope scope; | 1622 InitializedIgnitionHandleScope scope; |
1561 BytecodeExpectationsPrinter printer(CcTest::isolate(), | 1623 BytecodeExpectationsPrinter printer(CcTest::isolate(), |
1562 ConstantPoolType::kNumber); | 1624 ConstantPoolType::kNumber); |
1563 const char* snippets[] = { | 1625 const char* snippets[] = { |
1564 "var a = 1;\n" | 1626 "var a = 1;\n" |
1565 "switch(a) {\n" | 1627 "switch(a) {\n" |
1566 " case 1: return 2;\n" | 1628 " case 1: return 2;\n" |
1567 " case 2: return 3;\n" | 1629 " case 2: return 3;\n" |
1568 "}", | 1630 "}\n", |
1569 | 1631 |
1570 "var a = 1;\n" | 1632 "var a = 1;\n" |
1571 "switch(a) {\n" | 1633 "switch(a) {\n" |
1572 " case 1: a = 2; break;\n" | 1634 " case 1: a = 2; break;\n" |
1573 " case 2: a = 3; break;\n" | 1635 " case 2: a = 3; break;\n" |
1574 "}", | 1636 "}\n", |
1575 | 1637 |
1576 "var a = 1;\n" | 1638 "var a = 1;\n" |
1577 "switch(a) {\n" | 1639 "switch(a) {\n" |
1578 " case 1: a = 2; // fall-through\n" | 1640 " case 1: a = 2; // fall-through\n" |
1579 " case 2: a = 3; break;\n" | 1641 " case 2: a = 3; break;\n" |
1580 "}", | 1642 "}\n", |
1581 | 1643 |
1582 "var a = 1;\n" | 1644 "var a = 1;\n" |
1583 "switch(a) {\n" | 1645 "switch(a) {\n" |
1584 " case 2: break;\n" | 1646 " case 2: break;\n" |
1585 " case 3: break;\n" | 1647 " case 3: break;\n" |
1586 " default: a = 1; break;\n" | 1648 " default: a = 1; break;\n" |
1587 "}", | 1649 "}\n", |
1588 | 1650 |
1589 "var a = 1;\n" | 1651 "var a = 1;\n" |
1590 "switch(typeof(a)) {\n" | 1652 "switch(typeof(a)) {\n" |
1591 " case 2: a = 1; break;\n" | 1653 " case 2: a = 1; break;\n" |
1592 " case 3: a = 2; break;\n" | 1654 " case 3: a = 2; break;\n" |
1593 " default: a = 3; break;\n" | 1655 " default: a = 3; break;\n" |
1594 "}", | 1656 "}\n", |
1595 | 1657 |
1596 "var a = 1;\n" | 1658 "var a = 1;\n" |
1597 "switch(a) {\n" | 1659 "switch(a) {\n" |
1598 " case typeof(a): a = 1; break;\n" | 1660 " case typeof(a): a = 1; break;\n" |
1599 " default: a = 2; break;\n" | 1661 " default: a = 2; break;\n" |
1600 "}", | 1662 "}\n", |
1601 | 1663 |
1602 "var a = 1;\n" | 1664 "var a = 1;\n" |
1603 "switch(a) {\n" | 1665 "switch(a) {\n" |
1604 " case 1:\n" | 1666 " case 1:\n" |
1605 REPEAT_64(" a = 2;\n") | 1667 REPEAT_64(" a = 2;\n") |
1606 " break;\n" | 1668 " break;\n" |
1607 " case 2:\n" | 1669 " case 2:\n" |
1608 " a = 3;\n" | 1670 " a = 3;\n" |
1609 " break;\n" | 1671 " break;\n" |
1610 "}", | 1672 "}\n", |
1611 | 1673 |
1612 "var a = 1;\n" | 1674 "var a = 1;\n" |
1613 "switch(a) {\n" | 1675 "switch(a) {\n" |
1614 " case 1: \n" | 1676 " case 1: \n" |
1615 " switch(a + 1) {\n" | 1677 " switch(a + 1) {\n" |
1616 " case 2 : a = 1; break;\n" | 1678 " case 2 : a = 1; break;\n" |
1617 " default : a = 2; break;\n" | 1679 " default : a = 2; break;\n" |
1618 " } // fall-through\n" | 1680 " } // fall-through\n" |
1619 " case 2: a = 3;\n" | 1681 " case 2: a = 3;\n" |
1620 "}", | 1682 "}\n", |
1621 }; | 1683 }; |
1622 | 1684 |
1623 CHECK_EQ(BuildActual(printer, snippets), LoadGolden("Switch.golden")); | 1685 CHECK(CompareTexts(BuildActual(printer, snippets), |
| 1686 LoadGolden("Switch.golden"))); |
1624 } | 1687 } |
1625 | 1688 |
1626 TEST(BasicBlockToBoolean) { | 1689 TEST(BasicBlockToBoolean) { |
1627 InitializedIgnitionHandleScope scope; | 1690 InitializedIgnitionHandleScope scope; |
1628 BytecodeExpectationsPrinter printer(CcTest::isolate(), | 1691 BytecodeExpectationsPrinter printer(CcTest::isolate(), |
1629 ConstantPoolType::kNumber); | 1692 ConstantPoolType::kNumber); |
1630 const char* snippets[] = { | 1693 const char* snippets[] = { |
1631 "var a = 1; if (a || a < 0) { return 1; }", | 1694 "var a = 1; if (a || a < 0) { return 1; }\n", |
1632 | 1695 |
1633 "var a = 1; if (a && a < 0) { return 1; }", | 1696 "var a = 1; if (a && a < 0) { return 1; }\n", |
1634 | 1697 |
1635 "var a = 1; a = (a || a < 0) ? 2 : 3;", | 1698 "var a = 1; a = (a || a < 0) ? 2 : 3;\n", |
1636 }; | 1699 }; |
1637 | 1700 |
1638 CHECK_EQ(BuildActual(printer, snippets), | 1701 CHECK(CompareTexts(BuildActual(printer, snippets), |
1639 LoadGolden("BasicBlockToBoolean.golden")); | 1702 LoadGolden("BasicBlockToBoolean.golden"))); |
1640 } | 1703 } |
1641 | 1704 |
1642 TEST(DeadCodeRemoval) { | 1705 TEST(DeadCodeRemoval) { |
1643 InitializedIgnitionHandleScope scope; | 1706 InitializedIgnitionHandleScope scope; |
1644 BytecodeExpectationsPrinter printer(CcTest::isolate(), | 1707 BytecodeExpectationsPrinter printer(CcTest::isolate(), |
1645 ConstantPoolType::kNumber); | 1708 ConstantPoolType::kNumber); |
1646 const char* snippets[] = { | 1709 const char* snippets[] = { |
1647 "return; var a = 1; a();", | 1710 "return; var a = 1; a();\n", |
1648 | 1711 |
1649 "if (false) { return; }; var a = 1;", | 1712 "if (false) { return; }; var a = 1;\n", |
1650 | 1713 |
1651 "if (true) { return 1; } else { return 2; };", | 1714 "if (true) { return 1; } else { return 2; };\n", |
1652 | 1715 |
1653 "var a = 1; if (a) { return 1; }; return 2;", | 1716 "var a = 1; if (a) { return 1; }; return 2;\n", |
1654 }; | 1717 }; |
1655 | 1718 |
1656 CHECK_EQ(BuildActual(printer, snippets), | 1719 CHECK(CompareTexts(BuildActual(printer, snippets), |
1657 LoadGolden("DeadCodeRemoval.golden")); | 1720 LoadGolden("DeadCodeRemoval.golden"))); |
1658 } | 1721 } |
1659 | 1722 |
1660 TEST(ThisFunction) { | 1723 TEST(ThisFunction) { |
1661 InitializedIgnitionHandleScope scope; | 1724 InitializedIgnitionHandleScope scope; |
1662 BytecodeExpectationsPrinter printer(CcTest::isolate(), | 1725 BytecodeExpectationsPrinter printer(CcTest::isolate(), |
1663 ConstantPoolType::kNumber); | 1726 ConstantPoolType::kNumber); |
1664 printer.set_wrap(false); | 1727 printer.set_wrap(false); |
1665 printer.set_test_function_name("f"); | 1728 printer.set_test_function_name("f"); |
1666 | 1729 |
1667 const char* snippets[] = { | 1730 const char* snippets[] = { |
1668 "var f;\n" | 1731 "var f;\n" |
1669 "f = function f() {};", | 1732 "f = function f() {};", |
1670 | 1733 |
1671 "var f;\n" | 1734 "var f;\n" |
1672 "f = function f() { return f; };", | 1735 "f = function f() { return f; };", |
1673 }; | 1736 }; |
1674 | 1737 |
1675 CHECK_EQ(BuildActual(printer, snippets, "", "\nf();"), | 1738 CHECK(CompareTexts(BuildActual(printer, snippets, "", "\nf();"), |
1676 LoadGolden("ThisFunction.golden")); | 1739 LoadGolden("ThisFunction.golden"))); |
1677 } | 1740 } |
1678 | 1741 |
1679 TEST(NewTarget) { | 1742 TEST(NewTarget) { |
1680 InitializedIgnitionHandleScope scope; | 1743 InitializedIgnitionHandleScope scope; |
1681 BytecodeExpectationsPrinter printer(CcTest::isolate(), | 1744 BytecodeExpectationsPrinter printer(CcTest::isolate(), |
1682 ConstantPoolType::kMixed); | 1745 ConstantPoolType::kMixed); |
1683 | 1746 |
1684 const char* snippets[] = { | 1747 const char* snippets[] = { |
1685 "return new.target;", | 1748 "return new.target;\n", |
1686 | 1749 |
1687 "new.target;", | 1750 "new.target;\n", |
1688 }; | 1751 }; |
1689 | 1752 |
1690 CHECK_EQ(BuildActual(printer, snippets), LoadGolden("NewTarget.golden")); | 1753 CHECK(CompareTexts(BuildActual(printer, snippets), |
| 1754 LoadGolden("NewTarget.golden"))); |
1691 } | 1755 } |
1692 | 1756 |
1693 TEST(RemoveRedundantLdar) { | 1757 TEST(RemoveRedundantLdar) { |
1694 InitializedIgnitionHandleScope scope; | 1758 InitializedIgnitionHandleScope scope; |
1695 BytecodeExpectationsPrinter printer(CcTest::isolate(), | 1759 BytecodeExpectationsPrinter printer(CcTest::isolate(), |
1696 ConstantPoolType::kNumber); | 1760 ConstantPoolType::kNumber); |
1697 const char* snippets[] = { | 1761 const char* snippets[] = { |
1698 "var ld_a = 1;\n" // This test is to check Ldar does not | 1762 "var ld_a = 1;\n" // This test is to check Ldar does not |
1699 "while(true) {\n" // get removed if the preceding Star is | 1763 "while(true) {\n" // get removed if the preceding Star is |
1700 " ld_a = ld_a + ld_a;\n" // in a different basicblock. | 1764 " ld_a = ld_a + ld_a;\n" // in a different basicblock. |
1701 " if (ld_a > 10) break;\n" | 1765 " if (ld_a > 10) break;\n" |
1702 "}\n" | 1766 "}\n" |
1703 "return ld_a;", | 1767 "return ld_a;\n", |
1704 | 1768 |
1705 "var ld_a = 1;\n" | 1769 "var ld_a = 1;\n" |
1706 "do {\n" | 1770 "do {\n" |
1707 " ld_a = ld_a + ld_a;\n" | 1771 " ld_a = ld_a + ld_a;\n" |
1708 " if (ld_a > 10) continue;\n" | 1772 " if (ld_a > 10) continue;\n" |
1709 "} while(false);\n" | 1773 "} while(false);\n" |
1710 "return ld_a;", | 1774 "return ld_a;\n", |
1711 | 1775 |
1712 "var ld_a = 1;\n" | 1776 "var ld_a = 1;\n" |
1713 " ld_a = ld_a + ld_a;\n" | 1777 " ld_a = ld_a + ld_a;\n" |
1714 " return ld_a;", | 1778 " return ld_a;\n", |
1715 }; | 1779 }; |
1716 | 1780 |
1717 CHECK_EQ(BuildActual(printer, snippets), | 1781 CHECK(CompareTexts(BuildActual(printer, snippets), |
1718 LoadGolden("RemoveRedundantLdar.golden")); | 1782 LoadGolden("RemoveRedundantLdar.golden"))); |
1719 } | 1783 } |
1720 | 1784 |
1721 TEST(AssignmentsInBinaryExpression) { | 1785 TEST(AssignmentsInBinaryExpression) { |
1722 InitializedIgnitionHandleScope scope; | 1786 InitializedIgnitionHandleScope scope; |
1723 BytecodeExpectationsPrinter printer(CcTest::isolate(), | 1787 BytecodeExpectationsPrinter printer(CcTest::isolate(), |
1724 ConstantPoolType::kString); | 1788 ConstantPoolType::kString); |
1725 const char* snippets[] = { | 1789 const char* snippets[] = { |
1726 "var x = 0, y = 1;\n" | 1790 "var x = 0, y = 1;\n" |
1727 "return (x = 2, y = 3, x = 4, y = 5);", | 1791 "return (x = 2, y = 3, x = 4, y = 5);\n", |
1728 | 1792 |
1729 "var x = 55;\n" | 1793 "var x = 55;\n" |
1730 "var y = (x = 100);\n" | 1794 "var y = (x = 100);\n" |
1731 "return y;", | 1795 "return y;\n", |
1732 | 1796 |
1733 "var x = 55;\n" | 1797 "var x = 55;\n" |
1734 "x = x + (x = 100) + (x = 101);\n" | 1798 "x = x + (x = 100) + (x = 101);\n" |
1735 "return x;", | 1799 "return x;\n", |
1736 | 1800 |
1737 "var x = 55;\n" | 1801 "var x = 55;\n" |
1738 "x = (x = 56) - x + (x = 57);\n" | 1802 "x = (x = 56) - x + (x = 57);\n" |
1739 "x++;\n" | 1803 "x++;\n" |
1740 "return x;", | 1804 "return x;\n", |
1741 | 1805 |
1742 "var x = 55;\n" | 1806 "var x = 55;\n" |
1743 "var y = x + (x = 1) + (x = 2) + (x = 3);\n" | 1807 "var y = x + (x = 1) + (x = 2) + (x = 3);\n" |
1744 "return y;", | 1808 "return y;\n", |
1745 | 1809 |
1746 "var x = 55;\n" | 1810 "var x = 55;\n" |
1747 "var x = x + (x = 1) + (x = 2) + (x = 3);\n" | 1811 "var x = x + (x = 1) + (x = 2) + (x = 3);\n" |
1748 "return x;", | 1812 "return x;\n", |
1749 | 1813 |
1750 "var x = 10, y = 20;\n" | 1814 "var x = 10, y = 20;\n" |
1751 "return x + (x = 1) + (x + 1) * (y = 2) + (y = 3) + (x = 4) + (y = 5) + " | 1815 "return x + (x = 1) + (x + 1) * (y = 2) + (y = 3) + (x = 4) + (y = 5) + " |
1752 "y;\n", | 1816 "y;\n", |
1753 | 1817 |
1754 "var x = 17;\n" | 1818 "var x = 17;\n" |
1755 "return 1 + x + (x++) + (++x);\n", | 1819 "return 1 + x + (x++) + (++x);\n", |
1756 }; | 1820 }; |
1757 | 1821 |
1758 CHECK_EQ(BuildActual(printer, snippets), | 1822 CHECK(CompareTexts(BuildActual(printer, snippets), |
1759 LoadGolden("AssignmentsInBinaryExpression.golden")); | 1823 LoadGolden("AssignmentsInBinaryExpression.golden"))); |
1760 } | 1824 } |
1761 | 1825 |
1762 TEST(Eval) { | 1826 TEST(Eval) { |
1763 InitializedIgnitionHandleScope scope; | 1827 InitializedIgnitionHandleScope scope; |
1764 BytecodeExpectationsPrinter printer(CcTest::isolate(), | 1828 BytecodeExpectationsPrinter printer(CcTest::isolate(), |
1765 ConstantPoolType::kString); | 1829 ConstantPoolType::kString); |
1766 const char* snippets[] = { | 1830 const char* snippets[] = { |
1767 "return eval('1;');", | 1831 "return eval('1;');\n", |
1768 }; | 1832 }; |
1769 | 1833 |
1770 CHECK_EQ(BuildActual(printer, snippets), LoadGolden("Eval.golden")); | 1834 CHECK( |
| 1835 CompareTexts(BuildActual(printer, snippets), LoadGolden("Eval.golden"))); |
1771 } | 1836 } |
1772 | 1837 |
1773 TEST(LookupSlot) { | 1838 TEST(LookupSlot) { |
1774 InitializedIgnitionHandleScope scope; | 1839 InitializedIgnitionHandleScope scope; |
1775 BytecodeExpectationsPrinter printer(CcTest::isolate(), | 1840 BytecodeExpectationsPrinter printer(CcTest::isolate(), |
1776 ConstantPoolType::kString); | 1841 ConstantPoolType::kString); |
1777 | 1842 |
1778 const char* snippets[] = { | 1843 const char* snippets[] = { |
1779 "eval('var x = 10;'); return x;", | 1844 "eval('var x = 10;'); return x;\n", |
1780 | 1845 |
1781 "eval('var x = 10;'); return typeof x;", | 1846 "eval('var x = 10;'); return typeof x;\n", |
1782 | 1847 |
1783 "x = 20; return eval('');", | 1848 "x = 20; return eval('');\n", |
1784 }; | 1849 }; |
1785 | 1850 |
1786 CHECK_EQ(BuildActual(printer, snippets), LoadGolden("LookupSlot.golden")); | 1851 CHECK(CompareTexts(BuildActual(printer, snippets), |
| 1852 LoadGolden("LookupSlot.golden"))); |
1787 } | 1853 } |
1788 | 1854 |
1789 TEST(CallLookupSlot) { | 1855 TEST(CallLookupSlot) { |
1790 InitializedIgnitionHandleScope scope; | 1856 InitializedIgnitionHandleScope scope; |
1791 BytecodeExpectationsPrinter printer(CcTest::isolate(), | 1857 BytecodeExpectationsPrinter printer(CcTest::isolate(), |
1792 ConstantPoolType::kMixed); | 1858 ConstantPoolType::kMixed); |
1793 const char* snippets[] = { | 1859 const char* snippets[] = { |
1794 "g = function(){}; eval(''); return g();", | 1860 "g = function(){}; eval(''); return g();\n", |
1795 }; | 1861 }; |
1796 | 1862 |
1797 CHECK_EQ(BuildActual(printer, snippets), LoadGolden("CallLookupSlot.golden")); | 1863 CHECK(CompareTexts(BuildActual(printer, snippets), |
| 1864 LoadGolden("CallLookupSlot.golden"))); |
1798 } | 1865 } |
1799 | 1866 |
1800 // TODO(mythria): tests for variable/function declaration in lookup slots. | 1867 // TODO(mythria): tests for variable/function declaration in lookup slots. |
1801 | 1868 |
1802 TEST(LookupSlotInEval) { | 1869 TEST(LookupSlotInEval) { |
1803 InitializedIgnitionHandleScope scope; | 1870 InitializedIgnitionHandleScope scope; |
1804 BytecodeExpectationsPrinter printer(CcTest::isolate(), | 1871 BytecodeExpectationsPrinter printer(CcTest::isolate(), |
1805 ConstantPoolType::kString); | 1872 ConstantPoolType::kString); |
1806 printer.set_wrap(false); | 1873 printer.set_wrap(false); |
1807 printer.set_test_function_name("f"); | 1874 printer.set_test_function_name("f"); |
(...skipping 11 matching lines...) Expand all Loading... |
1819 std::string actual = BuildActual(printer, snippets, | 1886 std::string actual = BuildActual(printer, snippets, |
1820 "var f;\n" | 1887 "var f;\n" |
1821 "var x = 1;\n" | 1888 "var x = 1;\n" |
1822 "function f1() {\n" | 1889 "function f1() {\n" |
1823 " eval(\"function t() { ", | 1890 " eval(\"function t() { ", |
1824 | 1891 |
1825 " }; f = t; f();\");\n" | 1892 " }; f = t; f();\");\n" |
1826 "}\n" | 1893 "}\n" |
1827 "f1();"); | 1894 "f1();"); |
1828 | 1895 |
1829 CHECK_EQ(actual, LoadGolden("LookupSlotInEval.golden")); | 1896 CHECK(CompareTexts(actual, LoadGolden("LookupSlotInEval.golden"))); |
1830 } | 1897 } |
1831 | 1898 |
1832 TEST(LookupSlotWideInEval) { | 1899 TEST(LookupSlotWideInEval) { |
1833 InitializedIgnitionHandleScope scope; | 1900 InitializedIgnitionHandleScope scope; |
1834 BytecodeExpectationsPrinter printer(CcTest::isolate(), | 1901 BytecodeExpectationsPrinter printer(CcTest::isolate(), |
1835 ConstantPoolType::kMixed); | 1902 ConstantPoolType::kMixed); |
1836 printer.set_wrap(false); | 1903 printer.set_wrap(false); |
1837 printer.set_test_function_name("f"); | 1904 printer.set_test_function_name("f"); |
1838 | 1905 |
1839 const char* snippets[] = { | 1906 const char* snippets[] = { |
(...skipping 15 matching lines...) Expand all Loading... |
1855 "var f;\n" | 1922 "var f;\n" |
1856 "var x = 1;\n" | 1923 "var x = 1;\n" |
1857 "function f1() {\n" | 1924 "function f1() {\n" |
1858 " eval(\"function t() {\" +\n", | 1925 " eval(\"function t() {\" +\n", |
1859 | 1926 |
1860 " \"};\" +\n" | 1927 " \"};\" +\n" |
1861 " \"f = t; f();\"\n);\n" | 1928 " \"f = t; f();\"\n);\n" |
1862 "}\n" | 1929 "}\n" |
1863 "f1();"); | 1930 "f1();"); |
1864 | 1931 |
1865 CHECK_EQ(actual, LoadGolden("LookupSlotWideInEval.golden")); | 1932 CHECK(CompareTexts(actual, LoadGolden("LookupSlotWideInEval.golden"))); |
1866 } | 1933 } |
1867 | 1934 |
1868 TEST(DeleteLookupSlotInEval) { | 1935 TEST(DeleteLookupSlotInEval) { |
1869 InitializedIgnitionHandleScope scope; | 1936 InitializedIgnitionHandleScope scope; |
1870 BytecodeExpectationsPrinter printer(CcTest::isolate(), | 1937 BytecodeExpectationsPrinter printer(CcTest::isolate(), |
1871 ConstantPoolType::kString); | 1938 ConstantPoolType::kString); |
1872 printer.set_wrap(false); | 1939 printer.set_wrap(false); |
1873 printer.set_test_function_name("f"); | 1940 printer.set_test_function_name("f"); |
1874 | 1941 |
1875 const char* snippets[] = { | 1942 const char* snippets[] = { |
1876 "delete x;", | 1943 "delete x;", |
1877 | 1944 |
1878 "return delete y;", | 1945 "return delete y;", |
1879 | 1946 |
1880 "return delete z;", | 1947 "return delete z;", |
1881 }; | 1948 }; |
1882 | 1949 |
1883 std::string actual = BuildActual(printer, snippets, | 1950 std::string actual = BuildActual(printer, snippets, |
1884 "var f;\n" | 1951 "var f;\n" |
1885 "var x = 1;\n" | 1952 "var x = 1;\n" |
1886 "z = 10;\n" | 1953 "z = 10;\n" |
1887 "function f1() {\n" | 1954 "function f1() {\n" |
1888 " var y;\n" | 1955 " var y;\n" |
1889 " eval(\"function t() { ", | 1956 " eval(\"function t() { ", |
1890 | 1957 |
1891 " }; f = t; f();\");\n" | 1958 " }; f = t; f();\");\n" |
1892 "}\n" | 1959 "}\n" |
1893 "f1();"); | 1960 "f1();"); |
1894 | 1961 |
1895 CHECK_EQ(actual, LoadGolden("DeleteLookupSlotInEval.golden")); | 1962 CHECK(CompareTexts(actual, LoadGolden("DeleteLookupSlotInEval.golden"))); |
1896 } | 1963 } |
1897 | 1964 |
1898 TEST(WideRegisters) { | 1965 TEST(WideRegisters) { |
1899 // Prepare prologue that creates frame for lots of registers. | 1966 // Prepare prologue that creates frame for lots of registers. |
1900 std::ostringstream os; | 1967 std::ostringstream os; |
1901 for (size_t i = 0; i < 157; ++i) { | 1968 for (size_t i = 0; i < 157; ++i) { |
1902 os << "var x" << i << ";\n"; | 1969 os << "var x" << i << ";\n"; |
1903 } | 1970 } |
1904 std::string prologue(os.str()); | 1971 std::string prologue(os.str()); |
1905 | 1972 |
1906 InitializedIgnitionHandleScope scope; | 1973 InitializedIgnitionHandleScope scope; |
1907 BytecodeExpectationsPrinter printer(CcTest::isolate(), | 1974 BytecodeExpectationsPrinter printer(CcTest::isolate(), |
1908 ConstantPoolType::kNumber); | 1975 ConstantPoolType::kNumber); |
1909 const char* snippets[] = { | 1976 const char* snippets[] = { |
1910 "x0 = x127;\n" | 1977 "x0 = x127;\n" |
1911 "return x0;", | 1978 "return x0;\n", |
1912 | 1979 |
1913 "x127 = x126;\n" | 1980 "x127 = x126;\n" |
1914 "return x127;", | 1981 "return x127;\n", |
1915 | 1982 |
1916 "if (x2 > 3) { return x129; }\n" | 1983 "if (x2 > 3) { return x129; }\n" |
1917 "return x128;", | 1984 "return x128;\n", |
1918 | 1985 |
1919 "var x0 = 0;\n" | 1986 "var x0 = 0;\n" |
1920 "if (x129 == 3) { var x129 = x0; }\n" | 1987 "if (x129 == 3) { var x129 = x0; }\n" |
1921 "if (x2 > 3) { return x0; }\n" | 1988 "if (x2 > 3) { return x0; }\n" |
1922 "return x129;", | 1989 "return x129;\n", |
1923 | 1990 |
1924 "var x0 = 0;\n" | 1991 "var x0 = 0;\n" |
1925 "var x1 = 0;\n" | 1992 "var x1 = 0;\n" |
1926 "for (x128 = 0; x128 < 64; x128++) {" | 1993 "for (x128 = 0; x128 < 64; x128++) {" |
1927 " x1 += x128;" | 1994 " x1 += x128;" |
1928 "}" | 1995 "}" |
1929 "return x128;", | 1996 "return x128;\n", |
1930 | 1997 |
1931 "var x0 = 1234;\n" | 1998 "var x0 = 1234;\n" |
1932 "var x1 = 0;\n" | 1999 "var x1 = 0;\n" |
1933 "for (x128 in x0) {" | 2000 "for (x128 in x0) {" |
1934 " x1 += x128;" | 2001 " x1 += x128;" |
1935 "}" | 2002 "}" |
1936 "return x1;", | 2003 "return x1;\n", |
1937 | 2004 |
1938 "x0 = %Add(x64, x63);\n" | 2005 "x0 = %Add(x64, x63);\n" |
1939 "x1 = %Add(x27, x143);\n" | 2006 "x1 = %Add(x27, x143);\n" |
1940 "%TheHole();\n" | 2007 "%TheHole();\n" |
1941 "return x1;", | 2008 "return x1;\n", |
1942 }; | 2009 }; |
1943 | 2010 |
1944 CHECK_EQ(BuildActual(printer, snippets, prologue.c_str()), | 2011 CHECK(CompareTexts(BuildActual(printer, snippets, prologue.c_str()), |
1945 LoadGolden("WideRegisters.golden")); | 2012 LoadGolden("WideRegisters.golden"))); |
1946 } | 2013 } |
1947 | 2014 |
1948 TEST(ConstVariable) { | 2015 TEST(ConstVariable) { |
1949 InitializedIgnitionHandleScope scope; | 2016 InitializedIgnitionHandleScope scope; |
1950 BytecodeExpectationsPrinter printer(CcTest::isolate(), | 2017 BytecodeExpectationsPrinter printer(CcTest::isolate(), |
1951 ConstantPoolType::kString); | 2018 ConstantPoolType::kString); |
1952 const char* snippets[] = { | 2019 const char* snippets[] = { |
1953 "const x = 10;", | 2020 "const x = 10;\n", |
1954 | 2021 |
1955 "const x = 10; return x;", | 2022 "const x = 10; return x;\n", |
1956 | 2023 |
1957 "const x = ( x = 20);", | 2024 "const x = ( x = 20);\n", |
1958 | 2025 |
1959 "const x = 10; x = 20;", | 2026 "const x = 10; x = 20;\n", |
1960 }; | 2027 }; |
1961 | 2028 |
1962 CHECK_EQ(BuildActual(printer, snippets), LoadGolden("ConstVariable.golden")); | 2029 CHECK(CompareTexts(BuildActual(printer, snippets), |
| 2030 LoadGolden("ConstVariable.golden"))); |
1963 } | 2031 } |
1964 | 2032 |
1965 TEST(LetVariable) { | 2033 TEST(LetVariable) { |
1966 InitializedIgnitionHandleScope scope; | 2034 InitializedIgnitionHandleScope scope; |
1967 BytecodeExpectationsPrinter printer(CcTest::isolate(), | 2035 BytecodeExpectationsPrinter printer(CcTest::isolate(), |
1968 ConstantPoolType::kString); | 2036 ConstantPoolType::kString); |
1969 const char* snippets[] = { | 2037 const char* snippets[] = { |
1970 "let x = 10;", | 2038 "let x = 10;\n", |
1971 | 2039 |
1972 "let x = 10; return x;", | 2040 "let x = 10; return x;\n", |
1973 | 2041 |
1974 "let x = (x = 20);", | 2042 "let x = (x = 20);\n", |
1975 | 2043 |
1976 "let x = 10; x = 20;", | 2044 "let x = 10; x = 20;\n", |
1977 }; | 2045 }; |
1978 | 2046 |
1979 CHECK_EQ(BuildActual(printer, snippets), LoadGolden("LetVariable.golden")); | 2047 CHECK(CompareTexts(BuildActual(printer, snippets), |
| 2048 LoadGolden("LetVariable.golden"))); |
1980 } | 2049 } |
1981 | 2050 |
1982 TEST(ConstVariableContextSlot) { | 2051 TEST(ConstVariableContextSlot) { |
1983 // TODO(mythria): Add tests for initialization of this via super calls. | 2052 // TODO(mythria): Add tests for initialization of this via super calls. |
1984 // TODO(mythria): Add tests that walk the context chain. | 2053 // TODO(mythria): Add tests that walk the context chain. |
1985 InitializedIgnitionHandleScope scope; | 2054 InitializedIgnitionHandleScope scope; |
1986 BytecodeExpectationsPrinter printer(CcTest::isolate(), | 2055 BytecodeExpectationsPrinter printer(CcTest::isolate(), |
1987 ConstantPoolType::kMixed); | 2056 ConstantPoolType::kMixed); |
1988 const char* snippets[] = { | 2057 const char* snippets[] = { |
1989 "const x = 10; function f1() {return x;}", | 2058 "const x = 10; function f1() {return x;}\n", |
1990 | 2059 |
1991 "const x = 10; function f1() {return x;} return x;", | 2060 "const x = 10; function f1() {return x;} return x;\n", |
1992 | 2061 |
1993 "const x = (x = 20); function f1() {return x;}", | 2062 "const x = (x = 20); function f1() {return x;}\n", |
1994 | 2063 |
1995 "const x = 10; x = 20; function f1() {return x;}", | 2064 "const x = 10; x = 20; function f1() {return x;}\n", |
1996 }; | 2065 }; |
1997 | 2066 |
1998 CHECK_EQ(BuildActual(printer, snippets), | 2067 CHECK(CompareTexts(BuildActual(printer, snippets), |
1999 LoadGolden("ConstVariableContextSlot.golden")); | 2068 LoadGolden("ConstVariableContextSlot.golden"))); |
2000 } | 2069 } |
2001 | 2070 |
2002 TEST(LetVariableContextSlot) { | 2071 TEST(LetVariableContextSlot) { |
2003 InitializedIgnitionHandleScope scope; | 2072 InitializedIgnitionHandleScope scope; |
2004 BytecodeExpectationsPrinter printer(CcTest::isolate(), | 2073 BytecodeExpectationsPrinter printer(CcTest::isolate(), |
2005 ConstantPoolType::kMixed); | 2074 ConstantPoolType::kMixed); |
2006 const char* snippets[] = { | 2075 const char* snippets[] = { |
2007 "let x = 10; function f1() {return x;}", | 2076 "let x = 10; function f1() {return x;}\n", |
2008 | 2077 |
2009 "let x = 10; function f1() {return x;} return x;", | 2078 "let x = 10; function f1() {return x;} return x;\n", |
2010 | 2079 |
2011 "let x = (x = 20); function f1() {return x;}", | 2080 "let x = (x = 20); function f1() {return x;}\n", |
2012 | 2081 |
2013 "let x = 10; x = 20; function f1() {return x;}", | 2082 "let x = 10; x = 20; function f1() {return x;}\n", |
2014 }; | 2083 }; |
2015 | 2084 |
2016 CHECK_EQ(BuildActual(printer, snippets), | 2085 CHECK(CompareTexts(BuildActual(printer, snippets), |
2017 LoadGolden("LetVariableContextSlot.golden")); | 2086 LoadGolden("LetVariableContextSlot.golden"))); |
2018 } | 2087 } |
2019 | 2088 |
2020 TEST(DoExpression) { | 2089 TEST(DoExpression) { |
2021 bool old_flag = FLAG_harmony_do_expressions; | 2090 bool old_flag = FLAG_harmony_do_expressions; |
2022 FLAG_harmony_do_expressions = true; | 2091 FLAG_harmony_do_expressions = true; |
2023 | 2092 |
2024 InitializedIgnitionHandleScope scope; | 2093 InitializedIgnitionHandleScope scope; |
2025 BytecodeExpectationsPrinter printer(CcTest::isolate(), | 2094 BytecodeExpectationsPrinter printer(CcTest::isolate(), |
2026 ConstantPoolType::kString); | 2095 ConstantPoolType::kString); |
2027 const char* snippets[] = { | 2096 const char* snippets[] = { |
2028 "var a = do { }; return a;", | 2097 "var a = do { }; return a;\n", |
2029 | 2098 |
2030 "var a = do { var x = 100; }; return a;", | 2099 "var a = do { var x = 100; }; return a;\n", |
2031 | 2100 |
2032 "while(true) { var a = 10; a = do { ++a; break; }; a = 20; }", | 2101 "while(true) { var a = 10; a = do { ++a; break; }; a = 20; }\n", |
2033 }; | 2102 }; |
2034 | 2103 |
2035 CHECK_EQ(BuildActual(printer, snippets), LoadGolden("DoExpression.golden")); | 2104 CHECK(CompareTexts(BuildActual(printer, snippets), |
| 2105 LoadGolden("DoExpression.golden"))); |
2036 | 2106 |
2037 FLAG_harmony_do_expressions = old_flag; | 2107 FLAG_harmony_do_expressions = old_flag; |
2038 } | 2108 } |
2039 | 2109 |
2040 TEST(WithStatement) { | 2110 TEST(WithStatement) { |
2041 InitializedIgnitionHandleScope scope; | 2111 InitializedIgnitionHandleScope scope; |
2042 BytecodeExpectationsPrinter printer(CcTest::isolate(), | 2112 BytecodeExpectationsPrinter printer(CcTest::isolate(), |
2043 ConstantPoolType::kMixed); | 2113 ConstantPoolType::kMixed); |
2044 const char* snippets[] = { | 2114 const char* snippets[] = { |
2045 "with ({x:42}) { return x; }", | 2115 "with ({x:42}) { return x; }\n", |
2046 }; | 2116 }; |
2047 | 2117 |
2048 CHECK_EQ(BuildActual(printer, snippets), LoadGolden("WithStatement.golden")); | 2118 CHECK(CompareTexts(BuildActual(printer, snippets), |
| 2119 LoadGolden("WithStatement.golden"))); |
2049 } | 2120 } |
2050 | 2121 |
2051 TEST(DoDebugger) { | 2122 TEST(DoDebugger) { |
2052 InitializedIgnitionHandleScope scope; | 2123 InitializedIgnitionHandleScope scope; |
2053 BytecodeExpectationsPrinter printer(CcTest::isolate(), | 2124 BytecodeExpectationsPrinter printer(CcTest::isolate(), |
2054 ConstantPoolType::kString); | 2125 ConstantPoolType::kString); |
2055 const char* snippets[] = { | 2126 const char* snippets[] = { |
2056 "debugger;", | 2127 "debugger;\n", |
2057 }; | 2128 }; |
2058 | 2129 |
2059 CHECK_EQ(BuildActual(printer, snippets), LoadGolden("DoDebugger.golden")); | 2130 CHECK(CompareTexts(BuildActual(printer, snippets), |
| 2131 LoadGolden("DoDebugger.golden"))); |
2060 } | 2132 } |
2061 | 2133 |
2062 TEST(ClassDeclarations) { | 2134 TEST(ClassDeclarations) { |
2063 InitializedIgnitionHandleScope scope; | 2135 InitializedIgnitionHandleScope scope; |
2064 BytecodeExpectationsPrinter printer(CcTest::isolate(), | 2136 BytecodeExpectationsPrinter printer(CcTest::isolate(), |
2065 ConstantPoolType::kMixed); | 2137 ConstantPoolType::kMixed); |
2066 const char* snippets[] = { | 2138 const char* snippets[] = { |
2067 "class Person {\n" | 2139 "class Person {\n" |
2068 " constructor(name) { this.name = name; }\n" | 2140 " constructor(name) { this.name = name; }\n" |
2069 " speak() { console.log(this.name + ' is speaking.'); }\n" | 2141 " speak() { console.log(this.name + ' is speaking.'); }\n" |
2070 "}", | 2142 "}\n", |
2071 | 2143 |
2072 "class person {\n" | 2144 "class person {\n" |
2073 " constructor(name) { this.name = name; }\n" | 2145 " constructor(name) { this.name = name; }\n" |
2074 " speak() { console.log(this.name + ' is speaking.'); }\n" | 2146 " speak() { console.log(this.name + ' is speaking.'); }\n" |
2075 "}", | 2147 "}\n", |
2076 | 2148 |
2077 "var n0 = 'a';\n" | 2149 "var n0 = 'a';\n" |
2078 "var n1 = 'b';\n" | 2150 "var n1 = 'b';\n" |
2079 "class N {\n" | 2151 "class N {\n" |
2080 " [n0]() { return n0; }\n" | 2152 " [n0]() { return n0; }\n" |
2081 " static [n1]() { return n1; }\n" | 2153 " static [n1]() { return n1; }\n" |
2082 "}", | 2154 "}\n", |
2083 | 2155 |
2084 "var count = 0;\n" | 2156 "var count = 0;\n" |
2085 "class C { constructor() { count++; }}\n" | 2157 "class C { constructor() { count++; }}\n" |
2086 "return new C();\n", | 2158 "return new C();\n", |
2087 }; | 2159 }; |
2088 | 2160 |
2089 CHECK_EQ(BuildActual(printer, snippets), | 2161 CHECK(CompareTexts(BuildActual(printer, snippets), |
2090 LoadGolden("ClassDeclarations.golden")); | 2162 LoadGolden("ClassDeclarations.golden"))); |
2091 } | 2163 } |
2092 | 2164 |
2093 TEST(ClassAndSuperClass) { | 2165 TEST(ClassAndSuperClass) { |
2094 InitializedIgnitionHandleScope scope; | 2166 InitializedIgnitionHandleScope scope; |
2095 BytecodeExpectationsPrinter printer(CcTest::isolate(), | 2167 BytecodeExpectationsPrinter printer(CcTest::isolate(), |
2096 ConstantPoolType::kMixed); | 2168 ConstantPoolType::kMixed); |
2097 printer.set_wrap(false); | 2169 printer.set_wrap(false); |
2098 printer.set_test_function_name("test"); | 2170 printer.set_test_function_name("test"); |
2099 const char* snippets[] = { | 2171 const char* snippets[] = { |
2100 "var test;\n" | 2172 "var test;\n" |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2138 " class A {\n" | 2210 " class A {\n" |
2139 " constructor() { this.x_ = 1; }\n" | 2211 " constructor() { this.x_ = 1; }\n" |
2140 " }\n" | 2212 " }\n" |
2141 " class B extends A {\n" | 2213 " class B extends A {\n" |
2142 " constructor() { super(); this.y_ = 2; }\n" | 2214 " constructor() { super(); this.y_ = 2; }\n" |
2143 " }\n" | 2215 " }\n" |
2144 " test = new B().constructor;\n" | 2216 " test = new B().constructor;\n" |
2145 "})();\n", | 2217 "})();\n", |
2146 }; | 2218 }; |
2147 | 2219 |
2148 CHECK_EQ(BuildActual(printer, snippets), | 2220 CHECK(CompareTexts(BuildActual(printer, snippets), |
2149 LoadGolden("ClassAndSuperClass.golden")); | 2221 LoadGolden("ClassAndSuperClass.golden"))); |
2150 } | 2222 } |
2151 | 2223 |
2152 TEST(Generators) { | 2224 TEST(Generators) { |
2153 bool old_flag = FLAG_ignition_generators; | 2225 bool old_flag = FLAG_ignition_generators; |
2154 FLAG_ignition_generators = true; | 2226 FLAG_ignition_generators = true; |
2155 | 2227 |
2156 InitializedIgnitionHandleScope scope; | 2228 InitializedIgnitionHandleScope scope; |
2157 BytecodeExpectationsPrinter printer(CcTest::isolate(), | 2229 BytecodeExpectationsPrinter printer(CcTest::isolate(), |
2158 ConstantPoolType::kMixed); | 2230 ConstantPoolType::kMixed); |
2159 printer.set_wrap(false); | 2231 printer.set_wrap(false); |
2160 printer.set_test_function_name("f"); | 2232 printer.set_test_function_name("f"); |
2161 | 2233 |
2162 const char* snippets[] = { | 2234 const char* snippets[] = { |
2163 "function* f() { }", | 2235 "function* f() { }\n", |
2164 | 2236 |
2165 "function* f() { yield 42 }", | 2237 "function* f() { yield 42 }\n", |
2166 | 2238 |
2167 "function* f() { for (let x of [42]) yield x }", | 2239 "function* f() { for (let x of [42]) yield x }\n", |
2168 }; | 2240 }; |
2169 | 2241 |
2170 CHECK_EQ(BuildActual(printer, snippets), LoadGolden("Generators.golden")); | 2242 CHECK(CompareTexts(BuildActual(printer, snippets), |
| 2243 LoadGolden("Generators.golden"))); |
2171 | 2244 |
2172 FLAG_ignition_generators = old_flag; | 2245 FLAG_ignition_generators = old_flag; |
2173 } | 2246 } |
2174 | 2247 |
2175 } // namespace interpreter | 2248 } // namespace interpreter |
2176 } // namespace internal | 2249 } // namespace internal |
2177 } // namespace v8 | 2250 } // namespace v8 |
OLD | NEW |