| 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 54a8bb3fe57f2278bf39340397ae6d6e12b3e933..1c2094c6f72d566bbdfdea1ce47d8d0b3eebfae7 100644
|
| --- a/test/cctest/interpreter/test-bytecode-generator.cc
|
| +++ b/test/cctest/interpreter/test-bytecode-generator.cc
|
| @@ -5265,6 +5265,225 @@ TEST(RemoveRedundantLdar) {
|
| }
|
| }
|
|
|
| +
|
| +TEST(AssignmentsInBinaryExpression) {
|
| + InitializedHandleScope handle_scope;
|
| + BytecodeGeneratorHelper helper;
|
| +
|
| + ExpectedSnippet<const char*> snippets[] = {
|
| + {"var x = 0, y = 1;\n"
|
| + "return (x = 2, y = 3, x = 4, y = 5)",
|
| + 2 * kPointerSize,
|
| + 1,
|
| + 24,
|
| + {
|
| + B(LdaZero), B(Star), R(0), //
|
| + B(LdaSmi8), U8(1), //
|
| + B(Star), R(1), //
|
| + B(LdaSmi8), U8(2), //
|
| + B(Star), R(0), //
|
| + B(LdaSmi8), U8(3), //
|
| + B(Star), R(1), //
|
| + B(LdaSmi8), U8(4), //
|
| + B(Star), R(0), //
|
| + B(LdaSmi8), U8(5), //
|
| + B(Star), R(1), //
|
| + B(Return), //
|
| + },
|
| + 0},
|
| + {"var x = 55;\n"
|
| + "var y = (x = 100);\n"
|
| + "return y",
|
| + 2 * kPointerSize,
|
| + 1,
|
| + 11,
|
| + {
|
| + B(LdaSmi8), U8(55), //
|
| + B(Star), R(0), //
|
| + B(LdaSmi8), U8(100), //
|
| + B(Star), R(0), //
|
| + B(Star), R(1), //
|
| + B(Return), //
|
| + },
|
| + 0},
|
| + {"var x = 55;\n"
|
| + "x = x + (x = 100) + (x = 101);\n"
|
| + "return x;",
|
| + 4 * kPointerSize,
|
| + 1,
|
| + 24,
|
| + {
|
| + B(LdaSmi8), U8(55), //
|
| + B(Star), R(0), //
|
| + B(LdaSmi8), U8(100), //
|
| + B(Star), R(1), //
|
| + B(Add), R(0), //
|
| + B(Star), R(2), //
|
| + B(LdaSmi8), U8(101), //
|
| + B(Star), R(3), //
|
| + B(Add), R(2), //
|
| + B(Mov), R(3), R(0), //
|
| + B(Star), R(0), //
|
| + B(Return), //
|
| + },
|
| + 0},
|
| + {"var x = 55;\n"
|
| + "x = (x = 56) - x + (x = 57);\n"
|
| + "x++;\n"
|
| + "return x;",
|
| + 3 * kPointerSize,
|
| + 1,
|
| + 34,
|
| + {
|
| + B(LdaSmi8), U8(55), //
|
| + B(Star), R(0), //
|
| + B(LdaSmi8), U8(56), //
|
| + B(Star), R(0), //
|
| + B(Star), R(1), //
|
| + B(Ldar), R(0), //
|
| + B(Sub), R(1), //
|
| + B(Star), R(2), //
|
| + B(LdaSmi8), U8(57), //
|
| + B(Star), R(1), //
|
| + B(Add), R(2), //
|
| + B(Mov), R(1), R(0), //
|
| + B(Star), R(0), //
|
| + B(ToNumber), //
|
| + B(Star), R(1), //
|
| + B(Inc), //
|
| + B(Star), R(0), //
|
| + B(Return), //
|
| + },
|
| + 0},
|
| + {"var x = 55;\n"
|
| + "var y = x + (x = 1) + (x = 2) + (x = 3);\n"
|
| + "return y;",
|
| + 6 * kPointerSize,
|
| + 1,
|
| + 32,
|
| + {
|
| + B(LdaSmi8), U8(55), //
|
| + B(Star), R(0), //
|
| + B(LdaSmi8), U8(1), //
|
| + B(Star), R(2), //
|
| + B(Add), R(0), //
|
| + B(Star), R(3), //
|
| + B(LdaSmi8), U8(2), //
|
| + B(Star), R(4), //
|
| + B(Add), R(3), //
|
| + B(Star), R(5), //
|
| + B(LdaSmi8), U8(3), //
|
| + B(Star), R(3), //
|
| + B(Add), R(5), //
|
| + B(Mov), R(3), R(0), //
|
| + B(Star), R(1), //
|
| + B(Return), //
|
| + },
|
| + 0},
|
| + {"var x = 55;\n"
|
| + "var x = x + (x = 1) + (x = 2) + (x = 3);\n"
|
| + "return x;",
|
| + 5 * kPointerSize,
|
| + 1,
|
| + 32,
|
| + {
|
| + B(LdaSmi8), U8(55), //
|
| + B(Star), R(0), //
|
| + B(LdaSmi8), U8(1), //
|
| + B(Star), R(1), //
|
| + B(Add), R(0), //
|
| + B(Star), R(2), //
|
| + B(LdaSmi8), U8(2), //
|
| + B(Star), R(3), //
|
| + B(Add), R(2), //
|
| + B(Star), R(4), //
|
| + B(LdaSmi8), U8(3), //
|
| + B(Star), R(2), //
|
| + B(Add), R(4), //
|
| + B(Mov), R(2), R(0), //
|
| + B(Star), R(0), //
|
| + B(Return), //
|
| + },
|
| + 0},
|
| + {"var x = 10, y = 20;\n"
|
| + "return x + (x = 1) + (x + 1) * (y = 2) + (y = 3) + (x = 4) + (y = 5) + "
|
| + "y;\n",
|
| + 6 * kPointerSize,
|
| + 1,
|
| + 64,
|
| + {
|
| + B(LdaSmi8), U8(10), //
|
| + B(Star), R(0), //
|
| + B(LdaSmi8), U8(20), //
|
| + B(Star), R(1), //
|
| + B(LdaSmi8), U8(1), //
|
| + B(Star), R(2), //
|
| + B(Add), R(0), //
|
| + B(Star), R(3), //
|
| + B(LdaSmi8), U8(1), //
|
| + B(Add), R(2), //
|
| + B(Star), R(4), //
|
| + B(LdaSmi8), U8(2), //
|
| + B(Star), R(1), //
|
| + B(Mul), R(4), //
|
| + B(Add), R(3), //
|
| + B(Star), R(4), //
|
| + B(LdaSmi8), U8(3), //
|
| + B(Star), R(1), //
|
| + B(Add), R(4), //
|
| + B(Star), R(3), //
|
| + B(LdaSmi8), U8(4), //
|
| + B(Star), R(4), //
|
| + B(Add), R(3), //
|
| + B(Star), R(5), //
|
| + B(LdaSmi8), U8(5), //
|
| + B(Star), R(1), //
|
| + B(Add), R(5), //
|
| + B(Star), R(3), //
|
| + B(Ldar), R(1), //
|
| + B(Add), R(3), //
|
| + B(Mov), R(4), R(0), //
|
| + B(Return), //
|
| + },
|
| + 0},
|
| + {"var x = 17;\n"
|
| + "return 1 + x + (x++) + (++x);\n",
|
| + 5 * kPointerSize,
|
| + 1,
|
| + 40,
|
| + {
|
| + B(LdaSmi8), U8(17), //
|
| + B(Star), R(0), //
|
| + B(LdaSmi8), U8(1), //
|
| + B(Star), R(1), //
|
| + B(Ldar), R(0), //
|
| + B(Add), R(1), //
|
| + B(Star), R(2), //
|
| + B(Ldar), R(0), //
|
| + B(ToNumber), //
|
| + B(Star), R(1), //
|
| + B(Inc), //
|
| + B(Star), R(3), //
|
| + B(Ldar), R(1), //
|
| + B(Add), R(2), //
|
| + B(Star), R(4), //
|
| + B(Ldar), R(3), //
|
| + B(ToNumber), //
|
| + B(Inc), //
|
| + B(Star), R(1), //
|
| + B(Add), R(4), //
|
| + B(Mov), R(1), R(0), //
|
| + B(Return), //
|
| + },
|
| + 0}};
|
| +
|
| + 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
|
| } // namespace v8
|
|
|