OLD | NEW |
---|---|
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #include "src/compiler.h" | 7 #include "src/compiler.h" |
8 #include "src/interpreter/bytecode-array-iterator.h" | 8 #include "src/interpreter/bytecode-array-iterator.h" |
9 #include "src/interpreter/bytecode-generator.h" | 9 #include "src/interpreter/bytecode-generator.h" |
10 #include "src/interpreter/interpreter.h" | 10 #include "src/interpreter/interpreter.h" |
(...skipping 377 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
388 13, | 388 13, |
389 { | 389 { |
390 B(LdaSmi8), U8(10), // | 390 B(LdaSmi8), U8(10), // |
391 B(Star), R(0), // | 391 B(Star), R(0), // |
392 B(Ldar), R(0), // Easy to spot r1 not really needed here. | 392 B(Ldar), R(0), // Easy to spot r1 not really needed here. |
393 B(Star), R(1), // Dead store. | 393 B(Star), R(1), // Dead store. |
394 B(LdaSmi8), U8(3), // | 394 B(LdaSmi8), U8(3), // |
395 B(ShiftRightLogical), R(1), // | 395 B(ShiftRightLogical), R(1), // |
396 B(Return) // | 396 B(Return) // |
397 }, | 397 }, |
398 0}, | |
399 {"var x = 0; return (x, 3);", | |
400 1 * kPointerSize, | |
401 1, | |
402 8, | |
403 { | |
404 B(LdaZero), // | |
405 B(Star), R(0), // | |
406 B(Ldar), R(0), // | |
407 B(LdaSmi8), U8(3), // | |
408 B(Return) // | |
409 }, | |
398 0}}; | 410 0}}; |
399 | 411 |
400 for (size_t i = 0; i < arraysize(snippets); i++) { | 412 for (size_t i = 0; i < arraysize(snippets); i++) { |
401 Handle<BytecodeArray> bytecode_array = | 413 Handle<BytecodeArray> bytecode_array = |
402 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); | 414 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); |
403 CheckBytecodeArrayEqual(snippets[i], bytecode_array); | 415 CheckBytecodeArrayEqual(snippets[i], bytecode_array); |
404 } | 416 } |
405 } | 417 } |
406 | 418 |
407 | 419 |
420 TEST(LogicalExpressions) { | |
421 InitializedHandleScope handle_scope; | |
422 BytecodeGeneratorHelper helper; | |
423 | |
424 Handle<Object> unused = helper.factory()->undefined_value(); | |
425 | |
426 ExpectedSnippet<Handle<Object>> snippets[] = { | |
427 {"var x = 0; return x || 3;", | |
428 1 * kPointerSize, | |
429 1, | |
430 10, | |
431 { | |
432 B(LdaZero), // | |
433 B(Star), R(0), // | |
434 B(Ldar), R(0), // | |
435 B(JumpIfToBooleanTrue), U8(4), // | |
436 B(LdaSmi8), U8(3), // | |
437 B(Return) // | |
438 }, | |
439 0, | |
440 {unused, unused, unused, unused}}, | |
441 {"var x = 1; var a = 2, b = 3; return x || (" | |
rmcilroy
2015/10/13 15:43:24
Could you make a similar test for && as well pleas
mythria
2015/10/14 13:33:42
Done.
| |
442 #define X "a, b, a, b, " | |
443 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 #undef X | |
445 "3);", | |
446 3 * kPointerSize, | |
447 1, | |
448 283, | |
449 { | |
450 B(LdaSmi8), U8(1), // | |
451 B(Star), R(0), // | |
452 B(LdaSmi8), U8(2), // | |
453 B(Star), R(1), // | |
454 B(LdaSmi8), U8(3), // | |
455 B(Star), R(2), // | |
456 B(Ldar), R(0), // | |
457 B(JumpIfToBooleanTrueConstant), U8(0), // | |
458 #define X B(Ldar), R(1), B(Ldar), R(2), B(Ldar), R(1), B(Ldar), R(2), | |
459 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 | |
460 #undef X | |
461 B(LdaSmi8), | |
rmcilroy
2015/10/13 15:43:24
nit - indentation, and add '//' after
mythria
2015/10/14 13:33:42
Done.
| |
462 U8(3), // | |
463 B(Return) // | |
464 }, | |
465 1, | |
466 {helper.factory()->NewNumberFromInt(268), unused, unused, unused}}, | |
467 {"var x = 0; return x && 3;", | |
468 1 * kPointerSize, | |
469 1, | |
470 10, | |
471 { | |
472 B(LdaZero), // | |
473 B(Star), R(0), // | |
474 B(Ldar), R(0), // | |
475 B(JumpIfToBooleanFalse), U8(4), // | |
476 B(LdaSmi8), U8(3), // | |
477 B(Return) // | |
478 }, | |
479 0, | |
480 {unused, unused, unused, unused}}, | |
rmcilroy
2015/10/13 15:43:24
nit - would be nice to have one test that is neste
mythria
2015/10/14 13:33:42
Done.
| |
481 {"return 0 && 3;", | |
482 0 * kPointerSize, | |
483 1, | |
484 2, | |
485 {B(LdaZero), B(Return)}, | |
rmcilroy
2015/10/13 15:43:24
nit - new bytecode on new line (use '//' to avoid
mythria
2015/10/14 13:33:42
Done.
| |
486 0, | |
487 {unused, unused, unused, unused}}, | |
488 {" return 1 || 3;", | |
rmcilroy
2015/10/13 15:43:24
nit - remove extra space at start
mythria
2015/10/14 13:33:42
Done.
| |
489 0 * kPointerSize, | |
490 1, | |
491 3, | |
492 {B(LdaSmi8), U8(1), B(Return)}, | |
rmcilroy
2015/10/13 15:43:24
ditto
mythria
2015/10/14 13:33:42
Done.
| |
493 0, | |
494 {unused, unused, unused, unused}}}; | |
495 | |
496 for (size_t i = 0; i < arraysize(snippets); i++) { | |
497 Handle<BytecodeArray> bytecode_array = | |
498 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); | |
499 CheckBytecodeArrayEqual(snippets[i], bytecode_array); | |
500 } | |
501 } | |
502 | |
503 | |
408 TEST(Parameters) { | 504 TEST(Parameters) { |
409 InitializedHandleScope handle_scope; | 505 InitializedHandleScope handle_scope; |
410 BytecodeGeneratorHelper helper; | 506 BytecodeGeneratorHelper helper; |
411 | 507 |
412 ExpectedSnippet<int> snippets[] = { | 508 ExpectedSnippet<int> snippets[] = { |
413 {"function f() { return this; }", | 509 {"function f() { return this; }", |
414 0, 1, 3, {B(Ldar), R(helper.kLastParamIndex), B(Return)}, 0}, | 510 0, 1, 3, {B(Ldar), R(helper.kLastParamIndex), B(Return)}, 0}, |
415 {"function f(arg1) { return arg1; }", | 511 {"function f(arg1) { return arg1; }", |
416 0, 2, 3, {B(Ldar), R(helper.kLastParamIndex), B(Return)}, 0}, | 512 0, 2, 3, {B(Ldar), R(helper.kLastParamIndex), B(Return)}, 0}, |
417 {"function f(arg1) { return this; }", | 513 {"function f(arg1) { return this; }", |
(...skipping 1522 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1940 for (size_t i = 0; i < arraysize(snippets); i++) { | 2036 for (size_t i = 0; i < arraysize(snippets); i++) { |
1941 Handle<BytecodeArray> bytecode_array = | 2037 Handle<BytecodeArray> bytecode_array = |
1942 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); | 2038 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); |
1943 CheckBytecodeArrayEqual(snippets[i], bytecode_array); | 2039 CheckBytecodeArrayEqual(snippets[i], bytecode_array); |
1944 } | 2040 } |
1945 } | 2041 } |
1946 | 2042 |
1947 } // namespace interpreter | 2043 } // namespace interpreter |
1948 } // namespace internal | 2044 } // namespace internal |
1949 } // namespace v8 | 2045 } // namespace v8 |
OLD | NEW |