Index: test/cctest/interpreter/test-bytecode-generator.cc |
diff --git a/test/cctest/interpreter/test-bytecode-generator.cc b/test/cctest/interpreter/test-bytecode-generator.cc |
index 2f547721abd82aa375d34d877eaa9655d642a8da..6289d91999edbe354ef84e28d0b1769a0bdfca9c 100644 |
--- a/test/cctest/interpreter/test-bytecode-generator.cc |
+++ b/test/cctest/interpreter/test-bytecode-generator.cc |
@@ -410,6 +410,18 @@ TEST(LogicalExpressions) { |
B(LdaSmi8), U8(3), // |
B(Return)}, |
0}, |
+ {"var x = 0; return (x == 1) || 3;", |
+ 1 * kPointerSize, |
+ 1, |
+ 12, |
+ {B(LdaZero), // |
+ B(Star), R(0), // |
+ B(LdaSmi8), U8(1), // |
+ B(TestEqual), R(0), // |
+ B(JumpIfTrue), U8(4), // |
+ B(LdaSmi8), U8(3), // |
+ B(Return)}, |
+ 0}, |
{"var x = 0; return x && 3;", |
1 * kPointerSize, |
1, |
@@ -421,6 +433,18 @@ TEST(LogicalExpressions) { |
B(LdaSmi8), U8(3), // |
B(Return)}, |
0}, |
+ {"var x = 0; return (x == 0) && 3;", |
+ 1 * kPointerSize, |
+ 1, |
+ 11, |
+ {B(LdaZero), // |
+ B(Star), R(0), // |
+ B(LdaZero), // |
+ B(TestEqual), R(0), // |
+ B(JumpIfFalse), U8(4), // |
+ B(LdaSmi8), U8(3), // |
+ B(Return)}, |
+ 0}, |
{"var x = 0; return x || (1, 2, 3);", |
1 * kPointerSize, |
1, |
@@ -495,6 +519,54 @@ TEST(LogicalExpressions) { |
B(Return)}, // |
1, |
{260, 0, 0, 0}}, |
+ {"var x = 1; var a = 2, b = 3; return (x > 3) || (" |
+ REPEAT_32(SPACE, "a = 1, b = 2, ") |
+ "3);", |
+ 3 * kPointerSize, |
+ 1, |
+ 277, |
+ {B(LdaSmi8), U8(1), // |
+ B(Star), R(0), // |
+ B(LdaSmi8), U8(2), // |
+ B(Star), R(1), // |
+ B(LdaSmi8), U8(3), // |
+ B(Star), R(2), // |
+ B(LdaSmi8), U8(3), // |
+ B(TestGreaterThan), R(0), // |
+ B(JumpIfTrueConstant), U8(0), // |
+ REPEAT_32(COMMA, // |
+ B(LdaSmi8), U8(1), // |
+ B(Star), R(1), // |
+ B(LdaSmi8), U8(2), // |
+ B(Star), R(2)), // |
+ B(LdaSmi8), U8(3), // |
+ B(Return)}, |
+ 1, |
+ {260, 0, 0, 0}}, |
+ {"var x = 0; var a = 2, b = 3; return (x < 5) && (" |
+ REPEAT_32(SPACE, "a = 1, b = 2, ") |
+ "3);", |
+ 3 * kPointerSize, |
+ 1, |
+ 276, |
+ {B(LdaZero), // |
+ B(Star), R(0), // |
+ B(LdaSmi8), U8(2), // |
+ B(Star), R(1), // |
+ B(LdaSmi8), U8(3), // |
+ B(Star), R(2), // |
+ B(LdaSmi8), U8(5), // |
+ B(TestLessThan), R(0), // |
+ B(JumpIfFalseConstant), U8(0), // |
+ REPEAT_32(COMMA, // |
+ B(LdaSmi8), U8(1), // |
+ B(Star), R(1), // |
+ B(LdaSmi8), U8(2), // |
+ B(Star), R(2)), // |
+ B(LdaSmi8), U8(3), // |
+ B(Return)}, |
+ 1, |
+ {260, 0, 0, 0}}, |
{"return 0 && 3;", |
0 * kPointerSize, |
1, |
@@ -1528,33 +1600,31 @@ TEST(IfConditions) { |
{"function f() { if (0) { return 1; } else { return -1; } } f()", |
0, |
1, |
- 14, |
- {B(LdaZero), // |
- B(ToBoolean), // |
- B(JumpIfFalse), U8(7), // |
- B(LdaSmi8), U8(1), // |
- B(Return), // |
- B(Jump), U8(5), // |
- B(LdaSmi8), U8(-1), // |
- B(Return), // |
- B(LdaUndefined), // |
- B(Return)}, // |
+ 13, |
+ {B(LdaZero), // |
+ B(JumpIfToBooleanFalse), U8(7), // |
+ B(LdaSmi8), U8(1), // |
+ B(Return), // |
+ B(Jump), U8(5), // |
+ B(LdaSmi8), U8(-1), // |
+ B(Return), // |
+ B(LdaUndefined), // |
+ B(Return)}, // |
0, |
{unused, unused, unused, unused, unused, unused}}, |
{"function f() { if ('lucky') { return 1; } else { return -1; } } f();", |
0, |
1, |
- 15, |
- {B(LdaConstant), U8(0), // |
- B(ToBoolean), // |
- B(JumpIfFalse), U8(7), // |
- B(LdaSmi8), U8(1), // |
- B(Return), // |
- B(Jump), U8(5), // |
- B(LdaSmi8), U8(-1), // |
- B(Return), // |
- B(LdaUndefined), // |
- B(Return)}, // |
+ 14, |
+ {B(LdaConstant), U8(0), // |
+ B(JumpIfToBooleanFalse), U8(7), // |
+ B(LdaSmi8), U8(1), // |
+ B(Return), // |
+ B(Jump), U8(5), // |
+ B(LdaSmi8), U8(-1), // |
+ B(Return), // |
+ B(LdaUndefined), // |
+ B(Return)}, // |
1, |
{helper.factory()->NewStringFromStaticChars("lucky"), unused, unused, |
unused, unused, unused}}, |
@@ -1638,6 +1708,36 @@ TEST(IfConditions) { |
helper.factory()->NewNumberFromInt(200), |
helper.factory()->NewNumberFromInt(263), |
helper.factory()->NewNumberFromInt(-200), unused, unused}}, |
+ {"function f() { var a = 0; var b = 0; if (a) { " |
+ REPEAT_32(SPACE, "b = a; a = b; ") |
+ " return 200; } else { return -200; } } f()", |
+ 2 * kPointerSize, |
+ 1, |
+ 276, |
+ { |
+ B(LdaZero), // |
+ B(Star), R(0), // |
+ B(LdaZero), // |
+ B(Star), R(1), // |
+ B(Ldar), R(0), // |
+ B(JumpIfToBooleanFalseConstant), U8(1), // |
+ REPEAT_32(COMMA, // |
+ B(Ldar), R(0), // |
+ B(Star), R(1), // |
+ B(Ldar), R(1), // |
+ B(Star), R(0)), // |
+ B(LdaConstant), U8(0), // |
+ B(Return), // |
+ B(Jump), U8(5), // |
+ B(LdaConstant), U8(2), // |
+ B(Return), // |
+ B(LdaUndefined), // |
+ B(Return)}, // |
+ 3, |
+ {helper.factory()->NewNumberFromInt(200), |
+ helper.factory()->NewNumberFromInt(263), |
+ helper.factory()->NewNumberFromInt(-200), unused, unused, unused}}, |
+ |
{"function f(a, b) {\n" |
" if (a == b) { return 1; }\n" |
" if (a === b) { return 1; }\n" |
@@ -2007,7 +2107,88 @@ TEST(BasicLoops) { |
B(Return), // |
}, |
0}, |
- }; |
+ {"var x = 10;" |
+ "var y = 1;" |
+ "while (x) {" |
+ " y = y * 12;" |
+ " x = x - 1;" |
+ "}" |
+ "return y;", |
+ 2 * kPointerSize, |
+ 1, |
+ 29, |
+ { |
+ B(LdaSmi8), U8(10), // |
+ B(Star), R(0), // |
+ B(LdaSmi8), U8(1), // |
+ B(Star), R(1), // |
+ B(Jump), U8(14), // |
+ B(LdaSmi8), U8(12), // |
+ B(Mul), R(1), // |
+ B(Star), R(1), // |
+ B(LdaSmi8), U8(1), // |
+ B(Sub), R(0), // |
+ B(Star), R(0), // |
+ B(Ldar), R(0), // |
+ B(JumpIfToBooleanTrue), U8(-14), // |
+ B(Ldar), R(1), // |
+ B(Return), // |
+ }, |
+ 0}, |
+ {"var x = 10;" |
+ "var y = 1;" |
+ "do {" |
+ " y = y * 12;" |
+ " x = x - 1;" |
+ "} while(x);" |
+ "return y;", |
+ 2 * kPointerSize, |
+ 1, |
+ 27, |
+ { |
+ B(LdaSmi8), U8(10), // |
+ B(Star), R(0), // |
+ B(LdaSmi8), U8(1), // |
+ B(Star), R(1), // |
+ B(LdaSmi8), U8(12), // |
+ B(Mul), R(1), // |
+ B(Star), R(1), // |
+ B(LdaSmi8), U8(1), // |
+ B(Sub), R(0), // |
+ B(Star), R(0), // |
+ B(Ldar), R(0), // |
+ B(JumpIfToBooleanTrue), U8(-14), // |
+ B(Ldar), R(1), // |
+ B(Return), // |
+ }, |
+ 0}, |
+ {"var y = 1;" |
+ "for (var x = 10; x; --x) {" |
+ " y = y * 12;" |
+ "}" |
+ "return y;", |
+ 2 * kPointerSize, |
+ 1, |
+ 29, |
+ { |
+ B(LdaSmi8), U8(1), // |
+ B(Star), R(0), // |
+ B(LdaSmi8), U8(10), // |
+ B(Star), R(1), // |
+ B(Jump), U8(14), // |
+ B(LdaSmi8), U8(12), // |
+ B(Mul), R(0), // |
+ B(Star), R(0), // |
+ B(Ldar), R(1), // |
+ B(ToNumber), // |
+ B(Dec), // |
+ B(Star), R(1), // |
+ B(Ldar), R(1), // |
+ B(JumpIfToBooleanTrue), U8(-14), // |
+ B(Ldar), R(0), // |
+ B(Return), // |
+ }, |
+ 0}}; |
for (size_t i = 0; i < arraysize(snippets); i++) { |
Handle<BytecodeArray> bytecode_array = |
@@ -3108,15 +3289,14 @@ TEST(Throw) { |
{"if ('test') { throw 'Error'; };", |
0, |
1, |
- 10, |
+ 9, |
{ |
- B(LdaConstant), U8(0), // |
- B(ToBoolean), // |
- B(JumpIfFalse), U8(5), // |
- B(LdaConstant), U8(1), // |
- B(Throw), // |
- B(LdaUndefined), // |
- B(Return), // |
+ B(LdaConstant), U8(0), // |
+ B(JumpIfToBooleanFalse), U8(5), // |
+ B(LdaConstant), U8(1), // |
+ B(Throw), // |
+ B(LdaUndefined), // |
+ B(Return), // |
}, |
2, |
{"test", "Error"}}, |
@@ -4304,33 +4484,30 @@ TEST(Conditional) { |
{"return 1 ? 2 : 3;", |
0, |
1, |
- 12, |
+ 11, |
{ |
- B(LdaSmi8), U8(1), // |
- B(ToBoolean), // |
- B(JumpIfFalse), U8(6), // |
- B(LdaSmi8), U8(2), // |
- B(Jump), U8(4), // |
- B(LdaSmi8), U8(3), // |
- B(Return), // |
+ B(LdaSmi8), U8(1), // |
+ B(JumpIfToBooleanFalse), U8(6), // |
+ B(LdaSmi8), U8(2), // |
+ B(Jump), U8(4), // |
+ B(LdaSmi8), U8(3), // |
+ B(Return), // |
}}, |
{"return 1 ? 2 ? 3 : 4 : 5;", |
0, |
1, |
- 21, |
- { |
- B(LdaSmi8), U8(1), // |
- B(ToBoolean), // |
- B(JumpIfFalse), U8(15), // |
- B(LdaSmi8), U8(2), // |
- B(ToBoolean), // |
- B(JumpIfFalse), U8(6), // |
- B(LdaSmi8), U8(3), // |
- B(Jump), U8(4), // |
- B(LdaSmi8), U8(4), // |
- B(Jump), U8(4), // |
- B(LdaSmi8), U8(5), // |
- B(Return), // |
+ 19, |
+ { |
+ B(LdaSmi8), U8(1), // |
+ B(JumpIfToBooleanFalse), U8(14), // |
+ B(LdaSmi8), U8(2), // |
+ B(JumpIfToBooleanFalse), U8(6), // |
+ B(LdaSmi8), U8(3), // |
+ B(Jump), U8(4), // |
+ B(LdaSmi8), U8(4), // |
+ B(Jump), U8(4), // |
+ B(LdaSmi8), U8(5), // |
+ B(Return), // |
}}, |
}; |