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

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

Issue 1392933002: [Interpreter] Reduce temporary register usage in generated bytecode. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Fix signed-unsigned comparison. Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2015 the V8 project authors. All rights reserved. 1 // Copyright 2015 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/v8.h" 5 #include "src/v8.h"
6 6
7 #include "src/compiler.h" 7 #include "src/compiler.h"
8 #include "src/interpreter/bytecode-array-iterator.h" 8 #include "src/interpreter/bytecode-array-iterator.h"
9 #include "src/interpreter/bytecode-generator.h" 9 #include "src/interpreter/bytecode-generator.h"
10 #include "src/interpreter/interpreter.h" 10 #include "src/interpreter/interpreter.h"
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
68 SNPrintF(program, "%s\n%s();", function, kFunctionName); 68 SNPrintF(program, "%s\n%s();", function, kFunctionName);
69 return MakeBytecode(program.start(), kFunctionName); 69 return MakeBytecode(program.start(), kFunctionName);
70 } 70 }
71 }; 71 };
72 72
73 73
74 // Helper macros for handcrafting bytecode sequences. 74 // Helper macros for handcrafting bytecode sequences.
75 #define B(x) static_cast<uint8_t>(Bytecode::k##x) 75 #define B(x) static_cast<uint8_t>(Bytecode::k##x)
76 #define U8(x) static_cast<uint8_t>((x) & 0xff) 76 #define U8(x) static_cast<uint8_t>((x) & 0xff)
77 #define R(x) static_cast<uint8_t>(-(x) & 0xff) 77 #define R(x) static_cast<uint8_t>(-(x) & 0xff)
78 #define A(x, n) R(helper.kLastParamIndex - (n) + 1 + (x))
79 #define THIS(n) A(0, n)
78 #define _ static_cast<uint8_t>(0x5a) 80 #define _ static_cast<uint8_t>(0x5a)
79 #if defined(V8_TARGET_LITTLE_ENDIAN) 81 #if defined(V8_TARGET_LITTLE_ENDIAN)
80 #define U16(x) static_cast<uint8_t>((x) & 0xff), \ 82 #define U16(x) static_cast<uint8_t>((x) & 0xff), \
81 static_cast<uint8_t>(((x) >> kBitsPerByte) & 0xff) 83 static_cast<uint8_t>(((x) >> kBitsPerByte) & 0xff)
82 #elif defined(V8_TARGET_BIG_ENDIAN) 84 #elif defined(V8_TARGET_BIG_ENDIAN)
83 #define U16(x) static_cast<uint8_t>(((x) >> kBitsPerByte) & 0xff), \ 85 #define U16(x) static_cast<uint8_t>(((x) >> kBitsPerByte) & 0xff), \
84 static_cast<uint8_t>((x) & 0xff) 86 static_cast<uint8_t>((x) & 0xff)
85 #else 87 #else
86 #error Unknown byte ordering 88 #error Unknown byte ordering
87 #endif 89 #endif
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
121 CHECK(actual == *expected || expected->StrictEquals(actual)); 123 CHECK(actual == *expected || expected->StrictEquals(actual));
122 } 124 }
123 125
124 126
125 static void CheckConstant(InstanceType expected, Object* actual) { 127 static void CheckConstant(InstanceType expected, Object* actual) {
126 CHECK_EQ(expected, HeapObject::cast(actual)->map()->instance_type()); 128 CHECK_EQ(expected, HeapObject::cast(actual)->map()->instance_type());
127 } 129 }
128 130
129 131
130 template <typename T> 132 template <typename T>
131 static void CheckBytecodeArrayEqual(struct ExpectedSnippet<T> expected, 133 static void CheckBytecodeArrayEqual(const ExpectedSnippet<T>& expected,
132 Handle<BytecodeArray> actual, 134 Handle<BytecodeArray> actual,
133 bool has_unknown = false) { 135 bool has_unknown = false) {
134 CHECK_EQ(actual->frame_size(), expected.frame_size); 136 CHECK_EQ(actual->frame_size(), expected.frame_size);
135 CHECK_EQ(actual->parameter_count(), expected.parameter_count); 137 CHECK_EQ(actual->parameter_count(), expected.parameter_count);
136 CHECK_EQ(actual->length(), expected.bytecode_length); 138 CHECK_EQ(actual->length(), expected.bytecode_length);
137 if (expected.constant_count == 0) { 139 if (expected.constant_count == 0) {
138 CHECK_EQ(actual->constant_pool(), CcTest::heap()->empty_fixed_array()); 140 CHECK_EQ(actual->constant_pool(), CcTest::heap()->empty_fixed_array());
139 } else { 141 } else {
140 CHECK_EQ(actual->constant_pool()->length(), expected.constant_count); 142 CHECK_EQ(actual->constant_pool()->length(), expected.constant_count);
141 for (int i = 0; i < expected.constant_count; i++) { 143 for (int i = 0; i < expected.constant_count; i++) {
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
222 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); 224 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet);
223 CheckBytecodeArrayEqual(snippets[i], bytecode_array); 225 CheckBytecodeArrayEqual(snippets[i], bytecode_array);
224 } 226 }
225 } 227 }
226 228
227 229
228 TEST(PrimitiveExpressions) { 230 TEST(PrimitiveExpressions) {
229 InitializedHandleScope handle_scope; 231 InitializedHandleScope handle_scope;
230 BytecodeGeneratorHelper helper; 232 BytecodeGeneratorHelper helper;
231 233
232 ExpectedSnippet<int> snippets[] = { 234 ExpectedSnippet<int> snippets[] = {{"var x = 0; return x;",
233 {"var x = 0; return x;", 235 kPointerSize,
234 kPointerSize, 236 1,
235 1, 237 6,
236 6, 238 {B(LdaZero), //
237 {B(LdaZero), // 239 B(Star), R(0), //
238 B(Star), R(0), // 240 B(Ldar), R(0), //
239 B(Ldar), R(0), // 241 B(Return)},
240 B(Return)}, 242 0},
241 0}, 243 {"var x = 0; return x + 3;",
242 {"var x = 0; return x + 3;", 244 kPointerSize,
243 2 * kPointerSize, 245 1,
244 1, 246 8,
245 12, 247 {B(LdaZero), //
246 {B(LdaZero), // 248 B(Star), R(0), //
247 B(Star), R(0), // 249 B(LdaSmi8), U8(3), //
248 B(Ldar), R(0), // Easy to spot r1 not really needed here. 250 B(Add), R(0), //
249 B(Star), R(1), // Dead store. 251 B(Return)},
250 B(LdaSmi8), U8(3), // 252 0},
251 B(Add), R(1), // 253 {"var x = 0; return x - 3;",
252 B(Return)}, 254 kPointerSize,
253 0}, 255 1,
254 {"var x = 0; return x - 3;", 256 8,
255 2 * kPointerSize, 257 {B(LdaZero), //
256 1, 258 B(Star), R(0), //
257 12, 259 B(LdaSmi8), U8(3), //
258 {B(LdaZero), // 260 B(Sub), R(0), //
259 B(Star), R(0), // 261 B(Return)},
260 B(Ldar), R(0), // Easy to spot r1 not really needed here. 262 0},
261 B(Star), R(1), // Dead store. 263 {"var x = 4; return x * 3;",
262 B(LdaSmi8), U8(3), // 264 kPointerSize,
263 B(Sub), R(1), // 265 1,
264 B(Return)}, 266 9,
265 0}, 267 {B(LdaSmi8), U8(4), //
266 {"var x = 4; return x * 3;", 268 B(Star), R(0), //
267 2 * kPointerSize, 269 B(LdaSmi8), U8(3), //
268 1, 270 B(Mul), R(0), //
269 13, 271 B(Return)},
270 {B(LdaSmi8), U8(4), // 272 0},
271 B(Star), R(0), // 273 {"var x = 4; return x / 3;",
272 B(Ldar), R(0), // Easy to spot r1 not really needed here. 274 kPointerSize,
273 B(Star), R(1), // Dead store. 275 1,
274 B(LdaSmi8), U8(3), // 276 9,
275 B(Mul), R(1), // 277 {B(LdaSmi8), U8(4), //
276 B(Return)}, 278 B(Star), R(0), //
277 0}, 279 B(LdaSmi8), U8(3), //
278 {"var x = 4; return x / 3;", 280 B(Div), R(0), //
279 2 * kPointerSize, 281 B(Return)},
280 1, 282 0},
281 13, 283 {"var x = 4; return x % 3;",
282 {B(LdaSmi8), U8(4), // 284 kPointerSize,
283 B(Star), R(0), // 285 1,
284 B(Ldar), R(0), // Easy to spot r1 not really needed here. 286 9,
285 B(Star), R(1), // Dead store. 287 {B(LdaSmi8), U8(4), //
286 B(LdaSmi8), U8(3), // 288 B(Star), R(0), //
287 B(Div), R(1), // 289 B(LdaSmi8), U8(3), //
288 B(Return)}, 290 B(Mod), R(0), //
289 0}, 291 B(Return)},
290 {"var x = 4; return x % 3;", 292 0},
291 2 * kPointerSize, 293 {"var x = 1; return x | 2;",
292 1, 294 kPointerSize,
293 13, 295 1,
294 {B(LdaSmi8), U8(4), // 296 9,
295 B(Star), R(0), // 297 {B(LdaSmi8), U8(1), //
296 B(Ldar), R(0), // Easy to spot r1 not really needed here. 298 B(Star), R(0), //
297 B(Star), R(1), // Dead store. 299 B(LdaSmi8), U8(2), //
298 B(LdaSmi8), U8(3), // 300 B(BitwiseOr), R(0), //
299 B(Mod), R(1), // 301 B(Return)},
300 B(Return)}, 302 0},
301 0}, 303 {"var x = 1; return x ^ 2;",
302 {"var x = 1; return x | 2;", 304 kPointerSize,
303 2 * kPointerSize, 305 1,
304 1, 306 9,
305 13, 307 {B(LdaSmi8), U8(1), //
306 {B(LdaSmi8), U8(1), // 308 B(Star), R(0), //
307 B(Star), R(0), // 309 B(LdaSmi8), U8(2), //
308 B(Ldar), R(0), // Easy to spot r1 not really needed here. 310 B(BitwiseXor), R(0), //
309 B(Star), R(1), // Dead store. 311 B(Return)},
310 B(LdaSmi8), U8(2), // 312 0},
311 B(BitwiseOr), R(1), // 313 {"var x = 1; return x & 2;",
312 B(Return)}, 314 kPointerSize,
313 0}, 315 1,
314 {"var x = 1; return x ^ 2;", 316 9,
315 2 * kPointerSize, 317 {B(LdaSmi8), U8(1), //
316 1, 318 B(Star), R(0), //
317 13, 319 B(LdaSmi8), U8(2), //
318 {B(LdaSmi8), U8(1), // 320 B(BitwiseAnd), R(0), //
319 B(Star), R(0), // 321 B(Return)},
320 B(Ldar), R(0), // Easy to spot r1 not really needed here. 322 0},
321 B(Star), R(1), // Dead store. 323 {"var x = 10; return x << 3;",
322 B(LdaSmi8), U8(2), // 324 kPointerSize,
323 B(BitwiseXor), R(1), // 325 1,
324 B(Return)}, 326 9,
325 0}, 327 {B(LdaSmi8), U8(10), //
326 {"var x = 1; return x & 2;", 328 B(Star), R(0), //
327 2 * kPointerSize, 329 B(LdaSmi8), U8(3), //
328 1, 330 B(ShiftLeft), R(0), //
329 13, 331 B(Return)},
330 {B(LdaSmi8), U8(1), // 332 0},
331 B(Star), R(0), // 333 {"var x = 10; return x >> 3;",
332 B(Ldar), R(0), // Easy to spot r1 not really needed here. 334 kPointerSize,
333 B(Star), R(1), // Dead store. 335 1,
334 B(LdaSmi8), U8(2), // 336 9,
335 B(BitwiseAnd), R(1), // 337 {B(LdaSmi8), U8(10), //
336 B(Return)}, 338 B(Star), R(0), //
337 0}, 339 B(LdaSmi8), U8(3), //
338 {"var x = 10; return x << 3;", 340 B(ShiftRight), R(0), //
339 2 * kPointerSize, 341 B(Return)},
340 1, 342 0},
341 13, 343 {"var x = 10; return x >>> 3;",
342 {B(LdaSmi8), U8(10), // 344 kPointerSize,
343 B(Star), R(0), // 345 1,
344 B(Ldar), R(0), // Easy to spot r1 not really needed here. 346 9,
345 B(Star), R(1), // Dead store. 347 {B(LdaSmi8), U8(10), //
346 B(LdaSmi8), U8(3), // 348 B(Star), R(0), //
347 B(ShiftLeft), R(1), // 349 B(LdaSmi8), U8(3), //
348 B(Return)}, 350 B(ShiftRightLogical), R(0), //
349 0}, 351 B(Return)},
350 {"var x = 10; return x >> 3;", 352 0},
351 2 * kPointerSize, 353 {"var x = 0; return (x, 3);",
352 1, 354 kPointerSize,
353 13, 355 1,
354 {B(LdaSmi8), U8(10), // 356 6,
355 B(Star), R(0), // 357 {B(LdaZero), //
356 B(Ldar), R(0), // Easy to spot r1 not really needed here. 358 B(Star), R(0), //
357 B(Star), R(1), // Dead store. 359 B(LdaSmi8), U8(3), //
358 B(LdaSmi8), U8(3), // 360 B(Return)},
359 B(ShiftRight), R(1), // 361 0}};
360 B(Return)},
361 0},
362 {"var x = 10; return x >>> 3;",
363 2 * kPointerSize,
364 1,
365 13,
366 {B(LdaSmi8), U8(10), //
367 B(Star), R(0), //
368 B(Ldar), R(0), // Easy to spot r1 not really needed here.
369 B(Star), R(1), // Dead store.
370 B(LdaSmi8), U8(3), //
371 B(ShiftRightLogical), R(1), //
372 B(Return)},
373 0},
374 {"var x = 0; return (x, 3);",
375 1 * kPointerSize,
376 1,
377 8,
378 {B(LdaZero), //
379 B(Star), R(0), //
380 B(Ldar), R(0), //
381 B(LdaSmi8), U8(3), //
382 B(Return)},
383 0}};
384 362
385 for (size_t i = 0; i < arraysize(snippets); i++) { 363 for (size_t i = 0; i < arraysize(snippets); i++) {
386 Handle<BytecodeArray> bytecode_array = 364 Handle<BytecodeArray> bytecode_array =
387 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); 365 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet);
388 CheckBytecodeArrayEqual(snippets[i], bytecode_array); 366 CheckBytecodeArrayEqual(snippets[i], bytecode_array);
389 } 367 }
390 } 368 }
391 369
392 370
393 TEST(LogicalExpressions) { 371 TEST(LogicalExpressions) {
(...skipping 17 matching lines...) Expand all
411 1 * kPointerSize, 389 1 * kPointerSize,
412 1, 390 1,
413 10, 391 10,
414 {B(LdaZero), // 392 {B(LdaZero), //
415 B(Star), R(0), // 393 B(Star), R(0), //
416 B(Ldar), R(0), // 394 B(Ldar), R(0), //
417 B(JumpIfToBooleanFalse), U8(4), // 395 B(JumpIfToBooleanFalse), U8(4), //
418 B(LdaSmi8), U8(3), // 396 B(LdaSmi8), U8(3), //
419 B(Return)}, 397 B(Return)},
420 0}, 398 0},
399 {"var x = 0; return x || (1, 2, 3);",
400 1 * kPointerSize,
401 1,
402 10,
403 {B(LdaZero), //
404 B(Star), R(0), //
405 B(Ldar), R(0), //
406 B(JumpIfToBooleanTrue), U8(4), //
407 B(LdaSmi8), U8(3), //
408 B(Return)},
409 0},
410 {"var a = 2, b = 3, c = 4; return a || (a, b, a, b, c = 5, 3);",
411 3 * kPointerSize,
412 1,
413 23,
414 {B(LdaSmi8), U8(2), //
415 B(Star), R(0), //
416 B(LdaSmi8), U8(3), //
417 B(Star), R(1), //
418 B(LdaSmi8), U8(4), //
419 B(Star), R(2), //
420 B(Ldar), R(0), //
421 B(JumpIfToBooleanTrue), U8(8), //
422 B(LdaSmi8), U8(5), //
423 B(Star), R(2), //
424 B(LdaSmi8), U8(3), //
425 B(Return)},
426 0},
421 {"var x = 1; var a = 2, b = 3; return x || (" 427 {"var x = 1; var a = 2, b = 3; return x || ("
422 #define X "a, b, a, b, " 428 #define X "a = 1, b = 2, "
423 X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 429 X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
424 #undef X 430 #undef X
425 "3);", 431 "3);",
426 3 * kPointerSize, 432 3 * kPointerSize,
427 1, 433 1,
428 283, 434 283,
429 {B(LdaSmi8), U8(1), // 435 {B(LdaSmi8), U8(1), //
430 B(Star), R(0), // 436 B(Star), R(0), //
431 B(LdaSmi8), U8(2), // 437 B(LdaSmi8), U8(2), //
432 B(Star), R(1), // 438 B(Star), R(1), //
433 B(LdaSmi8), U8(3), // 439 B(LdaSmi8), U8(3), //
434 B(Star), R(2), // 440 B(Star), R(2), //
435 B(Ldar), R(0), // 441 B(Ldar), R(0), //
436 B(JumpIfToBooleanTrueConstant), U8(0), // 442 B(JumpIfToBooleanTrueConstant), U8(0), //
437 #define X B(Ldar), R(1), B(Ldar), R(2), B(Ldar), R(1), B(Ldar), R(2), 443 #define X B(LdaSmi8), U8(1), B(Star), R(1), B(LdaSmi8), U8(2), B(Star), R(2),
438 X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 444 X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
439 #undef X 445 #undef X
440 B(LdaSmi8), U8(3), // 446 B(LdaSmi8), U8(3), //
441 B(Return)}, 447 B(Return)},
442 1, 448 1,
443 {268, 0, 0, 0}}, 449 {268, 0, 0, 0}},
444 {"var x = 0; var a = 2, b = 3; return x && (" 450 {"var x = 0; var a = 2, b = 3; return x && ("
445 #define X "a, b, a, b, " 451 #define X "a = 1, b = 2, "
446 X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 452 X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
447 #undef X 453 #undef X
448 "3);", 454 "3);",
449 3 * kPointerSize, 455 3 * kPointerSize,
450 1, 456 1,
451 282, 457 282,
452 {B(LdaZero), // 458 {B(LdaZero), //
453 B(Star), R(0), // 459 B(Star), R(0), //
454 B(LdaSmi8), U8(2), // 460 B(LdaSmi8), U8(2), //
455 B(Star), R(1), // 461 B(Star), R(1), //
456 B(LdaSmi8), U8(3), // 462 B(LdaSmi8), U8(3), //
457 B(Star), R(2), // 463 B(Star), R(2), //
458 B(Ldar), R(0), // 464 B(Ldar), R(0), //
459 B(JumpIfToBooleanFalseConstant), U8(0), // 465 B(JumpIfToBooleanFalseConstant), U8(0), //
460 #define X B(Ldar), R(1), B(Ldar), R(2), B(Ldar), R(1), B(Ldar), R(2), 466 #define X B(LdaSmi8), U8(1), B(Star), R(1), B(LdaSmi8), U8(2), B(Star), R(2),
461 X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 467 X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
462 #undef X 468 #undef X
463 B(LdaSmi8), U8(3), // 469 B(LdaSmi8), U8(3), //
464 B(Return)}, 470 B(Return)},
465 1, 471 1,
466 {268, 0, 0, 0}}, 472 {268, 0, 0, 0}},
467 {"return 0 && 3;", 473 {"return 0 && 3;",
468 0 * kPointerSize, 474 0 * kPointerSize,
469 1, 475 1,
470 2, 476 2,
471 {B(LdaZero), // 477 {B(LdaZero), //
472 B(Return)}, 478 B(Return)},
473 0}, 479 0},
474 {"return 1 || 3;", 480 {"return 1 || 3;",
475 0 * kPointerSize, 481 0 * kPointerSize,
476 1, 482 1,
477 3, 483 3,
478 {B(LdaSmi8), U8(1), // 484 {B(LdaSmi8), U8(1), //
479 B(Return)}, 485 B(Return)},
480 0}, 486 0},
481 {"var x = 1; return x && 3 || 0, 1;", 487 {"var x = 1; return x && 3 || 0, 1;",
482 1 * kPointerSize, 488 1 * kPointerSize,
483 1, 489 1,
484 16, 490 16,
485 {B(LdaSmi8), U8(1), // 491 {B(LdaSmi8), U8(1), //
486 B(Star), R(0), // 492 B(Star), R(0), //
487 B(Ldar), R(0), // 493 B(Ldar), R(0), //
488 B(JumpIfToBooleanFalse), U8(4), // 494 B(JumpIfToBooleanFalse), U8(4), //
(...skipping 11 matching lines...) Expand all
500 } 506 }
501 } 507 }
502 508
503 509
504 TEST(Parameters) { 510 TEST(Parameters) {
505 InitializedHandleScope handle_scope; 511 InitializedHandleScope handle_scope;
506 BytecodeGeneratorHelper helper; 512 BytecodeGeneratorHelper helper;
507 513
508 ExpectedSnippet<int> snippets[] = { 514 ExpectedSnippet<int> snippets[] = {
509 {"function f() { return this; }", 515 {"function f() { return this; }",
510 0, 1, 3, {B(Ldar), R(helper.kLastParamIndex), B(Return)}, 0}, 516 0,
517 1,
518 3,
519 {B(Ldar), THIS(1), B(Return)},
520 0},
511 {"function f(arg1) { return arg1; }", 521 {"function f(arg1) { return arg1; }",
512 0, 2, 3, {B(Ldar), R(helper.kLastParamIndex), B(Return)}, 0}, 522 0,
523 2,
524 3,
525 {B(Ldar), A(1, 2), B(Return)},
526 0},
513 {"function f(arg1) { return this; }", 527 {"function f(arg1) { return this; }",
514 0, 2, 3, {B(Ldar), R(helper.kLastParamIndex - 1), B(Return)}, 0}, 528 0,
529 2,
530 3,
531 {B(Ldar), THIS(2), B(Return)},
532 0},
515 {"function f(arg1, arg2, arg3, arg4, arg5, arg6, arg7) { return arg4; }", 533 {"function f(arg1, arg2, arg3, arg4, arg5, arg6, arg7) { return arg4; }",
516 0, 8, 3, {B(Ldar), R(helper.kLastParamIndex - 3), B(Return)}, 0}, 534 0,
535 8,
536 3,
537 {B(Ldar), A(4, 8), B(Return)},
538 0},
517 {"function f(arg1, arg2, arg3, arg4, arg5, arg6, arg7) { return this; }", 539 {"function f(arg1, arg2, arg3, arg4, arg5, arg6, arg7) { return this; }",
518 0, 8, 3, {B(Ldar), R(helper.kLastParamIndex - 7), B(Return)}, 0}, 540 0,
541 8,
542 3,
543 {B(Ldar), THIS(8), B(Return)},
544 0},
519 {"function f(arg1) { arg1 = 1; }", 545 {"function f(arg1) { arg1 = 1; }",
520 0, 2, 6, 546 0,
521 {B(LdaSmi8), U8(1), // 547 2,
522 B(Star), R(helper.kLastParamIndex), // 548 6,
523 B(LdaUndefined), // 549 {B(LdaSmi8), U8(1), //
550 B(Star), A(1, 2), //
551 B(LdaUndefined), //
524 B(Return)}, 552 B(Return)},
525 0}, 553 0},
526 {"function f(arg1, arg2, arg3, arg4) { arg2 = 1; }", 554 {"function f(arg1, arg2, arg3, arg4) { arg2 = 1; }",
527 0, 5, 6, 555 0,
528 {B(LdaSmi8), U8(1), // 556 5,
529 B(Star), R(helper.kLastParamIndex - 2), // 557 6,
530 B(LdaUndefined), // 558 {B(LdaSmi8), U8(1), //
559 B(Star), A(2, 5), //
560 B(LdaUndefined), //
531 B(Return)}, 561 B(Return)},
532 0}, 562 0},
533 }; 563 };
534 564
535 for (size_t i = 0; i < arraysize(snippets); i++) { 565 for (size_t i = 0; i < arraysize(snippets); i++) {
536 Handle<BytecodeArray> bytecode_array = 566 Handle<BytecodeArray> bytecode_array =
537 helper.MakeBytecodeForFunction(snippets[i].code_snippet); 567 helper.MakeBytecodeForFunction(snippets[i].code_snippet);
538 CheckBytecodeArrayEqual(snippets[i], bytecode_array); 568 CheckBytecodeArrayEqual(snippets[i], bytecode_array);
539 } 569 }
540 } 570 }
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
690 720
691 FeedbackVectorSpec feedback_spec(&zone); 721 FeedbackVectorSpec feedback_spec(&zone);
692 FeedbackVectorSlot slot1 = feedback_spec.AddLoadICSlot(); 722 FeedbackVectorSlot slot1 = feedback_spec.AddLoadICSlot();
693 FeedbackVectorSlot slot2 = feedback_spec.AddLoadICSlot(); 723 FeedbackVectorSlot slot2 = feedback_spec.AddLoadICSlot();
694 724
695 Handle<i::TypeFeedbackVector> vector = 725 Handle<i::TypeFeedbackVector> vector =
696 i::NewTypeFeedbackVector(helper.isolate(), &feedback_spec); 726 i::NewTypeFeedbackVector(helper.isolate(), &feedback_spec);
697 727
698 ExpectedSnippet<const char*> snippets[] = { 728 ExpectedSnippet<const char*> snippets[] = {
699 {"function f(a) { return a.name; }\nf({name : \"test\"})", 729 {"function f(a) { return a.name; }\nf({name : \"test\"})",
700 1 * kPointerSize, 730 0,
701 2, 731 2,
702 10, 732 6,
703 { 733 {
704 B(Ldar), R(helper.kLastParamIndex), // 734 B(LdaConstant), U8(0), //
705 B(Star), R(0), // 735 B(LoadICSloppy), A(1, 2), U8(vector->GetIndex(slot1)), //
706 B(LdaConstant), U8(0), // 736 B(Return), //
707 B(LoadICSloppy), R(0), U8(vector->GetIndex(slot1)), //
708 B(Return) //
709 }, 737 },
710 1, 738 1,
711 {"name"}}, 739 {"name"}},
712 {"function f(a) { return a[\"key\"]; }\nf({key : \"test\"})", 740 {"function f(a) { return a[\"key\"]; }\nf({key : \"test\"})",
713 1 * kPointerSize, 741 0,
714 2, 742 2,
715 10, 743 6,
716 { 744 {
717 B(Ldar), R(helper.kLastParamIndex), // 745 B(LdaConstant), U8(0), //
718 B(Star), R(0), // 746 B(LoadICSloppy), A(1, 2), U8(vector->GetIndex(slot1)), //
719 B(LdaConstant), U8(0), // 747 B(Return) //
720 B(LoadICSloppy), R(0), U8(vector->GetIndex(slot1)), //
721 B(Return) //
722 }, 748 },
723 1, 749 1,
724 {"key"}}, 750 {"key"}},
725 {"function f(a) { return a[100]; }\nf({100 : \"test\"})", 751 {"function f(a) { return a[100]; }\nf({100 : \"test\"})",
726 1 * kPointerSize, 752 0,
727 2, 753 2,
728 10, 754 6,
729 { 755 {
730 B(Ldar), R(helper.kLastParamIndex), // 756 B(LdaSmi8), U8(100), //
731 B(Star), R(0), // 757 B(KeyedLoadICSloppy), A(1, 2), U8(vector->GetIndex(slot1)), //
732 B(LdaSmi8), U8(100), // 758 B(Return) //
733 B(KeyedLoadICSloppy), R(0), U8(vector->GetIndex(slot1)), //
734 B(Return) //
735 }, 759 },
736 0}, 760 0},
737 {"function f(a, b) { return a[b]; }\nf({arg : \"test\"}, \"arg\")", 761 {"function f(a, b) { return a[b]; }\nf({arg : \"test\"}, \"arg\")",
738 1 * kPointerSize, 762 0,
739 3, 763 3,
740 10, 764 6,
741 { 765 {
742 B(Ldar), R(helper.kLastParamIndex - 1), // 766 B(Ldar), A(1, 2), //
743 B(Star), R(0), // 767 B(KeyedLoadICSloppy), A(1, 3), U8(vector->GetIndex(slot1)), //
744 B(Ldar), R(helper.kLastParamIndex), // 768 B(Return) //
745 B(KeyedLoadICSloppy), R(0), U8(vector->GetIndex(slot1)), //
746 B(Return) //
747 }, 769 },
748 0}, 770 0},
749 {"function f(a) { var b = a.name; return a[-124]; }\n" 771 {"function f(a) { var b = a.name; return a[-124]; }\n"
750 "f({\"-124\" : \"test\", name : 123 })", 772 "f({\"-124\" : \"test\", name : 123 })",
751 2 * kPointerSize, 773 kPointerSize,
752 2, 774 2,
753 21, 775 13,
754 { 776 {
755 B(Ldar), R(helper.kLastParamIndex), // 777 B(LdaConstant), U8(0), //
756 B(Star), R(1), // 778 B(LoadICSloppy), A(1, 2), U8(vector->GetIndex(slot1)), //
757 B(LdaConstant), U8(0), // 779 B(Star), R(0), //
758 B(LoadICSloppy), R(1), U8(vector->GetIndex(slot1)), // 780 B(LdaSmi8), U8(-124), //
759 B(Star), R(0), // 781 B(KeyedLoadICSloppy), A(1, 2), U8(vector->GetIndex(slot2)), //
760 B(Ldar), R(helper.kLastParamIndex), // 782 B(Return), //
761 B(Star), R(1), //
762 B(LdaSmi8), U8(-124), //
763 B(KeyedLoadICSloppy), R(1), U8(vector->GetIndex(slot2)), //
764 B(Return) //
765 }, 783 },
766 1, 784 1,
767 {"name"}}, 785 {"name"}},
768 {"function f(a) { \"use strict\"; return a.name; }\nf({name : \"test\"})", 786 {"function f(a) { \"use strict\"; return a.name; }\nf({name : \"test\"})",
769 1 * kPointerSize, 787 0,
770 2, 788 2,
771 12, 789 6,
772 { 790 {
773 // TODO(rmcilroy) Avoid unnecessary LdaConstant for "use strict" 791 B(LdaConstant), U8(0), //
774 // expression, or any other unused literal expression. 792 B(LoadICStrict), A(1, 2), U8(vector->GetIndex(slot1)), //
775 B(LdaConstant), U8(0), // 793 B(Return), //
776 B(Ldar), R(helper.kLastParamIndex), //
777 B(Star), R(0), //
778 B(LdaConstant), U8(1), //
779 B(LoadICStrict), R(0), U8(vector->GetIndex(slot1)), //
780 B(Return) //
781 }, 794 },
782 2, 795 1,
783 {"use strict", "name"}}, 796 {"name"}},
784 {"function f(a, b) { \"use strict\"; return a[b]; }\n" 797 {"function f(a, b) { \"use strict\"; return a[b]; }\n"
785 "f({arg : \"test\"}, \"arg\")", 798 "f({arg : \"test\"}, \"arg\")",
786 1 * kPointerSize, 799 0,
787 3, 800 3,
788 12, 801 6,
789 { 802 {
790 // TODO(rmcilroy) Avoid unnecessary LdaConstant for "use strict" 803 B(Ldar), A(2, 3), //
791 // expression, or any other unused literal expression. 804 B(KeyedLoadICStrict), A(1, 3), U8(vector->GetIndex(slot1)), //
792 B(LdaConstant), U8(0), // 805 B(Return), //
793 B(Ldar), R(helper.kLastParamIndex - 1), //
794 B(Star), R(0), //
795 B(Ldar), R(helper.kLastParamIndex), //
796 B(KeyedLoadICStrict), R(0), U8(vector->GetIndex(slot1)), //
797 B(Return) //
798 }, 806 },
799 1, 807 0,
800 {"use strict"}}}; 808 }};
801 for (size_t i = 0; i < arraysize(snippets); i++) { 809 for (size_t i = 0; i < arraysize(snippets); i++) {
802 Handle<BytecodeArray> bytecode_array = 810 Handle<BytecodeArray> bytecode_array =
803 helper.MakeBytecode(snippets[i].code_snippet, helper.kFunctionName); 811 helper.MakeBytecode(snippets[i].code_snippet, helper.kFunctionName);
804 CheckBytecodeArrayEqual(snippets[i], bytecode_array); 812 CheckBytecodeArrayEqual(snippets[i], bytecode_array);
805 } 813 }
806 } 814 }
807 815
808 816
809 TEST(PropertyStores) { 817 TEST(PropertyStores) {
810 InitializedHandleScope handle_scope; 818 InitializedHandleScope handle_scope;
811 BytecodeGeneratorHelper helper; 819 BytecodeGeneratorHelper helper;
812 Zone zone; 820 Zone zone;
813 821
814 FeedbackVectorSpec feedback_spec(&zone); 822 FeedbackVectorSpec feedback_spec(&zone);
815 FeedbackVectorSlot slot1 = feedback_spec.AddStoreICSlot(); 823 FeedbackVectorSlot slot1 = feedback_spec.AddStoreICSlot();
816 FeedbackVectorSlot slot2 = feedback_spec.AddStoreICSlot(); 824 FeedbackVectorSlot slot2 = feedback_spec.AddStoreICSlot();
817 825
818 Handle<i::TypeFeedbackVector> vector = 826 Handle<i::TypeFeedbackVector> vector =
819 i::NewTypeFeedbackVector(helper.isolate(), &feedback_spec); 827 i::NewTypeFeedbackVector(helper.isolate(), &feedback_spec);
820 828
821 ExpectedSnippet<const char*> snippets[] = { 829 ExpectedSnippet<const char*> snippets[] = {
822 {"function f(a) { a.name = \"val\"; }\nf({name : \"test\"})", 830 {"function f(a) { a.name = \"val\"; }\nf({name : \"test\"})",
823 2 * kPointerSize, 831 kPointerSize,
824 2, 832 2,
825 16, 833 12,
826 { 834 {
827 B(Ldar), R(helper.kLastParamIndex), // 835 B(LdaConstant), U8(0), //
828 B(Star), R(0), // 836 B(Star), R(0), //
829 B(LdaConstant), U8(0), // 837 B(LdaConstant), U8(1), //
830 B(Star), R(1), // 838 B(StoreICSloppy), A(1, 2), R(0), U8(vector->GetIndex(slot1)), //
831 B(LdaConstant), U8(1), // 839 B(LdaUndefined), //
832 B(StoreICSloppy), R(0), R(1), U8(vector->GetIndex(slot1)), // 840 B(Return), //
833 B(LdaUndefined), //
834 B(Return) //
835 }, 841 },
836 2, 842 2,
837 {"name", "val"}}, 843 {"name", "val"}},
838 {"function f(a) { a[\"key\"] = \"val\"; }\nf({key : \"test\"})", 844 {"function f(a) { a[\"key\"] = \"val\"; }\nf({key : \"test\"})",
839 2 * kPointerSize, 845 kPointerSize,
840 2, 846 2,
841 16, 847 12,
842 { 848 {
843 B(Ldar), R(helper.kLastParamIndex), // 849 B(LdaConstant), U8(0), //
844 B(Star), R(0), // 850 B(Star), R(0), //
845 B(LdaConstant), U8(0), // 851 B(LdaConstant), U8(1), //
846 B(Star), R(1), // 852 B(StoreICSloppy), A(1, 2), R(0), U8(vector->GetIndex(slot1)), //
847 B(LdaConstant), U8(1), // 853 B(LdaUndefined), //
848 B(StoreICSloppy), R(0), R(1), U8(vector->GetIndex(slot1)), // 854 B(Return), //
849 B(LdaUndefined), //
850 B(Return) //
851 }, 855 },
852 2, 856 2,
853 {"key", "val"}}, 857 {"key", "val"}},
854 {"function f(a) { a[100] = \"val\"; }\nf({100 : \"test\"})", 858 {"function f(a) { a[100] = \"val\"; }\nf({100 : \"test\"})",
855 2 * kPointerSize, 859 kPointerSize,
856 2, 860 2,
857 16, 861 12,
858 { 862 {
859 B(Ldar), R(helper.kLastParamIndex), // 863 B(LdaSmi8), U8(100), //
860 B(Star), R(0), // 864 B(Star), R(0), //
861 B(LdaSmi8), U8(100), // 865 B(LdaConstant), U8(0), //
862 B(Star), R(1), // 866 B(KeyedStoreICSloppy), //
863 B(LdaConstant), U8(0), // 867 A(1, 2), R(0), U8(vector->GetIndex(slot1)), //
864 B(KeyedStoreICSloppy), R(0), R(1), U8(vector->GetIndex(slot1)), // 868 B(LdaUndefined), //
865 B(LdaUndefined), // 869 B(Return), //
866 B(Return) //
867 }, 870 },
868 1, 871 1,
869 {"val"}}, 872 {"val"}},
870 {"function f(a, b) { a[b] = \"val\"; }\nf({arg : \"test\"}, \"arg\")", 873 {"function f(a, b) { a[b] = \"val\"; }\nf({arg : \"test\"}, \"arg\")",
871 2 * kPointerSize, 874 0,
872 3, 875 3,
873 16, 876 8,
874 { 877 {
875 B(Ldar), R(helper.kLastParamIndex - 1), // 878 B(LdaConstant), U8(0), //
876 B(Star), R(0), // 879 B(KeyedStoreICSloppy), //
877 B(Ldar), R(helper.kLastParamIndex), // 880 A(1, 3), A(2, 3), U8(vector->GetIndex(slot1)), //
878 B(Star), R(1), // 881 B(LdaUndefined), //
879 B(LdaConstant), U8(0), // 882 B(Return), //
880 B(KeyedStoreICSloppy), R(0), R(1), U8(vector->GetIndex(slot1)), //
881 B(LdaUndefined), //
882 B(Return) //
883 }, 883 },
884 1, 884 1,
885 {"val"}}, 885 {"val"}},
886 {"function f(a) { a.name = a[-124]; }\n" 886 {"function f(a) { a.name = a[-124]; }\n"
887 "f({\"-124\" : \"test\", name : 123 })", 887 "f({\"-124\" : \"test\", name : 123 })",
888 3 * kPointerSize, 888 kPointerSize,
889 2, 889 2,
890 23, 890 15,
891 { 891 {
892 B(Ldar), R(helper.kLastParamIndex), // 892 B(LdaConstant), U8(0), //
893 B(Star), R(0), // 893 B(Star), R(0), //
894 B(LdaConstant), U8(0), // 894 B(LdaSmi8), U8(-124), //
895 B(Star), R(1), // 895 B(KeyedLoadICSloppy), A(1, 2), U8(vector->GetIndex(slot1)), //
896 B(Ldar), R(helper.kLastParamIndex), // 896 B(StoreICSloppy), A(1, 2), R(0), U8(vector->GetIndex(slot2)), //
897 B(Star), R(2), // 897 B(LdaUndefined), //
898 B(LdaSmi8), U8(-124), // 898 B(Return), //
899 B(KeyedLoadICSloppy), R(2), U8(vector->GetIndex(slot1)), //
900 B(StoreICSloppy), R(0), R(1), U8(vector->GetIndex(slot2)), //
901 B(LdaUndefined), //
902 B(Return) //
903 }, 899 },
904 1, 900 1,
905 {"name"}}, 901 {"name"}},
906 {"function f(a) { \"use strict\"; a.name = \"val\"; }\n" 902 {"function f(a) { \"use strict\"; a.name = \"val\"; }\n"
907 "f({name : \"test\"})", 903 "f({name : \"test\"})",
908 2 * kPointerSize, 904 kPointerSize,
909 2, 905 2,
910 18, 906 12,
911 { 907 {
912 // TODO(rmcilroy) Avoid unnecessary LdaConstant for "use strict" 908 B(LdaConstant), U8(0), //
913 // expression, or any other unused literal expression. 909 B(Star), R(0), //
914 B(LdaConstant), U8(0), // 910 B(LdaConstant), U8(1), //
915 B(Ldar), R(helper.kLastParamIndex), // 911 B(StoreICStrict), A(1, 2), R(0), U8(vector->GetIndex(slot1)), //
916 B(Star), R(0), // 912 B(LdaUndefined), //
917 B(LdaConstant), U8(1), // 913 B(Return), //
918 B(Star), R(1), //
919 B(LdaConstant), U8(2), //
920 B(StoreICStrict), R(0), R(1), U8(vector->GetIndex(slot1)), //
921 B(LdaUndefined), //
922 B(Return) //
923 }, 914 },
924 3, 915 2,
925 {"use strict", "name", "val"}}, 916 {"name", "val"}},
926 {"function f(a, b) { \"use strict\"; a[b] = \"val\"; }\n" 917 {"function f(a, b) { \"use strict\"; a[b] = \"val\"; }\n"
927 "f({arg : \"test\"}, \"arg\")", 918 "f({arg : \"test\"}, \"arg\")",
928 2 * kPointerSize, 919 0,
929 3, 920 3,
930 18, 921 8,
931 { 922 {
932 // TODO(rmcilroy) Avoid unnecessary LdaConstant for "use strict" 923 B(LdaConstant), U8(0), //
933 // expression, or any other unused literal expression. 924 B(KeyedStoreICStrict), A(1, 3), A(2, 3), //
934 B(LdaConstant), U8(0), // 925 U8(vector->GetIndex(slot1)), //
935 B(Ldar), R(helper.kLastParamIndex - 1), // 926 B(LdaUndefined), //
936 B(Star), R(0), // 927 B(Return), //
937 B(Ldar), R(helper.kLastParamIndex), //
938 B(Star), R(1), //
939 B(LdaConstant), U8(1), //
940 B(KeyedStoreICStrict), R(0), R(1), U8(vector->GetIndex(slot1)), //
941 B(LdaUndefined), //
942 B(Return) //
943 }, 928 },
944 2, 929 1,
945 {"use strict", "val"}}}; 930 {"val"}}};
946 for (size_t i = 0; i < arraysize(snippets); i++) { 931 for (size_t i = 0; i < arraysize(snippets); i++) {
947 Handle<BytecodeArray> bytecode_array = 932 Handle<BytecodeArray> bytecode_array =
948 helper.MakeBytecode(snippets[i].code_snippet, helper.kFunctionName); 933 helper.MakeBytecode(snippets[i].code_snippet, helper.kFunctionName);
949 CheckBytecodeArrayEqual(snippets[i], bytecode_array); 934 CheckBytecodeArrayEqual(snippets[i], bytecode_array);
950 } 935 }
951 } 936 }
952 937
953 938
954 #define FUNC_ARG "new (function Obj() { this.func = function() { return; }})()" 939 #define FUNC_ARG "new (function Obj() { this.func = function() { return; }})()"
955 940
(...skipping 10 matching lines...) Expand all
966 951
967 Handle<i::TypeFeedbackVector> vector = 952 Handle<i::TypeFeedbackVector> vector =
968 i::NewTypeFeedbackVector(helper.isolate(), &feedback_spec); 953 i::NewTypeFeedbackVector(helper.isolate(), &feedback_spec);
969 954
970 ExpectedSnippet<const char*> snippets[] = { 955 ExpectedSnippet<const char*> snippets[] = {
971 {"function f(a) { return a.func(); }\nf(" FUNC_ARG ")", 956 {"function f(a) { return a.func(); }\nf(" FUNC_ARG ")",
972 2 * kPointerSize, 957 2 * kPointerSize,
973 2, 958 2,
974 16, 959 16,
975 { 960 {
976 B(Ldar), R(helper.kLastParamIndex), // 961 B(Ldar), A(1, 2), //
977 B(Star), R(1), // 962 B(Star), R(1), //
978 B(LdaConstant), U8(0), // 963 B(LdaConstant), U8(0), //
979 B(LoadICSloppy), R(1), U8(vector->GetIndex(slot2)), // 964 B(LoadICSloppy), R(1), U8(vector->GetIndex(slot2)), //
980 B(Star), R(0), // 965 B(Star), R(0), //
981 B(Call), R(0), R(1), U8(0), // 966 B(Call), R(0), R(1), U8(0), //
982 B(Return) // 967 B(Return), //
983 }, 968 },
984 1, 969 1,
985 {"func"}}, 970 {"func"}},
986 {"function f(a, b, c) { return a.func(b, c); }\nf(" FUNC_ARG ", 1, 2)", 971 {"function f(a, b, c) { return a.func(b, c); }\nf(" FUNC_ARG ", 1, 2)",
987 4 * kPointerSize, 972 4 * kPointerSize,
988 4, 973 4,
989 24, 974 24,
990 { 975 {
991 B(Ldar), R(helper.kLastParamIndex - 2), // 976 B(Ldar), A(1, 4), //
992 B(Star), R(1), // 977 B(Star), R(1), //
993 B(LdaConstant), U8(0), // 978 B(LdaConstant), U8(0), //
994 B(LoadICSloppy), R(1), U8(vector->GetIndex(slot2)), // 979 B(LoadICSloppy), R(1), U8(vector->GetIndex(slot2)), //
995 B(Star), R(0), // 980 B(Star), R(0), //
996 B(Ldar), R(helper.kLastParamIndex - 1), // 981 B(Ldar), A(2, 4), //
997 B(Star), R(2), // 982 B(Star), R(2), //
998 B(Ldar), R(helper.kLastParamIndex), // 983 B(Ldar), A(3, 4), //
999 B(Star), R(3), // 984 B(Star), R(3), //
1000 B(Call), R(0), R(1), U8(2), // 985 B(Call), R(0), R(1), U8(2), //
1001 B(Return) // 986 B(Return) //
1002 }, 987 },
1003 1, 988 1,
1004 {"func"}}, 989 {"func"}},
1005 {"function f(a, b) { return a.func(b + b, b); }\nf(" FUNC_ARG ", 1)", 990 {"function f(a, b) { return a.func(b + b, b); }\nf(" FUNC_ARG ", 1)",
1006 4 * kPointerSize, 991 4 * kPointerSize,
1007 3, 992 3,
1008 30, 993 26,
1009 { 994 {
1010 B(Ldar), R(helper.kLastParamIndex - 1), // 995 B(Ldar), A(1, 3), //
1011 B(Star), R(1), // 996 B(Star), R(1), //
1012 B(LdaConstant), U8(0), // 997 B(LdaConstant), U8(0), //
1013 B(LoadICSloppy), R(1), U8(vector->GetIndex(slot2)), // 998 B(LoadICSloppy), R(1), U8(vector->GetIndex(slot2)), //
1014 B(Star), R(0), // 999 B(Star), R(0), //
1015 B(Ldar), R(helper.kLastParamIndex), // 1000 B(Ldar), A(2, 3), //
1016 B(Star), R(3), // 1001 B(Add), A(2, 3), //
1017 B(Ldar), R(helper.kLastParamIndex), //
1018 B(Add), R(3), //
1019 B(Star), R(2), // 1002 B(Star), R(2), //
1020 B(Ldar), R(helper.kLastParamIndex), // 1003 B(Ldar), A(2, 3), //
1021 B(Star), R(3), // 1004 B(Star), R(3), //
1022 B(Call), R(0), R(1), U8(2), // 1005 B(Call), R(0), R(1), U8(2), //
1023 B(Return), // 1006 B(Return), //
1024 }, 1007 },
1025 1, 1008 1,
1026 {"func"}}}; 1009 {"func"}}};
1027 for (size_t i = 0; i < arraysize(snippets); i++) { 1010 for (size_t i = 0; i < arraysize(snippets); i++) {
1028 Handle<BytecodeArray> bytecode_array = 1011 Handle<BytecodeArray> bytecode_array =
1029 helper.MakeBytecode(snippets[i].code_snippet, helper.kFunctionName); 1012 helper.MakeBytecode(snippets[i].code_snippet, helper.kFunctionName);
1030 CheckBytecodeArrayEqual(snippets[i], bytecode_array); 1013 CheckBytecodeArrayEqual(snippets[i], bytecode_array);
(...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after
1287 B(LdaUndefined), // 1270 B(LdaUndefined), //
1288 B(Return) // 1271 B(Return) //
1289 }, 1272 },
1290 }, 1273 },
1291 { 1274 {
1292 "function f(a) { return %IsArray(a) }\nf(undefined)", 1275 "function f(a) { return %IsArray(a) }\nf(undefined)",
1293 1 * kPointerSize, 1276 1 * kPointerSize,
1294 2, 1277 2,
1295 10, 1278 10,
1296 { 1279 {
1297 B(Ldar), R(helper.kLastParamIndex), // 1280 B(Ldar), A(1, 2), //
1298 B(Star), R(0), // 1281 B(Star), R(0), //
1299 B(CallRuntime), U16(Runtime::kIsArray), R(0), U8(1), // 1282 B(CallRuntime), U16(Runtime::kIsArray), R(0), U8(1), //
1300 B(Return) // 1283 B(Return) //
1301 }, 1284 },
1302 }, 1285 },
1303 { 1286 {
1304 "function f() { return %Add(1, 2) }\nf()", 1287 "function f() { return %Add(1, 2) }\nf()",
1305 2 * kPointerSize, 1288 2 * kPointerSize,
1306 1, 1289 1,
1307 14, 1290 14,
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
1374 B(Return), // 1357 B(Return), //
1375 B(Jump), U8(5), // 1358 B(Jump), U8(5), //
1376 B(LdaSmi8), U8(-1), // 1359 B(LdaSmi8), U8(-1), //
1377 B(Return), // 1360 B(Return), //
1378 B(LdaUndefined), // 1361 B(LdaUndefined), //
1379 B(Return)}, // 1362 B(Return)}, //
1380 0, 1363 0,
1381 {unused, unused, unused, unused, unused, unused}}, 1364 {unused, unused, unused, unused, unused, unused}},
1382 {"function f(a) { if (a <= 0) { return 200; } else { return -200; } }" 1365 {"function f(a) { if (a <= 0) { return 200; } else { return -200; } }"
1383 "f(99);", 1366 "f(99);",
1384 kPointerSize, 1367 0,
1385 2, 1368 2,
1386 19, 1369 15,
1387 {B(Ldar), R(helper.kLastParamIndex), // 1370 {B(LdaZero), //
1388 B(Star), R(0), // 1371 B(TestLessThanOrEqual), A(1, 2), //
1389 B(LdaZero), // 1372 B(JumpIfFalse), U8(7), //
1390 B(TestLessThanOrEqual), R(0), // 1373 B(LdaConstant), U8(0), //
1391 B(JumpIfFalse), U8(7), // 1374 B(Return), //
1392 B(LdaConstant), U8(0), // 1375 B(Jump), U8(5), //
1393 B(Return), // 1376 B(LdaConstant), U8(1), //
1394 B(Jump), U8(5), // 1377 B(Return), //
1395 B(LdaConstant), U8(1), // 1378 B(LdaUndefined), //
1396 B(Return), // 1379 B(Return)}, //
1397 B(LdaUndefined), //
1398 B(Return)}, //
1399 2, 1380 2,
1400 {helper.factory()->NewNumberFromInt(200), 1381 {helper.factory()->NewNumberFromInt(200),
1401 helper.factory()->NewNumberFromInt(-200), unused, unused, unused, 1382 helper.factory()->NewNumberFromInt(-200), unused, unused, unused,
1402 unused}}, 1383 unused}},
1403 {"function f(a, b) { if (a in b) { return 200; } }" 1384 {"function f(a, b) { if (a in b) { return 200; } }"
1404 "f('prop', { prop: 'yes'});", 1385 "f('prop', { prop: 'yes'});",
1405 kPointerSize, 1386 0,
1406 3, 1387 3,
1407 15, 1388 11,
1408 {B(Ldar), R(helper.kLastParamIndex - 1), // 1389 {B(Ldar), A(2, 3), //
1409 B(Star), R(0), // 1390 B(TestIn), A(1, 3), //
1410 B(Ldar), R(helper.kLastParamIndex), // 1391 B(JumpIfFalse), U8(5), //
1411 B(TestIn), R(0), // 1392 B(LdaConstant), U8(0), //
1412 B(JumpIfFalse), U8(5), // 1393 B(Return), //
1413 B(LdaConstant), U8(0), // 1394 B(LdaUndefined), //
1414 B(Return), // 1395 B(Return)}, //
1415 B(LdaUndefined), //
1416 B(Return)}, //
1417 1, 1396 1,
1418 {helper.factory()->NewNumberFromInt(200), unused, unused, unused, unused, 1397 {helper.factory()->NewNumberFromInt(200), unused, unused, unused, unused,
1419 unused}}, 1398 unused}},
1420 {"function f(z) { var a = 0; var b = 0; if (a === 0.01) { " 1399 {"function f(z) { var a = 0; var b = 0; if (a === 0.01) { "
1421 #define X "b = a; a = b; " 1400 #define X "b = a; a = b; "
1422 X X X X X X X X X X X X X X X X X X X X X X X X 1401 X X X X X X X X X X X X X X X X X X X X X X X X
1423 #undef X 1402 #undef X
1424 " return 200; } else { return -200; } } f(0.001)", 1403 " return 200; } else { return -200; } } f(0.001)",
1425 3 * kPointerSize, 1404 2 * kPointerSize,
1426 2, 1405 2,
1427 218, 1406 214,
1428 {B(LdaZero), // 1407 {
1429 B(Star), R(0), // 1408 #define X B(Ldar), R(0), B(Star), R(1), B(Ldar), R(1), B(Star), R(0)
1430 B(LdaZero), // 1409 B(LdaZero), //
1431 B(Star), R(1), // 1410 B(Star), R(0), //
1432 B(Ldar), R(0), // 1411 B(LdaZero), //
1433 B(Star), R(2), // 1412 B(Star), R(1), //
1434 B(LdaConstant), U8(0), // 1413 B(LdaConstant), U8(0), //
1435 B(TestEqualStrict), R(2), // 1414 B(TestEqualStrict), R(0), //
1436 B(JumpIfFalseConstant), U8(2), // 1415 B(JumpIfFalseConstant), U8(2), //
1437 #define X B(Ldar), R(0), B(Star), R(1), B(Ldar), R(1), B(Star), R(0), 1416 X, X, X, X, X, X, X, X, X, X, //
1438 X X X X X X X X X X X X X X X X X X X X X X X X 1417 X, X, X, X, X, X, X, X, X, X, //
1418 X, X, X, X, //
1419 B(LdaConstant), U8(1), //
1420 B(Return), //
1421 B(Jump), U8(5), //
1422 B(LdaConstant), U8(3), //
1423 B(Return), //
1424 B(LdaUndefined), //
1425 B(Return)}, //
1439 #undef X 1426 #undef X
1440 B(LdaConstant), U8(1), //
1441 B(Return), //
1442 B(Jump), U8(5), //
1443 B(LdaConstant), U8(3), //
1444 B(Return), //
1445 B(LdaUndefined), //
1446 B(Return)}, //
1447 4, 1427 4,
1448 {helper.factory()->NewHeapNumber(0.01), 1428 {helper.factory()->NewHeapNumber(0.01),
1449 helper.factory()->NewNumberFromInt(200), 1429 helper.factory()->NewNumberFromInt(200),
1450 helper.factory()->NewNumberFromInt(199), 1430 helper.factory()->NewNumberFromInt(199),
1451 helper.factory()->NewNumberFromInt(-200), 1431 helper.factory()->NewNumberFromInt(-200), unused, unused}},
1452 unused, unused}},
1453 {"function f(a, b) {\n" 1432 {"function f(a, b) {\n"
1454 " if (a == b) { return 1; }\n" 1433 " if (a == b) { return 1; }\n"
1455 " if (a === b) { return 1; }\n" 1434 " if (a === b) { return 1; }\n"
1456 " if (a < b) { return 1; }\n" 1435 " if (a < b) { return 1; }\n"
1457 " if (a > b) { return 1; }\n" 1436 " if (a > b) { return 1; }\n"
1458 " if (a <= b) { return 1; }\n" 1437 " if (a <= b) { return 1; }\n"
1459 " if (a >= b) { return 1; }\n" 1438 " if (a >= b) { return 1; }\n"
1460 " if (a in b) { return 1; }\n" 1439 " if (a in b) { return 1; }\n"
1461 " if (a instanceof b) { return 1; }\n" 1440 " if (a instanceof b) { return 1; }\n"
1462 " /* if (a != b) { return 1; } */" // TODO(oth) Ast visitor yields
1463 " /* if (a !== b) { return 1; } */" // UNARY NOT, rather than !=/!==.
1464 " return 0;\n" 1441 " return 0;\n"
1465 "} f(1, 1);", 1442 "} f(1, 1);",
1466 kPointerSize, 1443 0,
1467 3, 1444 3,
1468 106, 1445 74,
1469 { 1446 {
1470 #define IF_CONDITION_RETURN(condition) \ 1447 #define IF_CONDITION_RETURN(condition) \
1471 B(Ldar), R(helper.kLastParamIndex - 1), \ 1448 B(Ldar), A(2, 3), \
1472 B(Star), R(0), \ 1449 B(condition), A(1, 3), \
1473 B(Ldar), R(helper.kLastParamIndex), \ 1450 B(JumpIfFalse), U8(5), \
1474 B(condition), R(0), \ 1451 B(LdaSmi8), U8(1), \
1475 B(JumpIfFalse), U8(5), \ 1452 B(Return),
1476 B(LdaSmi8), U8(1), \
1477 B(Return),
1478 IF_CONDITION_RETURN(TestEqual) // 1453 IF_CONDITION_RETURN(TestEqual) //
1479 IF_CONDITION_RETURN(TestEqualStrict) // 1454 IF_CONDITION_RETURN(TestEqualStrict) //
1480 IF_CONDITION_RETURN(TestLessThan) // 1455 IF_CONDITION_RETURN(TestLessThan) //
1481 IF_CONDITION_RETURN(TestGreaterThan) // 1456 IF_CONDITION_RETURN(TestGreaterThan) //
1482 IF_CONDITION_RETURN(TestLessThanOrEqual) // 1457 IF_CONDITION_RETURN(TestLessThanOrEqual) //
1483 IF_CONDITION_RETURN(TestGreaterThanOrEqual) // 1458 IF_CONDITION_RETURN(TestGreaterThanOrEqual) //
1484 IF_CONDITION_RETURN(TestIn) // 1459 IF_CONDITION_RETURN(TestIn) //
1485 IF_CONDITION_RETURN(TestInstanceOf) // 1460 IF_CONDITION_RETURN(TestInstanceOf) //
1461 B(LdaZero), //
1462 B(Return)}, //
1486 #undef IF_CONDITION_RETURN 1463 #undef IF_CONDITION_RETURN
1487 B(LdaZero), //
1488 B(Return)}, //
1489 0, 1464 0,
1490 {unused, unused, unused, unused, unused, unused}}, 1465 {unused, unused, unused, unused, unused, unused}},
1491 }; 1466 };
1492 1467
1493 for (size_t i = 0; i < arraysize(snippets); i++) { 1468 for (size_t i = 0; i < arraysize(snippets); i++) {
1494 Handle<BytecodeArray> bytecode_array = 1469 Handle<BytecodeArray> bytecode_array =
1495 helper.MakeBytecode(snippets[i].code_snippet, helper.kFunctionName); 1470 helper.MakeBytecode(snippets[i].code_snippet, helper.kFunctionName);
1496 CheckBytecodeArrayEqual(snippets[i], bytecode_array); 1471 CheckBytecodeArrayEqual(snippets[i], bytecode_array);
1497 } 1472 }
1498 } 1473 }
1499 1474
1500 1475
1501 TEST(DeclareGlobals) { 1476 TEST(DeclareGlobals) {
1502 InitializedHandleScope handle_scope; 1477 InitializedHandleScope handle_scope;
1503 BytecodeGeneratorHelper helper; 1478 BytecodeGeneratorHelper helper;
1504 1479
1505 ExpectedSnippet<InstanceType> snippets[] = { 1480 ExpectedSnippet<InstanceType> snippets[] = {
1506 {"var a = 1;", 1481 {"var a = 1;",
1507 5 * kPointerSize, 1482 5 * kPointerSize,
1508 1, 1483 1,
1509 45, 1484 45,
1510 { 1485 {
1511 B(Ldar), R(Register::function_closure().index()), // 1486 B(Ldar), R(Register::function_closure().index()), //
1512 B(Star), R(2), // 1487 B(Star), R(2), //
1513 B(LdaConstant), U8(0), // 1488 B(LdaConstant), U8(0), //
1514 B(Star), R(3), // 1489 B(Star), R(3), //
1515 B(CallRuntime), U16(Runtime::kNewScriptContext), R(2), U8(2), // 1490 B(CallRuntime), U16(Runtime::kNewScriptContext), R(2), U8(2), //
1516 B(PushContext), R(1), // 1491 B(PushContext), R(1), //
1517 B(LdaConstant), U8(1), // 1492 B(LdaConstant), U8(1), //
1518 B(Star), R(2), // 1493 B(Star), R(2), //
1519 B(LdaZero), // 1494 B(LdaZero), //
1520 B(Star), R(3), // 1495 B(Star), R(3), //
1521 B(CallRuntime), U16(Runtime::kDeclareGlobals), R(2), U8(2), // 1496 B(CallRuntime), U16(Runtime::kDeclareGlobals), R(2), U8(2), //
1522 B(LdaConstant), U8(2), // 1497 B(LdaConstant), U8(2), //
1523 B(Star), R(2), // 1498 B(Star), R(2), //
1524 B(LdaZero), // 1499 B(LdaZero), //
1525 B(Star), R(3), // 1500 B(Star), R(3), //
1526 B(LdaSmi8), U8(1), // 1501 B(LdaSmi8), U8(1), //
1527 B(Star), R(4), // 1502 B(Star), R(4), //
1528 B(CallRuntime), U16(Runtime::kInitializeVarGlobal), R(2), // 1503 B(CallRuntime), U16(Runtime::kInitializeVarGlobal), R(2), U8(3), //
1529 U8(3), // 1504 B(LdaUndefined), //
1530 B(LdaUndefined), // 1505 B(Return), //
1531 B(Return) //
1532 }, 1506 },
1533 3, 1507 3,
1534 {InstanceType::FIXED_ARRAY_TYPE, 1508 {InstanceType::FIXED_ARRAY_TYPE, InstanceType::FIXED_ARRAY_TYPE,
1535 InstanceType::FIXED_ARRAY_TYPE,
1536 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}}, 1509 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}},
1537 {"function f() {}", 1510 {"function f() {}",
1538 3 * kPointerSize, 1511 3 * kPointerSize,
1539 1, 1512 1,
1540 29, 1513 29,
1541 { 1514 {
1542 B(Ldar), R(Register::function_closure().index()), // 1515 B(Ldar), R(Register::function_closure().index()), //
1543 B(Star), R(1), // 1516 B(Star), R(1), //
1544 B(LdaConstant), U8(0), // 1517 B(LdaConstant), U8(0), //
1545 B(Star), R(2), // 1518 B(Star), R(2), //
(...skipping 25 matching lines...) Expand all
1571 B(LdaZero), // 1544 B(LdaZero), //
1572 B(Star), R(3), // 1545 B(Star), R(3), //
1573 B(CallRuntime), U16(Runtime::kDeclareGlobals), R(2), U8(2), // 1546 B(CallRuntime), U16(Runtime::kDeclareGlobals), R(2), U8(2), //
1574 B(LdaConstant), U8(2), // 1547 B(LdaConstant), U8(2), //
1575 B(Star), R(2), // 1548 B(Star), R(2), //
1576 B(LdaZero), // 1549 B(LdaZero), //
1577 B(Star), R(3), // 1550 B(Star), R(3), //
1578 B(LdaSmi8), U8(1), // 1551 B(LdaSmi8), U8(1), //
1579 B(Star), R(4), // 1552 B(Star), R(4), //
1580 B(CallRuntime), U16(Runtime::kInitializeVarGlobal), R(2), // 1553 B(CallRuntime), U16(Runtime::kInitializeVarGlobal), R(2), //
1581 U8(3), // 1554 U8(3), //
1582 B(LdaSmi8), U8(2), // 1555 B(LdaSmi8), U8(2), //
1583 B(StaGlobalSloppy), _, // 1556 B(StaGlobalSloppy), _, //
1584 B(Star), R(0), // 1557 B(Star), R(0), //
1585 B(Ldar), R(0), // 1558 B(Ldar), R(0), //
1586 B(Return) // 1559 B(Return) //
1587 }, 1560 },
1588 3, 1561 3,
1589 {InstanceType::FIXED_ARRAY_TYPE, 1562 {InstanceType::FIXED_ARRAY_TYPE, InstanceType::FIXED_ARRAY_TYPE,
1590 InstanceType::FIXED_ARRAY_TYPE,
1591 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}}, 1563 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}},
1592 {"function f() {}\nf();", 1564 {"function f() {}\nf();",
1593 4 * kPointerSize, 1565 4 * kPointerSize,
1594 1, 1566 1,
1595 43, 1567 43,
1596 { 1568 {
1597 B(Ldar), R(Register::function_closure().index()), // 1569 B(Ldar), R(Register::function_closure().index()), //
1598 B(Star), R(2), // 1570 B(Star), R(2), //
1599 B(LdaConstant), U8(0), // 1571 B(LdaConstant), U8(0), //
1600 B(Star), R(3), // 1572 B(Star), R(3), //
(...skipping 26 matching lines...) Expand all
1627 1599
1628 1600
1629 TEST(BasicLoops) { 1601 TEST(BasicLoops) {
1630 InitializedHandleScope handle_scope; 1602 InitializedHandleScope handle_scope;
1631 BytecodeGeneratorHelper helper; 1603 BytecodeGeneratorHelper helper;
1632 1604
1633 ExpectedSnippet<int> snippets[] = { 1605 ExpectedSnippet<int> snippets[] = {
1634 {"var x = 0;" 1606 {"var x = 0;"
1635 "var y = 1;" 1607 "var y = 1;"
1636 "while (x < 10) {" 1608 "while (x < 10) {"
1637 " y = y * 10;" 1609 " y = y * 12;"
1638 " x = x + 1;" 1610 " x = x + 1;"
1639 "}" 1611 "}"
1640 "return y;", 1612 "return y;",
1641 3 * kPointerSize, 1613 2 * kPointerSize,
1642 1, 1614 1,
1643 42, 1615 30,
1644 { 1616 {
1645 B(LdaZero), // 1617 B(LdaZero), //
1646 B(Star), R(0), // 1618 B(Star), R(0), //
1647 B(LdaSmi8), U8(1), // 1619 B(LdaSmi8), U8(1), //
1648 B(Star), R(1), // 1620 B(Star), R(1), //
1649 B(Jump), U8(22), // 1621 B(Jump), U8(14), //
1650 B(Ldar), R(1), // 1622 B(LdaSmi8), U8(12), //
1651 B(Star), R(2), // 1623 B(Mul), R(1), //
1624 B(Star), R(1), //
1625 B(LdaSmi8), U8(1), //
1626 B(Add), R(0), //
1627 B(Star), R(0), //
1652 B(LdaSmi8), U8(10), // 1628 B(LdaSmi8), U8(10), //
1653 B(Mul), R(2), // 1629 B(TestLessThan), R(0), //
1654 B(Star), R(1), // 1630 B(JumpIfTrue), U8(-16), //
1655 B(Ldar), R(0), //
1656 B(Star), R(2), //
1657 B(LdaSmi8), U8(1), //
1658 B(Add), R(2), //
1659 B(Star), R(0), //
1660 B(Ldar), R(0), //
1661 B(Star), R(2), //
1662 B(LdaSmi8), U8(10), //
1663 B(TestLessThan), R(2), //
1664 B(JumpIfTrue), U8(-28), //
1665 B(Ldar), R(1), // 1631 B(Ldar), R(1), //
1666 B(Return), // 1632 B(Return), //
1667 }, 1633 },
1668 0}, 1634 0},
1669 {"var i = 0;" 1635 {"var i = 0;"
1670 "while(true) {" 1636 "while(true) {"
1671 " if (i < 0) continue;" 1637 " if (i < 0) continue;"
1672 " if (i == 3) break;" 1638 " if (i == 3) break;"
1673 " if (i == 4) break;" 1639 " if (i == 4) break;"
1674 " if (i == 10) continue;" 1640 " if (i == 10) continue;"
1675 " if (i == 5) break;" 1641 " if (i == 5) break;"
1676 " i = i + 1;" 1642 " i = i + 1;"
1677 "}" 1643 "}"
1678 "return i;", 1644 "return i;",
1679 2 * kPointerSize, 1645 1 * kPointerSize,
1680 1, 1646 1,
1681 80, 1647 56,
1682 { 1648 {
1683 B(LdaZero), // 1649 B(LdaZero), //
1684 B(Star), R(0), // 1650 B(Star), R(0), //
1685 B(Jump), U8(71), // 1651 B(Jump), U8(47), //
1686 B(Ldar), R(0), //
1687 B(Star), R(1), //
1688 B(LdaZero), // 1652 B(LdaZero), //
1689 B(TestLessThan), R(1), // 1653 B(TestLessThan), R(0), //
1690 B(JumpIfFalse), U8(4), // 1654 B(JumpIfFalse), U8(4), //
1691 B(Jump), U8(60), // 1655 B(Jump), U8(40), //
1692 B(Ldar), R(0), //
1693 B(Star), R(1), //
1694 B(LdaSmi8), U8(3), // 1656 B(LdaSmi8), U8(3), //
1695 B(TestEqual), R(1), // 1657 B(TestEqual), R(0), //
1696 B(JumpIfFalse), U8(4), // 1658 B(JumpIfFalse), U8(4), //
1697 B(Jump), U8(51), // 1659 B(Jump), U8(35), //
1698 B(Ldar), R(0), //
1699 B(Star), R(1), //
1700 B(LdaSmi8), U8(4), // 1660 B(LdaSmi8), U8(4), //
1701 B(TestEqual), R(1), // 1661 B(TestEqual), R(0), //
1702 B(JumpIfFalse), U8(4), // 1662 B(JumpIfFalse), U8(4), //
1703 B(Jump), U8(39), // 1663 B(Jump), U8(27), //
1704 B(Ldar), R(0), //
1705 B(Star), R(1), //
1706 B(LdaSmi8), U8(10), // 1664 B(LdaSmi8), U8(10), //
1707 B(TestEqual), R(1), // 1665 B(TestEqual), R(0), //
1708 B(JumpIfFalse), U8(4), // 1666 B(JumpIfFalse), U8(4), //
1709 B(Jump), U8(24), // 1667 B(Jump), U8(16), //
1710 B(Ldar), R(0), //
1711 B(Star), R(1), //
1712 B(LdaSmi8), U8(5), // 1668 B(LdaSmi8), U8(5), //
1713 B(TestEqual), R(1), // 1669 B(TestEqual), R(0), //
1714 B(JumpIfFalse), U8(4), // 1670 B(JumpIfFalse), U8(4), //
1715 B(Jump), U8(15), // 1671 B(Jump), U8(11), //
1716 B(Ldar), R(0), //
1717 B(Star), R(1), //
1718 B(LdaSmi8), U8(1), // 1672 B(LdaSmi8), U8(1), //
1719 B(Add), R(1), // 1673 B(Add), R(0), //
1720 B(Star), R(0), // 1674 B(Star), R(0), //
1721 B(LdaTrue), // 1675 B(LdaTrue), //
1722 B(JumpIfTrue), U8(-70), // 1676 B(JumpIfTrue), U8(-46), //
1723 B(Ldar), R(0), // 1677 B(Ldar), R(0), //
1724 B(Return) // 1678 B(Return), //
1725 }, 1679 },
1726 0}, 1680 0},
1727 {"var x = 0; var y = 1;" 1681 {"var x = 0; var y = 1;"
1728 "do {" 1682 "do {"
1729 " y = y * 10;" 1683 " y = y * 10;"
1730 " if (x == 5) break;" 1684 " if (x == 5) break;"
1731 " if (x == 6) continue;" 1685 " if (x == 6) continue;"
1732 " x = x + 1;" 1686 " x = x + 1;"
1733 "} while (x < 10);" 1687 "} while (x < 10);"
1734 "return y;", 1688 "return y;",
1735 3 * kPointerSize, 1689 2 * kPointerSize,
1736 1, 1690 1,
1737 64, 1691 44,
1738 { 1692 {
1739 B(LdaZero), // 1693 B(LdaZero), //
1740 B(Star), R(0), // 1694 B(Star), R(0), //
1741 B(LdaSmi8), U8(1), // 1695 B(LdaSmi8), U8(1), //
1742 B(Star), R(1), // 1696 B(Star), R(1), //
1697 B(LdaSmi8), U8(10), //
1698 B(Mul), R(1), //
1699 B(Star), R(1), //
1700 B(LdaSmi8), U8(5), //
1701 B(TestEqual), R(0), //
1702 B(JumpIfFalse), U8(4), //
1703 B(Jump), U8(22), //
1704 B(LdaSmi8), U8(6), //
1705 B(TestEqual), R(0), //
1706 B(JumpIfFalse), U8(4), //
1707 B(Jump), U8(8), //
1708 B(LdaSmi8), U8(1), //
1709 B(Add), R(0), //
1710 B(Star), R(0), //
1711 B(LdaSmi8), U8(10), //
1712 B(TestLessThan), R(0), //
1713 B(JumpIfTrue), U8(-32), //
1743 B(Ldar), R(1), // 1714 B(Ldar), R(1), //
1744 B(Star), R(2), // 1715 B(Return), //
1745 B(LdaSmi8), U8(10), //
1746 B(Mul), R(2), //
1747 B(Star), R(1), //
1748 B(Ldar), R(0), //
1749 B(Star), R(2), //
1750 B(LdaSmi8), U8(5), //
1751 B(TestEqual), R(2), //
1752 B(JumpIfFalse), U8(4), //
1753 B(Jump), U8(34), //
1754 B(Ldar), R(0), //
1755 B(Star), R(2), //
1756 B(LdaSmi8), U8(6), //
1757 B(TestEqual), R(2), //
1758 B(JumpIfFalse), U8(4), //
1759 B(Jump), U8(12), //
1760 B(Ldar), R(0), //
1761 B(Star), R(2), //
1762 B(LdaSmi8), U8(1), //
1763 B(Add), R(2), //
1764 B(Star), R(0), //
1765 B(Ldar), R(0), //
1766 B(Star), R(2), //
1767 B(LdaSmi8), U8(10), //
1768 B(TestLessThan), R(2), //
1769 B(JumpIfTrue), U8(-52), //
1770 B(Ldar), R(1), //
1771 B(Return) //
1772 }, 1716 },
1773 0}, 1717 0},
1774 {"var x = 0; " 1718 {"var x = 0; "
1775 "for(;;) {" 1719 "for(;;) {"
1776 " if (x == 1) break;" 1720 " if (x == 1) break;"
1777 " x = x + 1;" 1721 " x = x + 1;"
1778 "}", 1722 "}",
1779 2 * kPointerSize, 1723 1 * kPointerSize,
1780 1, 1724 1,
1781 29, 1725 21,
1782 { 1726 {
1783 B(LdaZero), // 1727 B(LdaZero), //
1784 B(Star), R(0), // 1728 B(Star), R(0), //
1785 B(Ldar), R(0), //
1786 B(Star), R(1), //
1787 B(LdaSmi8), U8(1), // 1729 B(LdaSmi8), U8(1), //
1788 B(TestEqual), R(1), // 1730 B(TestEqual), R(0), //
1789 B(JumpIfFalse), U8(4), // 1731 B(JumpIfFalse), U8(4), //
1790 B(Jump), U8(14), // 1732 B(Jump), U8(10), //
1791 B(Ldar), R(0), //
1792 B(Star), R(1), //
1793 B(LdaSmi8), U8(1), // 1733 B(LdaSmi8), U8(1), //
1794 B(Add), R(1), // 1734 B(Add), R(0), //
1795 B(Star), R(0), // 1735 B(Star), R(0), //
1796 B(Jump), U8(-22), // 1736 B(Jump), U8(-14), //
1797 B(LdaUndefined), // 1737 B(LdaUndefined), //
1798 B(Return), // 1738 B(Return), //
1799 }, 1739 },
1800 0}, 1740 0},
1801 {"var u = 0;" 1741 {"var u = 0;"
1802 "for(var i = 0; i < 100; i = i + 1) {" 1742 "for(var i = 0; i < 100; i = i + 1) {"
1803 " u = u + 1;" 1743 " u = u + 1;"
1804 " continue;" 1744 " continue;"
1805 "}", 1745 "}",
1806 3 * kPointerSize, 1746 2 * kPointerSize,
1807 1, 1747 1,
1808 42, 1748 30,
1809 { 1749 {
1810 B(LdaZero), // 1750 B(LdaZero), //
1811 B(Star), R(0), // 1751 B(Star), R(0), //
1812 B(LdaZero), // 1752 B(LdaZero), //
1813 B(Star), R(1), // 1753 B(Star), R(1), //
1814 B(Jump), U8(24), // 1754 B(Jump), U8(16), //
1815 B(Ldar), R(0), //
1816 B(Star), R(2), //
1817 B(LdaSmi8), U8(1), // 1755 B(LdaSmi8), U8(1), //
1818 B(Add), R(2), // 1756 B(Add), R(0), //
1819 B(Star), R(0), // 1757 B(Star), R(0), //
1820 B(Jump), U8(2), // 1758 B(Jump), U8(2), //
1821 B(Ldar), R(1), //
1822 B(Star), R(2), //
1823 B(LdaSmi8), U8(1), // 1759 B(LdaSmi8), U8(1), //
1824 B(Add), R(2), // 1760 B(Add), R(1), //
1825 B(Star), R(1), // 1761 B(Star), R(1), //
1826 B(Ldar), R(1), //
1827 B(Star), R(2), //
1828 B(LdaSmi8), U8(100), // 1762 B(LdaSmi8), U8(100), //
1829 B(TestLessThan), R(2), // 1763 B(TestLessThan), R(1), //
1830 B(JumpIfTrue), U8(-30), // 1764 B(JumpIfTrue), U8(-18), //
1831 B(LdaUndefined), // 1765 B(LdaUndefined), //
1832 B(Return), // 1766 B(Return), //
1833 }, 1767 },
1834 0}, 1768 0},
1835 {"var i = 0;" 1769 {"var i = 0;"
1836 "while(true) {" 1770 "while(true) {"
1837 " while (i < 3) {" 1771 " while (i < 3) {"
1838 " if (i == 2) break;" 1772 " if (i == 2) break;"
1839 " i = i + 1;" 1773 " i = i + 1;"
1840 " }" 1774 " }"
1841 " i = i + 1;" 1775 " i = i + 1;"
1842 " break;" 1776 " break;"
1843 "}" 1777 "}"
1844 "return i;", 1778 "return i;",
1845 2 * kPointerSize, 1779 1 * kPointerSize,
1846 1, 1780 1,
1847 57, 1781 41,
1848 { 1782 {
1849 B(LdaZero), // 1783 B(LdaZero), //
1850 B(Star), R(0), // 1784 B(Star), R(0), //
1851 B(Jump), U8(48), // 1785 B(Jump), U8(32), //
1852 B(Jump), U8(24), // 1786 B(Jump), U8(16), //
1853 B(Ldar), R(0), //
1854 B(Star), R(1), //
1855 B(LdaSmi8), U8(2), // 1787 B(LdaSmi8), U8(2), //
1856 B(TestEqual), R(1), // 1788 B(TestEqual), R(0), //
1857 B(JumpIfFalse), U8(4), // 1789 B(JumpIfFalse), U8(4), //
1858 B(Jump), U8(22), // 1790 B(Jump), U8(14), //
1859 B(Ldar), R(0), //
1860 B(Star), R(1), //
1861 B(LdaSmi8), U8(1), // 1791 B(LdaSmi8), U8(1), //
1862 B(Add), R(1), // 1792 B(Add), R(0), //
1863 B(Star), R(0), // 1793 B(Star), R(0), //
1864 B(Ldar), R(0), //
1865 B(Star), R(1), //
1866 B(LdaSmi8), U8(3), // 1794 B(LdaSmi8), U8(3), //
1867 B(TestLessThan), R(1), // 1795 B(TestLessThan), R(0), //
1868 B(JumpIfTrue), U8(-30), // 1796 B(JumpIfTrue), U8(-18), //
1869 B(Ldar), R(0), //
1870 B(Star), R(1), //
1871 B(LdaSmi8), U8(1), // 1797 B(LdaSmi8), U8(1), //
1872 B(Add), R(1), // 1798 B(Add), R(0), //
1873 B(Star), R(0), // 1799 B(Star), R(0), //
1874 B(Jump), U8(5), // 1800 B(Jump), U8(5), //
1875 B(LdaTrue), // 1801 B(LdaTrue), //
1876 B(JumpIfTrue), U8(-47), // 1802 B(JumpIfTrue), U8(-31), //
1877 B(Ldar), R(0), // 1803 B(Ldar), R(0), //
1878 B(Return), // 1804 B(Return), //
1879 }, 1805 },
1880 0}, 1806 0},
1881 }; 1807 };
1882 1808
1883 for (size_t i = 0; i < arraysize(snippets); i++) { 1809 for (size_t i = 0; i < arraysize(snippets); i++) {
1884 Handle<BytecodeArray> bytecode_array = 1810 Handle<BytecodeArray> bytecode_array =
1885 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); 1811 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet);
1886 CheckBytecodeArrayEqual(snippets[i], bytecode_array); 1812 CheckBytecodeArrayEqual(snippets[i], bytecode_array);
1887 } 1813 }
1888 } 1814 }
1889 1815
1890 1816
1891 TEST(UnaryOperators) { 1817 TEST(UnaryOperators) {
1892 InitializedHandleScope handle_scope; 1818 InitializedHandleScope handle_scope;
1893 BytecodeGeneratorHelper helper; 1819 BytecodeGeneratorHelper helper;
1894 1820
1895 ExpectedSnippet<int> snippets[] = { 1821 ExpectedSnippet<int> snippets[] = {
1896 {"var x = 0;" 1822 {"var x = 0;"
1897 "while (x != 10) {" 1823 "while (x != 10) {"
1898 " x = x + 10;" 1824 " x = x + 10;"
1899 "}" 1825 "}"
1900 "return x;", 1826 "return x;",
1901 2 * kPointerSize, 1827 kPointerSize,
1902 1, 1828 1,
1903 29, 1829 21,
1904 { 1830 {
1905 B(LdaZero), // 1831 B(LdaZero), //
1906 B(Star), R(0), // 1832 B(Star), R(0), //
1907 B(Jump), U8(12), // 1833 B(Jump), U8(8), //
1908 B(Ldar), R(0), //
1909 B(Star), R(1), //
1910 B(LdaSmi8), U8(10), // 1834 B(LdaSmi8), U8(10), //
1911 B(Add), R(1), // 1835 B(Add), R(0), //
1912 B(Star), R(0), // 1836 B(Star), R(0), //
1913 B(Ldar), R(0), //
1914 B(Star), R(1), //
1915 B(LdaSmi8), U8(10), // 1837 B(LdaSmi8), U8(10), //
1916 B(TestEqual), R(1), // 1838 B(TestEqual), R(0), //
1917 B(LogicalNot), // 1839 B(LogicalNot), //
1918 B(JumpIfTrue), U8(-19), // 1840 B(JumpIfTrue), U8(-11), //
1919 B(Ldar), R(0), // 1841 B(Ldar), R(0), //
1920 B(Return), // 1842 B(Return), //
1921 }, 1843 },
1922 0}, 1844 0},
1923 {"var x = false;" 1845 {"var x = false;"
1924 "do {" 1846 "do {"
1925 " x = !x;" 1847 " x = !x;"
1926 "} while(x == false);" 1848 "} while(x == false);"
1927 "return x;", 1849 "return x;",
1928 2 * kPointerSize, 1850 kPointerSize,
1929 1, 1851 1,
1930 20, 1852 16,
1931 { 1853 {
1932 B(LdaFalse), // 1854 B(LdaFalse), //
1933 B(Star), R(0), // 1855 B(Star), R(0), //
1934 B(Ldar), R(0), // 1856 B(Ldar), R(0), //
1935 B(LogicalNot), // 1857 B(LogicalNot), //
1936 B(Star), R(0), // 1858 B(Star), R(0), //
1937 B(Ldar), R(0), // 1859 B(LdaFalse), //
1938 B(Star), R(1), // 1860 B(TestEqual), R(0), //
1939 B(LdaFalse), // 1861 B(JumpIfTrue), U8(-8), //
1940 B(TestEqual), R(1), // 1862 B(Ldar), R(0), //
1941 B(JumpIfTrue), U8(-12), // 1863 B(Return), //
1942 B(Ldar), R(0), //
1943 B(Return), //
1944 }, 1864 },
1945 0}, 1865 0},
1946 {"var x = 101;" 1866 {"var x = 101;"
1947 "return void(x * 3);", 1867 "return void(x * 3);",
1948 2 * kPointerSize, 1868 kPointerSize,
1949 1, 1869 1,
1950 14, 1870 10,
1951 { 1871 {
1952 B(LdaSmi8), U8(101), // 1872 B(LdaSmi8), U8(101), //
1953 B(Star), R(0), // 1873 B(Star), R(0), //
1954 B(Ldar), R(0), //
1955 B(Star), R(1), //
1956 B(LdaSmi8), U8(3), // 1874 B(LdaSmi8), U8(3), //
1957 B(Mul), R(1), // 1875 B(Mul), R(0), //
1958 B(LdaUndefined), // 1876 B(LdaUndefined), //
1959 B(Return), // 1877 B(Return), //
1960 }, 1878 },
1961 0}, 1879 0},
1962 {"var x = 1234;" 1880 {"var x = 1234;"
1963 "var y = void (x * x - 1);" 1881 "var y = void (x * x - 1);"
1964 "return y;", 1882 "return y;",
1965 4 * kPointerSize, 1883 3 * kPointerSize,
1966 1, 1884 1,
1967 24, 1885 20,
1968 { 1886 {
1969 B(LdaConstant), U8(0), // 1887 B(LdaConstant), U8(0), //
1970 B(Star), R(0), // 1888 B(Star), R(0), //
1971 B(Ldar), R(0), // 1889 B(Ldar), R(0), //
1972 B(Star), R(3), // 1890 B(Mul), R(0), //
1973 B(Ldar), R(0), //
1974 B(Mul), R(3), //
1975 B(Star), R(2), // 1891 B(Star), R(2), //
1976 B(LdaSmi8), U8(1), // 1892 B(LdaSmi8), U8(1), //
1977 B(Sub), R(2), // 1893 B(Sub), R(2), //
1978 B(LdaUndefined), // 1894 B(LdaUndefined), //
1979 B(Star), R(1), // 1895 B(Star), R(1), //
1980 B(Ldar), R(1), // 1896 B(Ldar), R(1), //
1981 B(Return), // 1897 B(Return), //
1982 }, 1898 },
1983 1, 1899 1,
1984 {1234}}, 1900 {1234}},
1985 {"var x = 13;" 1901 {"var x = 13;"
1986 "return typeof(x);", 1902 "return typeof(x);",
1987 1 * kPointerSize, 1903 kPointerSize,
1988 1, 1904 1,
1989 8, 1905 8,
1990 { 1906 {
1991 B(LdaSmi8), U8(13), // 1907 B(LdaSmi8), U8(13), //
1992 B(Star), R(0), // 1908 B(Star), R(0), // TODO(oth): Ldar R(X) following Star R(X)
1993 B(Ldar), R(0), // 1909 B(Ldar), R(0), // could be culled in bytecode array builder.
1994 B(TypeOf), // 1910 B(TypeOf), //
1995 B(Return), // 1911 B(Return), //
1996 }, 1912 },
1997 0}, 1913 0},
1998 }; 1914 };
1999 1915
2000 for (size_t i = 0; i < arraysize(snippets); i++) { 1916 for (size_t i = 0; i < arraysize(snippets); i++) {
2001 Handle<BytecodeArray> bytecode_array = 1917 Handle<BytecodeArray> bytecode_array =
2002 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); 1918 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet);
2003 CheckBytecodeArrayEqual(snippets[i], bytecode_array); 1919 CheckBytecodeArrayEqual(snippets[i], bytecode_array);
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
2154 1, 2070 1,
2155 6, 2071 6,
2156 { 2072 {
2157 B(LdaConstant), U8(0), // 2073 B(LdaConstant), U8(0), //
2158 B(CreateArrayLiteral), U8(0), U8(simple_flags), // 2074 B(CreateArrayLiteral), U8(0), U8(simple_flags), //
2159 B(Return) // 2075 B(Return) //
2160 }, 2076 },
2161 1, 2077 1,
2162 {InstanceType::FIXED_ARRAY_TYPE}}, 2078 {InstanceType::FIXED_ARRAY_TYPE}},
2163 {"var a = 1; return [ a, a + 1 ];", 2079 {"var a = 1; return [ a, a + 1 ];",
2164 4 * kPointerSize, 2080 3 * kPointerSize,
2165 1, 2081 1,
2166 39, 2082 35,
2167 { 2083 {
2168 B(LdaSmi8), U8(1), // 2084 B(LdaSmi8), U8(1), //
2169 B(Star), R(0), // 2085 B(Star), R(0), //
2170 B(LdaConstant), U8(0), // 2086 B(LdaConstant), U8(0), //
2171 B(CreateArrayLiteral), U8(0), U8(3), // 2087 B(CreateArrayLiteral), U8(0), U8(3), //
2172 B(Star), R(2), // 2088 B(Star), R(2), //
2173 B(LdaZero), // 2089 B(LdaZero), //
2174 B(Star), R(1), // 2090 B(Star), R(1), //
2175 B(Ldar), R(0), // 2091 B(Ldar), R(0), //
2176 B(KeyedStoreICSloppy), R(2), R(1), U8(vector->GetIndex(slot1)), // 2092 B(KeyedStoreICSloppy), R(2), R(1), U8(vector->GetIndex(slot1)), //
2177 B(LdaSmi8), U8(1), // 2093 B(LdaSmi8), U8(1), //
2178 B(Star), R(1), // 2094 B(Star), R(1), //
2179 B(Ldar), R(0), //
2180 B(Star), R(3), //
2181 B(LdaSmi8), U8(1), // 2095 B(LdaSmi8), U8(1), //
2182 B(Add), R(3), // 2096 B(Add), R(0), //
2183 B(KeyedStoreICSloppy), R(2), R(1), U8(vector->GetIndex(slot1)), // 2097 B(KeyedStoreICSloppy), R(2), R(1), U8(vector->GetIndex(slot1)), //
2184 B(Ldar), R(2), // 2098 B(Ldar), R(2), //
2185 B(Return) // 2099 B(Return), //
2186 }, 2100 },
2187 1, 2101 1,
2188 {InstanceType::FIXED_ARRAY_TYPE}}, 2102 {InstanceType::FIXED_ARRAY_TYPE}},
2189 {"return [ [ 1, 2 ], [ 3 ] ];", 2103 {"return [ [ 1, 2 ], [ 3 ] ];",
2190 0, 2104 0,
2191 1, 2105 1,
2192 6, 2106 6,
2193 { 2107 {
2194 B(LdaConstant), U8(0), // 2108 B(LdaConstant), U8(0), //
2195 B(CreateArrayLiteral), U8(2), U8(deep_elements_flags), // 2109 B(CreateArrayLiteral), U8(2), U8(deep_elements_flags), //
2196 B(Return) // 2110 B(Return) //
2197 }, 2111 },
2198 1, 2112 1,
2199 {InstanceType::FIXED_ARRAY_TYPE}}, 2113 {InstanceType::FIXED_ARRAY_TYPE}},
2200 {"var a = 1; return [ [ a, 2 ], [ a + 2 ] ];", 2114 {"var a = 1; return [ [ a, 2 ], [ a + 2 ] ];",
2201 6 * kPointerSize, 2115 5 * kPointerSize,
2202 1, 2116 1,
2203 71, 2117 67,
2204 { 2118 {
2205 B(LdaSmi8), U8(1), // 2119 B(LdaSmi8), U8(1), //
2206 B(Star), R(0), // 2120 B(Star), R(0), //
2207 B(LdaConstant), U8(0), // 2121 B(LdaConstant), U8(0), //
2208 B(CreateArrayLiteral), U8(2), U8(deep_elements_flags), // 2122 B(CreateArrayLiteral), U8(2), U8(deep_elements_flags), //
2209 B(Star), R(2), // 2123 B(Star), R(2), //
2210 B(LdaZero), // 2124 B(LdaZero), //
2211 B(Star), R(1), // 2125 B(Star), R(1), //
2212 B(LdaConstant), U8(1), // 2126 B(LdaConstant), U8(1), //
2213 B(CreateArrayLiteral), U8(0), U8(simple_flags), // 2127 B(CreateArrayLiteral), U8(0), U8(simple_flags), //
2214 B(Star), R(4), // 2128 B(Star), R(4), //
2215 B(LdaZero), // 2129 B(LdaZero), //
2216 B(Star), R(3), // 2130 B(Star), R(3), //
2217 B(Ldar), R(0), // 2131 B(Ldar), R(0), //
2218 B(KeyedStoreICSloppy), R(4), R(3), U8(vector->GetIndex(slot1)), // 2132 B(KeyedStoreICSloppy), R(4), R(3), U8(vector->GetIndex(slot1)), //
2219 B(Ldar), R(4), // 2133 B(Ldar), R(4), //
2220 B(KeyedStoreICSloppy), R(2), R(1), U8(vector->GetIndex(slot3)), // 2134 B(KeyedStoreICSloppy), R(2), R(1), U8(vector->GetIndex(slot3)), //
2221 B(LdaSmi8), U8(1), // 2135 B(LdaSmi8), U8(1), //
2222 B(Star), R(1), // 2136 B(Star), R(1), //
2223 B(LdaConstant), U8(2), // 2137 B(LdaConstant), U8(2), //
2224 B(CreateArrayLiteral), U8(1), U8(simple_flags), // 2138 B(CreateArrayLiteral), U8(1), U8(simple_flags), //
2225 B(Star), R(4), // 2139 B(Star), R(4), //
2226 B(LdaZero), // 2140 B(LdaZero), //
2227 B(Star), R(3), // 2141 B(Star), R(3), //
2228 B(Ldar), R(0), //
2229 B(Star), R(5), //
2230 B(LdaSmi8), U8(2), // 2142 B(LdaSmi8), U8(2), //
2231 B(Add), R(5), // 2143 B(Add), R(0), //
2232 B(KeyedStoreICSloppy), R(4), R(3), U8(vector->GetIndex(slot2)), // 2144 B(KeyedStoreICSloppy), R(4), R(3), U8(vector->GetIndex(slot2)), //
2233 B(Ldar), R(4), // 2145 B(Ldar), R(4), //
2234 B(KeyedStoreICSloppy), R(2), R(1), U8(vector->GetIndex(slot3)), // 2146 B(KeyedStoreICSloppy), R(2), R(1), U8(vector->GetIndex(slot3)), //
2235 B(Ldar), R(2), // 2147 B(Ldar), R(2), //
2236 B(Return), // 2148 B(Return), //
2237 }, 2149 },
2238 3, 2150 3,
2239 {InstanceType::FIXED_ARRAY_TYPE, InstanceType::FIXED_ARRAY_TYPE, 2151 {InstanceType::FIXED_ARRAY_TYPE, InstanceType::FIXED_ARRAY_TYPE,
2240 InstanceType::FIXED_ARRAY_TYPE}}, 2152 InstanceType::FIXED_ARRAY_TYPE}},
2241 }; 2153 };
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
2294 B(Star), R(2), // 2206 B(Star), R(2), //
2295 B(Ldar), R(0), // 2207 B(Ldar), R(0), //
2296 B(StoreICSloppy), R(1), R(2), U8(3), // 2208 B(StoreICSloppy), R(1), R(2), U8(3), //
2297 B(Ldar), R(1), // 2209 B(Ldar), R(1), //
2298 B(Return), // 2210 B(Return), //
2299 }, 2211 },
2300 2, 2212 2,
2301 {InstanceType::FIXED_ARRAY_TYPE, 2213 {InstanceType::FIXED_ARRAY_TYPE,
2302 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}}, 2214 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}},
2303 {"var a = 1; return { val: a, val: a + 1 };", 2215 {"var a = 1; return { val: a, val: a + 1 };",
2304 4 * kPointerSize, 2216 3 * kPointerSize,
2305 1, 2217 1,
2306 32, 2218 26,
2307 { 2219 {
2308 B(LdaSmi8), U8(1), // 2220 B(LdaSmi8), U8(1), //
2309 B(Star), R(0), // 2221 B(Star), R(0), //
2310 B(LdaConstant), U8(0), // 2222 B(LdaConstant), U8(0), //
2311 B(CreateObjectLiteral), U8(0), U8(deep_elements_flags), // 2223 B(CreateObjectLiteral), U8(0), U8(deep_elements_flags), //
2312 B(Star), R(1), // 2224 B(Star), R(1), //
2313 B(Ldar), R(0), //
2314 B(LdaConstant), U8(1), // 2225 B(LdaConstant), U8(1), //
2315 B(Star), R(2), // 2226 B(Star), R(2), //
2316 B(Ldar), R(0), //
2317 B(Star), R(3), //
2318 B(LdaSmi8), U8(1), // 2227 B(LdaSmi8), U8(1), //
2319 B(Add), R(3), // 2228 B(Add), R(0), //
2320 B(StoreICSloppy), R(1), R(2), U8(3), // 2229 B(StoreICSloppy), R(1), R(2), U8(3), //
2321 B(Ldar), R(1), // 2230 B(Ldar), R(1), //
2322 B(Return), // 2231 B(Return), //
2323 }, 2232 },
2324 2, 2233 2,
2325 {InstanceType::FIXED_ARRAY_TYPE, 2234 {InstanceType::FIXED_ARRAY_TYPE,
2326 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}}, 2235 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}},
2327 {"return { func: function() { } };", 2236 {"return { func: function() { } };",
2328 2 * kPointerSize, 2237 2 * kPointerSize,
2329 1, 2238 1,
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
2375 B(LdaConstant), U8(1), // 2284 B(LdaConstant), U8(1), //
2376 B(Star), R(1), // 2285 B(Star), R(1), //
2377 B(LdaConstant), U8(2), // 2286 B(LdaConstant), U8(2), //
2378 B(CreateClosure), U8(0), // 2287 B(CreateClosure), U8(0), //
2379 B(Star), R(2), // 2288 B(Star), R(2), //
2380 B(LdaNull), // 2289 B(LdaNull), //
2381 B(Star), R(3), // 2290 B(Star), R(3), //
2382 B(LdaZero), // 2291 B(LdaZero), //
2383 B(Star), R(4), // 2292 B(Star), R(4), //
2384 B(CallRuntime), U16(Runtime::kDefineAccessorPropertyUnchecked), // 2293 B(CallRuntime), U16(Runtime::kDefineAccessorPropertyUnchecked), //
2385 R(0), U8(5), // 2294 R(0), U8(5), //
2386 B(Ldar), R(0), // 2295 B(Ldar), R(0), //
2387 B(Return), // 2296 B(Return), //
2388 }, 2297 },
2389 3, 2298 3,
2390 {InstanceType::FIXED_ARRAY_TYPE, 2299 {InstanceType::FIXED_ARRAY_TYPE,
2391 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, 2300 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE,
2392 InstanceType::SHARED_FUNCTION_INFO_TYPE}}, 2301 InstanceType::SHARED_FUNCTION_INFO_TYPE}},
2393 {"return { get a() { return this.x; }, set a(val) { this.x = val } };", 2302 {"return { get a() { return this.x; }, set a(val) { this.x = val } };",
2394 5 * kPointerSize, 2303 5 * kPointerSize,
2395 1, 2304 1,
2396 34, 2305 34,
2397 { 2306 {
2398 B(LdaConstant), U8(0), // 2307 B(LdaConstant), U8(0), //
2399 B(CreateObjectLiteral), U8(0), U8(deep_elements_flags), // 2308 B(CreateObjectLiteral), U8(0), U8(deep_elements_flags), //
2400 B(Star), R(0), // 2309 B(Star), R(0), //
2401 B(LdaConstant), U8(1), // 2310 B(LdaConstant), U8(1), //
2402 B(Star), R(1), // 2311 B(Star), R(1), //
2403 B(LdaConstant), U8(2), // 2312 B(LdaConstant), U8(2), //
2404 B(CreateClosure), U8(0), // 2313 B(CreateClosure), U8(0), //
2405 B(Star), R(2), // 2314 B(Star), R(2), //
2406 B(LdaConstant), U8(3), // 2315 B(LdaConstant), U8(3), //
2407 B(CreateClosure), U8(0), // 2316 B(CreateClosure), U8(0), //
2408 B(Star), R(3), // 2317 B(Star), R(3), //
2409 B(LdaZero), // 2318 B(LdaZero), //
2410 B(Star), R(4), // 2319 B(Star), R(4), //
2411 B(CallRuntime), U16(Runtime::kDefineAccessorPropertyUnchecked), // 2320 B(CallRuntime), U16(Runtime::kDefineAccessorPropertyUnchecked), //
2412 R(0), U8(5), // 2321 R(0), U8(5), //
2413 B(Ldar), R(0), // 2322 B(Ldar), R(0), //
2414 B(Return), // 2323 B(Return), //
2415 }, 2324 },
2416 4, 2325 4,
2417 {InstanceType::FIXED_ARRAY_TYPE, 2326 {InstanceType::FIXED_ARRAY_TYPE,
2418 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, 2327 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE,
2419 InstanceType::SHARED_FUNCTION_INFO_TYPE, 2328 InstanceType::SHARED_FUNCTION_INFO_TYPE,
2420 InstanceType::SHARED_FUNCTION_INFO_TYPE}}, 2329 InstanceType::SHARED_FUNCTION_INFO_TYPE}},
2421 {"return { set b(val) { this.y = val } };", 2330 {"return { set b(val) { this.y = val } };",
2422 5 * kPointerSize, 2331 5 * kPointerSize,
2423 1, 2332 1,
2424 31, 2333 31,
2425 { 2334 {
2426 B(LdaConstant), U8(0), // 2335 B(LdaConstant), U8(0), //
2427 B(CreateObjectLiteral), U8(0), U8(deep_elements_flags), // 2336 B(CreateObjectLiteral), U8(0), U8(deep_elements_flags), //
2428 B(Star), R(0), // 2337 B(Star), R(0), //
2429 B(LdaConstant), U8(1), // 2338 B(LdaConstant), U8(1), //
2430 B(Star), R(1), // 2339 B(Star), R(1), //
2431 B(LdaNull), // 2340 B(LdaNull), //
2432 B(Star), R(2), // 2341 B(Star), R(2), //
2433 B(LdaConstant), U8(2), // 2342 B(LdaConstant), U8(2), //
2434 B(CreateClosure), U8(0), // 2343 B(CreateClosure), U8(0), //
2435 B(Star), R(3), // 2344 B(Star), R(3), //
2436 B(LdaZero), // 2345 B(LdaZero), //
2437 B(Star), R(4), // 2346 B(Star), R(4), //
2438 B(CallRuntime), U16(Runtime::kDefineAccessorPropertyUnchecked), // 2347 B(CallRuntime), U16(Runtime::kDefineAccessorPropertyUnchecked), //
2439 R(0), U8(5), // 2348 R(0), U8(5), //
2440 B(Ldar), R(0), // 2349 B(Ldar), R(0), //
2441 B(Return), // 2350 B(Return), //
2442 }, 2351 },
2443 3, 2352 3,
2444 {InstanceType::FIXED_ARRAY_TYPE, 2353 {InstanceType::FIXED_ARRAY_TYPE,
2445 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, 2354 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE,
2446 InstanceType::SHARED_FUNCTION_INFO_TYPE}}, 2355 InstanceType::SHARED_FUNCTION_INFO_TYPE}},
2447 {"var a = 1; return { 1: a };", 2356 {"var a = 1; return { 1: a };",
2448 5 * kPointerSize, 2357 5 * kPointerSize,
2449 1, 2358 1,
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
2492 B(CreateObjectLiteral), U8(0), U8(simple_flags), // 2401 B(CreateObjectLiteral), U8(0), U8(simple_flags), //
2493 B(Star), R(1), // 2402 B(Star), R(1), //
2494 B(Ldar), R(0), // 2403 B(Ldar), R(0), //
2495 B(ToName), // 2404 B(ToName), //
2496 B(Star), R(2), // 2405 B(Star), R(2), //
2497 B(LdaSmi8), U8(1), // 2406 B(LdaSmi8), U8(1), //
2498 B(Star), R(3), // 2407 B(Star), R(3), //
2499 B(LdaZero), // 2408 B(LdaZero), //
2500 B(Star), R(4), // 2409 B(Star), R(4), //
2501 B(CallRuntime), U16(Runtime::kDefineDataPropertyUnchecked), R(1), // 2410 B(CallRuntime), U16(Runtime::kDefineDataPropertyUnchecked), R(1), //
2502 U8(4), // 2411 U8(4), //
2503 B(Ldar), R(1), // 2412 B(Ldar), R(1), //
2504 B(Return), // 2413 B(Return), //
2505 }, 2414 },
2506 2, 2415 2,
2507 {InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, 2416 {InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE,
2508 InstanceType::FIXED_ARRAY_TYPE}}, 2417 InstanceType::FIXED_ARRAY_TYPE}},
2509 {"var a = 'test'; return { val: a, [a]: 1 }", 2418 {"var a = 'test'; return { val: a, [a]: 1 }",
2510 5 * kPointerSize, 2419 5 * kPointerSize,
2511 1, 2420 1,
2512 41, 2421 41,
2513 { 2422 {
2514 B(LdaConstant), U8(0), // 2423 B(LdaConstant), U8(0), //
2515 B(Star), R(0), // 2424 B(Star), R(0), //
2516 B(LdaConstant), U8(1), // 2425 B(LdaConstant), U8(1), //
2517 B(CreateObjectLiteral), U8(0), U8(deep_elements_flags), // 2426 B(CreateObjectLiteral), U8(0), U8(deep_elements_flags), //
2518 B(Star), R(1), // 2427 B(Star), R(1), //
2519 B(LdaConstant), U8(2), // 2428 B(LdaConstant), U8(2), //
2520 B(Star), R(2), // 2429 B(Star), R(2), //
2521 B(Ldar), R(0), // 2430 B(Ldar), R(0), //
2522 B(StoreICSloppy), R(1), R(2), U8(3), // 2431 B(StoreICSloppy), R(1), R(2), U8(3), //
2523 B(Ldar), R(0), // 2432 B(Ldar), R(0), //
2524 B(ToName), // 2433 B(ToName), //
2525 B(Star), R(2), // 2434 B(Star), R(2), //
2526 B(LdaSmi8), U8(1), // 2435 B(LdaSmi8), U8(1), //
2527 B(Star), R(3), // 2436 B(Star), R(3), //
2528 B(LdaZero), // 2437 B(LdaZero), //
2529 B(Star), R(4), // 2438 B(Star), R(4), //
2530 B(CallRuntime), U16(Runtime::kDefineDataPropertyUnchecked), R(1), // 2439 B(CallRuntime), U16(Runtime::kDefineDataPropertyUnchecked), R(1), //
2531 U8(4), // 2440 U8(4), //
2532 B(Ldar), R(1), // 2441 B(Ldar), R(1), //
2533 B(Return), // 2442 B(Return), //
2534 }, 2443 },
2535 3, 2444 3,
2536 {InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, 2445 {InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE,
2537 InstanceType::FIXED_ARRAY_TYPE, 2446 InstanceType::FIXED_ARRAY_TYPE,
2538 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}}, 2447 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}},
2539 {"var a = 'test'; return { [a]: 1, __proto__: {} }", 2448 {"var a = 'test'; return { [a]: 1, __proto__: {} }",
2540 5 * kPointerSize, 2449 5 * kPointerSize,
2541 1, 2450 1,
2542 43, 2451 43,
2543 { 2452 {
2544 B(LdaConstant), U8(0), // 2453 B(LdaConstant), U8(0), //
2545 B(Star), R(0), // 2454 B(Star), R(0), //
2546 B(LdaConstant), U8(1), // 2455 B(LdaConstant), U8(1), //
2547 B(CreateObjectLiteral), U8(1), U8(simple_flags), // 2456 B(CreateObjectLiteral), U8(1), U8(simple_flags), //
2548 B(Star), R(1), // 2457 B(Star), R(1), //
2549 B(Ldar), R(0), // 2458 B(Ldar), R(0), //
2550 B(ToName), // 2459 B(ToName), //
2551 B(Star), R(2), // 2460 B(Star), R(2), //
2552 B(LdaSmi8), U8(1), // 2461 B(LdaSmi8), U8(1), //
2553 B(Star), R(3), // 2462 B(Star), R(3), //
2554 B(LdaZero), // 2463 B(LdaZero), //
2555 B(Star), R(4), // 2464 B(Star), R(4), //
2556 B(CallRuntime), U16(Runtime::kDefineDataPropertyUnchecked), R(1), // 2465 B(CallRuntime), U16(Runtime::kDefineDataPropertyUnchecked), R(1), //
2557 U8(4), // 2466 U8(4), //
2558 B(LdaConstant), U8(1), // 2467 B(LdaConstant), U8(1), //
2559 B(CreateObjectLiteral), U8(0), U8(13), // 2468 B(CreateObjectLiteral), U8(0), U8(13), //
2560 B(Star), R(2), // 2469 B(Star), R(2), //
2561 B(CallRuntime), U16(Runtime::kInternalSetPrototype), R(1), U8(2), // 2470 B(CallRuntime), U16(Runtime::kInternalSetPrototype), R(1), U8(2), //
2562 B(Ldar), R(1), // 2471 B(Ldar), R(1), //
2563 B(Return), // 2472 B(Return), //
2564 }, 2473 },
2565 2, 2474 2,
2566 {InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, 2475 {InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE,
2567 InstanceType::FIXED_ARRAY_TYPE}}, 2476 InstanceType::FIXED_ARRAY_TYPE}},
2568 {"var n = 'name'; return { [n]: 'val', get a() { }, set a(b) {} };", 2477 {"var n = 'name'; return { [n]: 'val', get a() { }, set a(b) {} };",
2569 5 * kPointerSize, 2478 5 * kPointerSize,
2570 1, 2479 1,
2571 69, 2480 69,
2572 { 2481 {
2573 B(LdaConstant), U8(0), // 2482 B(LdaConstant), U8(0), //
2574 B(Star), R(0), // 2483 B(Star), R(0), //
2575 B(LdaConstant), U8(1), // 2484 B(LdaConstant), U8(1), //
2576 B(CreateObjectLiteral), U8(0), U8(simple_flags), // 2485 B(CreateObjectLiteral), U8(0), U8(simple_flags), //
2577 B(Star), R(1), // 2486 B(Star), R(1), //
2578 B(Ldar), R(0), // 2487 B(Ldar), R(0), //
2579 B(ToName), // 2488 B(ToName), //
2580 B(Star), R(2), // 2489 B(Star), R(2), //
2581 B(LdaConstant), U8(2), // 2490 B(LdaConstant), U8(2), //
2582 B(Star), R(3), // 2491 B(Star), R(3), //
2583 B(LdaZero), // 2492 B(LdaZero), //
2584 B(Star), R(4), // 2493 B(Star), R(4), //
2585 B(CallRuntime), U16(Runtime::kDefineDataPropertyUnchecked), R(1), // 2494 B(CallRuntime), U16(Runtime::kDefineDataPropertyUnchecked), R(1), //
2586 U8(4), // 2495 U8(4), //
2587 B(LdaConstant), U8(3), // 2496 B(LdaConstant), U8(3), //
2588 B(ToName), // 2497 B(ToName), //
2589 B(Star), R(2), // 2498 B(Star), R(2), //
2590 B(LdaConstant), U8(4), // 2499 B(LdaConstant), U8(4), //
2591 B(CreateClosure), U8(0), // 2500 B(CreateClosure), U8(0), //
2592 B(Star), R(3), // 2501 B(Star), R(3), //
2593 B(LdaZero), // 2502 B(LdaZero), //
2594 B(Star), R(4), // 2503 B(Star), R(4), //
2595 B(CallRuntime), U16(Runtime::kDefineGetterPropertyUnchecked), // 2504 B(CallRuntime), U16(Runtime::kDefineGetterPropertyUnchecked), //
2596 R(1), U8(4), // 2505 R(1), U8(4), //
2597 B(LdaConstant), U8(3), // 2506 B(LdaConstant), U8(3), //
2598 B(ToName), // 2507 B(ToName), //
2599 B(Star), R(2), // 2508 B(Star), R(2), //
2600 B(LdaConstant), U8(5), // 2509 B(LdaConstant), U8(5), //
2601 B(CreateClosure), U8(0), // 2510 B(CreateClosure), U8(0), //
2602 B(Star), R(3), // 2511 B(Star), R(3), //
2603 B(LdaZero), // 2512 B(LdaZero), //
2604 B(Star), R(4), // 2513 B(Star), R(4), //
2605 B(CallRuntime), U16(Runtime::kDefineSetterPropertyUnchecked), // 2514 B(CallRuntime), U16(Runtime::kDefineSetterPropertyUnchecked), //
2606 R(1), U8(4), // 2515 R(1), U8(4), //
2607 B(Ldar), R(1), // 2516 B(Ldar), R(1), //
2608 B(Return), // 2517 B(Return), //
2609 }, 2518 },
2610 6, 2519 6,
2611 {InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, 2520 {InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE,
2612 InstanceType::FIXED_ARRAY_TYPE, 2521 InstanceType::FIXED_ARRAY_TYPE,
2613 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, 2522 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE,
2614 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, 2523 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE,
2615 InstanceType::SHARED_FUNCTION_INFO_TYPE, 2524 InstanceType::SHARED_FUNCTION_INFO_TYPE,
2616 InstanceType::SHARED_FUNCTION_INFO_TYPE}}, 2525 InstanceType::SHARED_FUNCTION_INFO_TYPE}},
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
2658 B(LdaConstant), U8(4), // 2567 B(LdaConstant), U8(4), //
2659 B(Star), R(6), // 2568 B(Star), R(6), //
2660 B(LdaConstant), U8(5), // 2569 B(LdaConstant), U8(5), //
2661 B(CreateClosure), U8(1), // 2570 B(CreateClosure), U8(1), //
2662 B(StoreICSloppy), R(5), R(6), U8(3), // 2571 B(StoreICSloppy), R(5), R(6), U8(3), //
2663 B(CallRuntime), U16(Runtime::kToFastProperties), R(5), U8(1), // 2572 B(CallRuntime), U16(Runtime::kToFastProperties), R(5), U8(1), //
2664 B(Ldar), R(5), // 2573 B(Ldar), R(5), //
2665 B(Star), R(4), // 2574 B(Star), R(4), //
2666 B(CallRuntime), U16(Runtime::kInitializeVarGlobal), R(2), U8(3), // 2575 B(CallRuntime), U16(Runtime::kInitializeVarGlobal), R(2), U8(3), //
2667 B(LdaUndefined), // 2576 B(LdaUndefined), //
2668 B(Return), // 2577 B(Return),
2669 }, 2578 },
2670 6, 2579 6,
2671 {InstanceType::FIXED_ARRAY_TYPE, 2580 {InstanceType::FIXED_ARRAY_TYPE, InstanceType::FIXED_ARRAY_TYPE,
2672 InstanceType::FIXED_ARRAY_TYPE,
2673 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, 2581 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE,
2674 InstanceType::FIXED_ARRAY_TYPE, 2582 InstanceType::FIXED_ARRAY_TYPE,
2675 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, 2583 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE,
2676 InstanceType::SHARED_FUNCTION_INFO_TYPE}}, 2584 InstanceType::SHARED_FUNCTION_INFO_TYPE}},
2677 }; 2585 };
2678 2586
2679 for (size_t i = 0; i < arraysize(snippets); i++) { 2587 for (size_t i = 0; i < arraysize(snippets); i++) {
2680 Handle<BytecodeArray> bytecode_array = 2588 Handle<BytecodeArray> bytecode_array =
2681 helper.MakeTopLevelBytecode(snippets[i].code_snippet); 2589 helper.MakeTopLevelBytecode(snippets[i].code_snippet);
2682 CheckBytecodeArrayEqual(snippets[i], bytecode_array); 2590 CheckBytecodeArrayEqual(snippets[i], bytecode_array);
2683 } 2591 }
2684 } 2592 }
2685 2593
2686 2594
2687 TEST(TryCatch) { 2595 TEST(TryCatch) {
2688 InitializedHandleScope handle_scope; 2596 InitializedHandleScope handle_scope;
2689 BytecodeGeneratorHelper helper; 2597 BytecodeGeneratorHelper helper;
2690 2598
2691 // TODO(rmcilroy): modify tests when we have real try catch support. 2599 // TODO(rmcilroy): modify tests when we have real try catch support.
2692 ExpectedSnippet<int> snippets[] = { 2600 ExpectedSnippet<int> snippets[] = {
2693 {"try { return 1; } catch(e) { return 2; }", 2601 {"try { return 1; } catch(e) { return 2; }",
2694 1 * kPointerSize, 2602 kPointerSize,
2695 1, 2603 1,
2696 5, 2604 5,
2697 { 2605 {
2698 B(LdaSmi8), U8(1), // 2606 B(LdaSmi8), U8(1), //
2699 B(Return), // 2607 B(Return), //
2700 B(LdaUndefined), // 2608 B(LdaUndefined), //
2701 B(Return), // 2609 B(Return), //
2702 }, 2610 },
2703 0}, 2611 0},
2704 }; 2612 };
2705 2613
2706 for (size_t i = 0; i < arraysize(snippets); i++) { 2614 for (size_t i = 0; i < arraysize(snippets); i++) {
2707 Handle<BytecodeArray> bytecode_array = 2615 Handle<BytecodeArray> bytecode_array =
2708 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); 2616 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet);
2709 CheckBytecodeArrayEqual(snippets[i], bytecode_array); 2617 CheckBytecodeArrayEqual(snippets[i], bytecode_array);
2710 } 2618 }
2711 } 2619 }
2712 2620
2713 2621
2714 TEST(TryFinally) { 2622 TEST(TryFinally) {
2715 InitializedHandleScope handle_scope; 2623 InitializedHandleScope handle_scope;
2716 BytecodeGeneratorHelper helper; 2624 BytecodeGeneratorHelper helper;
2717 2625
2718 // TODO(rmcilroy): modify tests when we have real try finally support. 2626 // TODO(rmcilroy): modify tests when we have real try finally support.
2719 ExpectedSnippet<int> snippets[] = { 2627 ExpectedSnippet<int> snippets[] = {
2720 {"var a = 1; try { a = 2; } finally { a = 3; }", 2628 {"var a = 1; try { a = 2; } finally { a = 3; }",
2721 1 * kPointerSize, 2629 kPointerSize,
2722 1, 2630 1,
2723 14, 2631 14,
2724 { 2632 {
2725 B(LdaSmi8), U8(1), // 2633 B(LdaSmi8), U8(1), //
2726 B(Star), R(0), // 2634 B(Star), R(0), //
2727 B(LdaSmi8), U8(2), // 2635 B(LdaSmi8), U8(2), //
2728 B(Star), R(0), // 2636 B(Star), R(0), //
2729 B(LdaSmi8), U8(3), // 2637 B(LdaSmi8), U8(3), //
2730 B(Star), R(0), // 2638 B(Star), R(0), //
2731 B(LdaUndefined), // 2639 B(LdaUndefined), //
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after
2943 B(Star), R(1), // 2851 B(Star), R(1), //
2944 B(Call), R(1), R(2), U8(0), // 2852 B(Call), R(1), R(2), U8(0), //
2945 B(LdaContextSlot), R(0), U8(first_context_slot), // 2853 B(LdaContextSlot), R(0), U8(first_context_slot), //
2946 B(Return), // 2854 B(Return), //
2947 }, 2855 },
2948 1, 2856 1,
2949 {InstanceType::SHARED_FUNCTION_INFO_TYPE}}, 2857 {InstanceType::SHARED_FUNCTION_INFO_TYPE}},
2950 {"'use strict'; let a = 1; { let b = 2; return function() { a + b; }; }", 2858 {"'use strict'; let a = 1; { let b = 2; return function() { a + b; }; }",
2951 4 * kPointerSize, 2859 4 * kPointerSize,
2952 1, 2860 1,
2953 51, 2861 49,
2954 { 2862 {
2955 B(CallRuntime), U16(Runtime::kNewFunctionContext), // 2863 B(CallRuntime), U16(Runtime::kNewFunctionContext), //
2956 R(closure), U8(1), // 2864 R(closure), U8(1), //
2957 B(PushContext), R(0), // 2865 B(PushContext), R(0), //
2958 B(LdaTheHole), // 2866 B(LdaTheHole), //
2959 B(StaContextSlot), R(0), U8(first_context_slot), // 2867 B(StaContextSlot), R(0), U8(first_context_slot), //
2960 B(LdaConstant), U8(0), //
2961 B(LdaSmi8), U8(1), // 2868 B(LdaSmi8), U8(1), //
2962 B(StaContextSlot), R(0), U8(first_context_slot), // 2869 B(StaContextSlot), R(0), U8(first_context_slot), //
2963 B(LdaConstant), U8(1), // 2870 B(LdaConstant), U8(0), //
2964 B(Star), R(2), // 2871 B(Star), R(2), //
2965 B(Ldar), R(closure), // 2872 B(Ldar), R(closure), //
2966 B(Star), R(3), // 2873 B(Star), R(3), //
2967 B(CallRuntime), U16(Runtime::kPushBlockContext), R(2), U8(2), // 2874 B(CallRuntime), U16(Runtime::kPushBlockContext), R(2), U8(2), //
2968 B(PushContext), R(1), // 2875 B(PushContext), R(1), //
2969 B(LdaTheHole), // 2876 B(LdaTheHole), //
2970 B(StaContextSlot), R(1), U8(first_context_slot), // 2877 B(StaContextSlot), R(1), U8(first_context_slot), //
2971 B(LdaSmi8), U8(2), // 2878 B(LdaSmi8), U8(2), //
2972 B(StaContextSlot), R(1), U8(first_context_slot), // 2879 B(StaContextSlot), R(1), U8(first_context_slot), //
2973 B(LdaConstant), U8(2), // 2880 B(LdaConstant), U8(1), //
2974 B(CreateClosure), U8(0), // 2881 B(CreateClosure), U8(0), //
2975 B(Return), // 2882 B(Return), //
2976 // TODO(rmcilroy): Dead code after this point due to return in nested 2883 // TODO(rmcilroy): Dead code after this point due to return in nested
2977 // block - investigate eliminating this. 2884 // block - investigate eliminating this.
2978 B(PopContext), R(0), 2885 B(PopContext), R(0),
2979 B(LdaUndefined), // 2886 B(LdaUndefined), //
2980 B(Return), // 2887 B(Return), //
2981 }, 2888 },
2982 3, 2889 2,
2983 {InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, 2890 {InstanceType::FIXED_ARRAY_TYPE,
2984 InstanceType::FIXED_ARRAY_TYPE,
2985 InstanceType::SHARED_FUNCTION_INFO_TYPE}}, 2891 InstanceType::SHARED_FUNCTION_INFO_TYPE}},
2986 }; 2892 };
2987 2893
2988 for (size_t i = 0; i < arraysize(snippets); i++) { 2894 for (size_t i = 0; i < arraysize(snippets); i++) {
2989 Handle<BytecodeArray> bytecode_array = 2895 Handle<BytecodeArray> bytecode_array =
2990 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); 2896 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet);
2991 CheckBytecodeArrayEqual(snippets[i], bytecode_array); 2897 CheckBytecodeArrayEqual(snippets[i], bytecode_array);
2992 } 2898 }
2993 } 2899 }
2994 2900
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
3073 for (size_t i = 0; i < arraysize(snippets); i++) { 2979 for (size_t i = 0; i < arraysize(snippets); i++) {
3074 Handle<BytecodeArray> bytecode_array = 2980 Handle<BytecodeArray> bytecode_array =
3075 helper.MakeBytecodeForFunction(snippets[i].code_snippet); 2981 helper.MakeBytecodeForFunction(snippets[i].code_snippet);
3076 CheckBytecodeArrayEqual(snippets[i], bytecode_array); 2982 CheckBytecodeArrayEqual(snippets[i], bytecode_array);
3077 } 2983 }
3078 } 2984 }
3079 2985
3080 } // namespace interpreter 2986 } // namespace interpreter
3081 } // namespace internal 2987 } // namespace internal
3082 } // namespace v8 2988 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698