| 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 bff48bcce1a3447d7d1ab9d1fe18df29e985d832..1378aa9369e5db4622f1f6be5aab42d1a53fff28 100644
|
| --- a/test/cctest/interpreter/test-bytecode-generator.cc
|
| +++ b/test/cctest/interpreter/test-bytecode-generator.cc
|
| @@ -64,7 +64,7 @@ struct ExpectedSnippet {
|
| int frame_size;
|
| int parameter_count;
|
| int bytecode_length;
|
| - const uint8_t bytecode[32];
|
| + const uint8_t bytecode[512];
|
| int constant_count;
|
| T constants[16];
|
| };
|
| @@ -608,6 +608,86 @@ TEST(PropertyCall) {
|
| }
|
| }
|
|
|
| +
|
| +TEST(IfConditions) {
|
| + InitializedHandleScope handle_scope;
|
| + BytecodeGeneratorHelper helper;
|
| +
|
| + ExpectedSnippet<void*> snippets[] = {
|
| + {"function f() { if (false) { return 1; } else { return -1; } }",
|
| + 0,
|
| + 1,
|
| + 12,
|
| + {B(LdaFalse), B(CastToBoolean), B(JumpIfFalse), U8(7), B(LdaSmi8), U8(1),
|
| + B(Return), B(Jump),
|
| + U8(5), // TODO(oth): Fix implicit return so dead-jump has
|
| + // a valid target.
|
| + B(LdaSmi8), U8(-1), B(Return)}},
|
| + {"function f(a) { if (a <= 0) { return 200; } else { return -200; } }",
|
| + kPointerSize,
|
| + 2,
|
| + 18,
|
| + {B(Ldar), R(-5), B(Star), R(0), B(LdaZero), B(TestLessThanEqual), R(0),
|
| + B(CastToBoolean), B(JumpIfFalse), U8(7), B(LdaConstant), U8(0),
|
| + B(Return), B(Jump),
|
| + U8(5), // TODO(oth): Fix implicit return so dead-jump has
|
| + // a valid target.
|
| + B(LdaConstant), U8(1), B(Return)}},
|
| + {"function f(a, b) { if (a in b) { return 200; } }",
|
| + kPointerSize,
|
| + 3,
|
| + 18,
|
| + {B(Ldar), R(-6), B(Star), R(0), B(Ldar), R(-5), B(TestIn), R(0),
|
| + B(CastToBoolean), B(JumpIfFalse), U8(7), B(LdaConstant), U8(0),
|
| + B(Return), B(Jump),
|
| + U8(2), // TODO(oth): Fix implicit return so dead-jump has
|
| + // a valid target.
|
| + B(LdaUndefined), B(Return)}},
|
| + {"function f(a, b) { if (a instanceof b) { return 200; } }",
|
| + kPointerSize,
|
| + 3,
|
| + 18,
|
| + {B(Ldar), R(-6), B(Star), R(0), B(Ldar), R(-5), B(TestInstanceOf), R(0),
|
| + B(CastToBoolean), B(JumpIfFalse), U8(7), B(LdaConstant), U8(0),
|
| + B(Return), B(Jump),
|
| + U8(2), // TODO(oth): Fix implicit return so dead-jump has
|
| + // a valid target.
|
| + B(LdaUndefined), B(Return)}},
|
| + {"function f(z) { var a = 0; var b = 0; if (a === 0.01) { "
|
| +// Force a jump using a constant pool entry.
|
| +#define X "b = a; a = b; "
|
| + X X X X X X X X X X X X X X X X X X X X X X X X
|
| +#undef X
|
| + " return 200; } else { return -200; } }",
|
| + 3 * kPointerSize,
|
| + 2,
|
| + 217,
|
| + {B(LdaZero), B(Star), R(0), B(LdaZero), B(Star), R(1), B(Ldar), R(0),
|
| + B(Star), R(2), B(LdaConstant), U8(0), B(TestEqualStrict), R(2),
|
| + B(CastToBoolean), B(JumpIfFalseConstant), U8(2),
|
| +#define X B(Ldar), R(0), B(Star), R(1), B(Ldar), R(1), B(Star), R(0),
|
| + X X X X X X X X X X X X X X X X X X X X X X X X
|
| +#undef X
|
| + B(LdaConstant),
|
| + U8(1), B(Return), B(Jump),
|
| + U8(5), // TODO(oth): Fix implicit return so dead-jump has
|
| + // a valid target.
|
| + B(LdaConstant), U8(3), B(Return)}},
|
| + };
|
| +
|
| + size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]);
|
| + for (size_t i = 0; i < num_snippets; i++) {
|
| + Handle<BytecodeArray> ba =
|
| + helper.MakeBytecodeForFunction(snippets[i].code_snippet);
|
| + CHECK_EQ(ba->frame_size(), snippets[i].frame_size);
|
| + CHECK_EQ(ba->parameter_count(), snippets[i].parameter_count);
|
| + CHECK_EQ(ba->length(), snippets[i].bytecode_length);
|
| + CHECK(!memcmp(ba->GetFirstBytecodeAddress(), snippets[i].bytecode,
|
| + ba->length()));
|
| + }
|
| +}
|
| +
|
| +
|
| } // namespace interpreter
|
| } // namespace internal
|
| } // namespance v8
|
|
|