| 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 e0668d5b49a244dba7fd1d50bc877b54ea775c5f..6cf3a7b4233879f08dfc345118144d972c9e99cb 100644
|
| --- a/test/cctest/interpreter/test-bytecode-generator.cc
|
| +++ b/test/cctest/interpreter/test-bytecode-generator.cc
|
| @@ -745,7 +745,7 @@ TEST(IfConditions) {
|
| B(JumpIfFalse), U8(7), //
|
| B(LdaSmi8), U8(1), //
|
| B(Return), //
|
| - B(Jump), U8(5), // TODO(oth): Unreachable jump after return
|
| + B(Jump), U8(5), //
|
| B(LdaSmi8), U8(-1), //
|
| B(Return), //
|
| B(LdaUndefined), //
|
| @@ -761,7 +761,7 @@ TEST(IfConditions) {
|
| B(JumpIfFalse), U8(7), //
|
| B(LdaSmi8), U8(1), //
|
| B(Return), //
|
| - B(Jump), U8(5), // TODO(oth): Unreachable jump after return
|
| + B(Jump), U8(5), //
|
| B(LdaSmi8), U8(-1), //
|
| B(Return), //
|
| B(LdaUndefined), //
|
| @@ -777,7 +777,7 @@ TEST(IfConditions) {
|
| B(JumpIfFalse), U8(7), //
|
| B(LdaSmi8), U8(1), //
|
| B(Return), //
|
| - B(Jump), U8(5), // TODO(oth): Unreachable jump after return
|
| + B(Jump), U8(5), //
|
| B(LdaSmi8), U8(-1), //
|
| B(Return), //
|
| B(LdaUndefined), //
|
| @@ -796,11 +796,11 @@ TEST(IfConditions) {
|
| B(JumpIfFalse), U8(7), //
|
| B(LdaConstant), U8(0), //
|
| B(Return), //
|
| - B(Jump), U8(5), // TODO(oth): Unreachable jump after return
|
| - B(LdaConstant), U8(1), //
|
| - B(Return), //
|
| - B(LdaUndefined), //
|
| - B(Return)}, //
|
| + B(Jump), U8(5), //
|
| + B(LdaConstant), U8(1), //
|
| + B(Return), //
|
| + B(LdaUndefined), //
|
| + B(Return)}, //
|
| 2,
|
| {helper.factory()->NewNumberFromInt(200),
|
| helper.factory()->NewNumberFromInt(-200), unused, unused}},
|
| @@ -808,15 +808,14 @@ TEST(IfConditions) {
|
| "f('prop', { prop: 'yes'});",
|
| kPointerSize,
|
| 3,
|
| - 17,
|
| + 15,
|
| {B(Ldar), R(-6), //
|
| B(Star), R(0), //
|
| B(Ldar), R(-5), //
|
| B(TestIn), R(0), //
|
| - B(JumpIfFalse), U8(7), //
|
| + B(JumpIfFalse), U8(5), //
|
| B(LdaConstant), U8(0), //
|
| B(Return), //
|
| - B(Jump), U8(2), // TODO(oth): Unreachable jump after return
|
| B(LdaUndefined), //
|
| B(Return)}, //
|
| 1,
|
| @@ -869,17 +868,16 @@ TEST(IfConditions) {
|
| "} f(1, 1);",
|
| kPointerSize,
|
| 3,
|
| - 122,
|
| + 106,
|
| {
|
| #define IF_CONDITION_RETURN(condition) \
|
| B(Ldar), R(-6), \
|
| B(Star), R(0), \
|
| B(Ldar), R(-5), \
|
| B(condition), R(0), \
|
| - B(JumpIfFalse), U8(7), \
|
| + B(JumpIfFalse), U8(5), \
|
| B(LdaSmi8), U8(1), \
|
| - B(Return), \
|
| - B(Jump), U8(2),
|
| + B(Return),
|
| IF_CONDITION_RETURN(TestEqual) //
|
| IF_CONDITION_RETURN(TestEqualStrict) //
|
| IF_CONDITION_RETURN(TestLessThan) //
|
| @@ -903,6 +901,275 @@ TEST(IfConditions) {
|
| }
|
|
|
|
|
| +TEST(BasicLoops) {
|
| + InitializedHandleScope handle_scope;
|
| + BytecodeGeneratorHelper helper;
|
| +
|
| + Handle<Object> unused = helper.factory()->undefined_value();
|
| + ExpectedSnippet<Handle<Object>> snippets[] = {
|
| + {"var x = 0;"
|
| + "var y = 1;"
|
| + "while (x < 10) {"
|
| + " y = y * 10;"
|
| + " x = x + 1;"
|
| + "}"
|
| + "return y;",
|
| + 3 * kPointerSize,
|
| + 1,
|
| + 42,
|
| + {
|
| + B(LdaZero), //
|
| + B(Star), R(0), //
|
| + B(LdaSmi8), U8(1), //
|
| + B(Star), R(1), //
|
| + B(Jump), U8(22), //
|
| + B(Ldar), R(1), //
|
| + B(Star), R(2), //
|
| + B(LdaSmi8), U8(10), //
|
| + B(Mul), R(2), //
|
| + B(Star), R(1), //
|
| + B(Ldar), R(0), //
|
| + B(Star), R(2), //
|
| + B(LdaSmi8), U8(1), //
|
| + B(Add), R(2), //
|
| + B(Star), R(0), //
|
| + B(Ldar), R(0), //
|
| + B(Star), R(2), //
|
| + B(LdaSmi8), U8(10), //
|
| + B(TestLessThan), R(2), //
|
| + B(JumpIfTrue), U8(-28), //
|
| + B(Ldar), R(1), //
|
| + B(Return), //
|
| + },
|
| + 0,
|
| + {unused, unused, unused, unused}},
|
| + {"var i = 0;"
|
| + "while(true) {"
|
| + " if (i < 0) continue;"
|
| + " if (i == 3) break;"
|
| + " if (i == 4) break;"
|
| + " if (i == 10) continue;"
|
| + " if (i == 5) break;"
|
| + " i = i + 1;"
|
| + "}"
|
| + "return i;",
|
| + 2 * kPointerSize,
|
| + 1,
|
| + 80,
|
| + {
|
| + B(LdaZero), //
|
| + B(Star), R(0), //
|
| + B(Jump), U8(71), //
|
| + B(Ldar), R(0), //
|
| + B(Star), R(1), //
|
| + B(LdaZero), //
|
| + B(TestLessThan), R(1), //
|
| + B(JumpIfFalse), U8(4), //
|
| + B(Jump), U8(60), //
|
| + B(Ldar), R(0), //
|
| + B(Star), R(1), //
|
| + B(LdaSmi8), U8(3), //
|
| + B(TestEqual), R(1), //
|
| + B(JumpIfFalse), U8(4), //
|
| + B(Jump), U8(51), //
|
| + B(Ldar), R(0), //
|
| + B(Star), R(1), //
|
| + B(LdaSmi8), U8(4), //
|
| + B(TestEqual), R(1), //
|
| + B(JumpIfFalse), U8(4), //
|
| + B(Jump), U8(39), //
|
| + B(Ldar), R(0), //
|
| + B(Star), R(1), //
|
| + B(LdaSmi8), U8(10), //
|
| + B(TestEqual), R(1), //
|
| + B(JumpIfFalse), U8(4), //
|
| + B(Jump), U8(24), //
|
| + B(Ldar), R(0), //
|
| + B(Star), R(1), //
|
| + B(LdaSmi8), U8(5), //
|
| + B(TestEqual), R(1), //
|
| + B(JumpIfFalse), U8(4), //
|
| + B(Jump), U8(15), //
|
| + B(Ldar), R(0), //
|
| + B(Star), R(1), //
|
| + B(LdaSmi8), U8(1), //
|
| + B(Add), R(1), //
|
| + B(Star), R(0), //
|
| + B(LdaTrue), //
|
| + B(JumpIfTrue), U8(-70), //
|
| + B(Ldar), R(0), //
|
| + B(Return) //
|
| + },
|
| + 0,
|
| + {unused, unused, unused, unused}},
|
| + {"var x = 0; var y = 1;"
|
| + "do {"
|
| + " y = y * 10;"
|
| + " if (x == 5) break;"
|
| + " if (x == 6) continue;"
|
| + " x = x + 1;"
|
| + "} while (x < 10);"
|
| + "return y;",
|
| + 3 * kPointerSize,
|
| + 1,
|
| + 64,
|
| + {
|
| + B(LdaZero), //
|
| + B(Star), R(0), //
|
| + B(LdaSmi8), U8(1), //
|
| + B(Star), R(1), //
|
| + B(Ldar), R(1), //
|
| + B(Star), R(2), //
|
| + B(LdaSmi8), U8(10), //
|
| + B(Mul), R(2), //
|
| + B(Star), R(1), //
|
| + B(Ldar), R(0), //
|
| + B(Star), R(2), //
|
| + B(LdaSmi8), U8(5), //
|
| + B(TestEqual), R(2), //
|
| + B(JumpIfFalse), U8(4), //
|
| + B(Jump), U8(34), //
|
| + B(Ldar), R(0), //
|
| + B(Star), R(2), //
|
| + B(LdaSmi8), U8(6), //
|
| + B(TestEqual), R(2), //
|
| + B(JumpIfFalse), U8(4), //
|
| + B(Jump), U8(12), //
|
| + B(Ldar), R(0), //
|
| + B(Star), R(2), //
|
| + B(LdaSmi8), U8(1), //
|
| + B(Add), R(2), //
|
| + B(Star), R(0), //
|
| + B(Ldar), R(0), //
|
| + B(Star), R(2), //
|
| + B(LdaSmi8), U8(10), //
|
| + B(TestLessThan), R(2), //
|
| + B(JumpIfTrue), U8(-52), //
|
| + B(Ldar), R(1), //
|
| + B(Return) //
|
| + },
|
| + 0,
|
| + {unused, unused, unused, unused}},
|
| + {"var x = 0; "
|
| + "for(;;) {"
|
| + " if (x == 1) break;"
|
| + " x = x + 1;"
|
| + "}",
|
| + 2 * kPointerSize,
|
| + 1,
|
| + 29,
|
| + {
|
| + B(LdaZero), //
|
| + B(Star), R(0), //
|
| + B(Ldar), R(0), //
|
| + B(Star), R(1), //
|
| + B(LdaSmi8), //
|
| + U8(1), //
|
| + B(TestEqual), R(1), //
|
| + B(JumpIfFalse), U8(4), //
|
| + B(Jump), U8(14), //
|
| + B(Ldar), R(0), //
|
| + B(Star), R(1), //
|
| + B(LdaSmi8), U8(1), //
|
| + B(Add), R(1), //
|
| + B(Star), R(0), //
|
| + B(Jump), U8(-22), //
|
| + B(LdaUndefined), //
|
| + B(Return), //
|
| + },
|
| + 0,
|
| + {unused, unused, unused, unused}},
|
| + {"var u = 0;"
|
| + "for(var i = 0; i < 100; i = i + 1) {"
|
| + " u = u + 1;"
|
| + " continue;"
|
| + "}",
|
| + 3 * kPointerSize,
|
| + 1,
|
| + 42,
|
| + {
|
| + B(LdaZero), //
|
| + B(Star), R(0), //
|
| + B(LdaZero), //
|
| + B(Star), R(1), //
|
| + B(Jump), U8(24), //
|
| + B(Ldar), R(0), //
|
| + B(Star), R(2), //
|
| + B(LdaSmi8), U8(1), //
|
| + B(Add), R(2), //
|
| + B(Star), R(0), //
|
| + B(Jump), U8(2), //
|
| + B(Ldar), R(1), //
|
| + B(Star), R(2), //
|
| + B(LdaSmi8), U8(1), //
|
| + B(Add), R(2), //
|
| + B(Star), R(1), //
|
| + B(Ldar), R(1), //
|
| + B(Star), R(2), //
|
| + B(LdaSmi8), U8(100), //
|
| + B(TestLessThan), R(2), //
|
| + B(JumpIfTrue), U8(-30), //
|
| + B(LdaUndefined), //
|
| + B(Return), //
|
| + },
|
| + 0,
|
| + {unused, unused, unused, unused}},
|
| + {"var i = 0;"
|
| + "while(true) {"
|
| + " while (i < 3) {"
|
| + " if (i == 2) break;"
|
| + " i = i + 1;"
|
| + " }"
|
| + " i = i + 1;"
|
| + " break;"
|
| + "}"
|
| + "return i;",
|
| + 2 * kPointerSize,
|
| + 1,
|
| + 57,
|
| + {
|
| + B(LdaZero), //
|
| + B(Star), R(0), //
|
| + B(Jump), U8(48), //
|
| + B(Jump), U8(24), //
|
| + B(Ldar), R(0), //
|
| + B(Star), R(1), //
|
| + B(LdaSmi8), U8(2), //
|
| + B(TestEqual), R(1), //
|
| + B(JumpIfFalse), U8(4), //
|
| + B(Jump), U8(22), //
|
| + B(Ldar), R(0), //
|
| + B(Star), R(1), //
|
| + B(LdaSmi8), U8(1), //
|
| + B(Add), R(1), //
|
| + B(Star), R(0), //
|
| + B(Ldar), R(0), //
|
| + B(Star), R(1), //
|
| + B(LdaSmi8), U8(3), //
|
| + B(TestLessThan), R(1), //
|
| + B(JumpIfTrue), U8(-30), //
|
| + B(Ldar), R(0), //
|
| + B(Star), R(1), //
|
| + B(LdaSmi8), U8(1), //
|
| + B(Add), R(1), //
|
| + B(Star), R(0), //
|
| + B(Jump), U8(5), //
|
| + B(LdaTrue), //
|
| + B(JumpIfTrue), U8(-47), //
|
| + B(Ldar), R(0), //
|
| + B(Return), //
|
| + },
|
| + 0,
|
| + {unused, unused, unused, unused}},
|
| + };
|
| +
|
| + for (size_t i = 0; i < arraysize(snippets); i++) {
|
| + Handle<BytecodeArray> bytecode_array =
|
| + helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet);
|
| + CheckBytecodeArrayEqual(snippets[i], bytecode_array);
|
| + }
|
| +}
|
| +
|
| } // namespace interpreter
|
| } // namespace internal
|
| } // namespance v8
|
|
|