Index: test/cctest/interpreter/test-source-positions.cc |
diff --git a/test/cctest/interpreter/test-source-positions.cc b/test/cctest/interpreter/test-source-positions.cc |
index 20bb4404d9cbb652c3cb934bd81a5851a6e132f7..d50bb62b2b31ca9c4de77d112dd27c0020695419 100644 |
--- a/test/cctest/interpreter/test-source-positions.cc |
+++ b/test/cctest/interpreter/test-source-positions.cc |
@@ -19,9 +19,11 @@ namespace interpreter { |
// Flags enabling optimizations that change generated bytecode array. |
// Format is <command-line flag> <flag name> <bit index> |
-#define OPTIMIZATION_FLAGS(V) \ |
- V(FLAG_ignition_reo, kUseReo, 0) \ |
- V(FLAG_ignition_peephole, kUsePeephole, 1) |
+#define OPTIMIZATION_FLAGS(V) \ |
+ V(FLAG_ignition_reo, kUseReo, 0) \ |
+ V(FLAG_ignition_peephole, kUsePeephole, 1) \ |
+ V(FLAG_ignition_filter_expression_positions, \ |
+ kUseUseFilterExpressionPositions, 2) |
#define DECLARE_BIT(_, Name, BitIndex) static const int Name = 1 << BitIndex; |
OPTIMIZATION_FLAGS(DECLARE_BIT) |
@@ -30,73 +32,89 @@ OPTIMIZATION_FLAGS(DECLARE_BIT) |
// Test cases source positions are checked for. Please ensure all |
// combinations of flags are present here. This is done manually |
// because it provides easier to comprehend failure case for humans. |
-#define TEST_CASES(V) \ |
- V(UsingReo, kUseReo) \ |
- V(UsingReoAndPeephole, kUseReo | kUsePeephole) \ |
- V(UsingPeephole, kUsePeephole) |
- |
-static const char* kTestScripts[] = { |
- "var x = (y = 3) + (x = y); return x + y;", |
- |
- "var x = 55;\n" |
- "var y = x + (x = 1) + (x = 2) + (x = 3);\n" |
- "return y;", |
- |
- "var x = 10; return x >>> 3;", |
- |
- "var x = 0; return x || (1, 2, 3);", |
- |
- "return a || (a, b, a, b, c = 5, 3); ", |
- |
- "var a = 3; var b = 4; a = b; b = a; a = b; return a;", |
- |
- "var a = 1; return [[a, 2], [a + 2]];", |
- |
- "var a = 1; if (a || a < 0) { return 1; }", |
- |
- "var b;" |
- "b = a.name;" |
- "b = a.name;" |
- "a.name = a;" |
- "b = a.name;" |
- "a.name = a;" |
- "return b;", |
- |
- "var sum = 0;\n" |
- "outer: {\n" |
- " for (var x = 0; x < 10; ++x) {\n" |
- " for (var y = 0; y < 3; ++y) {\n" |
- " ++sum;\n" |
- " if (x + y == 12) { break outer; }\n" |
- " }\n" |
- " }\n" |
- "}\n" |
- "return sum;\n", |
- |
- "var a = 1;" |
- "switch (a) {" |
- " case 1: return a * a + 1;" |
- " case 1: break;" |
- " case 2: return (a = 3) * a + (a = 4);" |
- " case 3:" |
- "}" |
- "return a;", |
- |
- "for (var p of [0, 1, 2]) {}", |
- |
- "var x = { 'a': 1, 'b': 2 };" |
- "for (x['a'] of [1,2,3]) { return x['a']; }", |
- |
- "while (x == 4) {\n" |
- " var y = x + 1;\n" |
- " if (y == 2) break;\n" |
- " for (z['a'] of [0]) {\n" |
- " x += (x *= 3) + y;" |
- " }\n" |
- "}\n", |
- |
- "function g(a, b) { return a.func(b + b, b); }\n" |
- "g(new (function Obj() { this.func = function() { return; }})(), 1)\n"}; |
+#define TEST_CASES(V) \ |
+ V(UsingReo, kUseReo) \ |
+ V(UsingPeephole, kUsePeephole) \ |
+ V(UsingReoAndPeephole, kUseReo | kUsePeephole) \ |
+ V(UsingUseFilterExpressionPositions, kUseUseFilterExpressionPositions) \ |
+ V(UsingReoAndUseFilterExpressionPositions, \ |
+ kUseReo | kUseUseFilterExpressionPositions) \ |
+ V(UsingPeepholeAndUseFilterExpressionPositions, \ |
+ kUsePeephole | kUseUseFilterExpressionPositions) \ |
+ V(UsingAllOptimizations, \ |
+ kUseReo | kUsePeephole | kUseUseFilterExpressionPositions) |
+ |
+struct TestCaseData { |
+ TestCaseData(const char* const script, |
+ const char* const declaration_parameters = "", |
+ const char* const arguments = "") |
+ : script_(script), |
+ declaration_parameters_(declaration_parameters), |
+ arguments_(arguments) {} |
+ |
+ const char* const script() const { return script_; } |
+ const char* const declaration_parameters() const { |
+ return declaration_parameters_; |
+ } |
+ const char* const arguments() const { return arguments_; } |
+ |
+ private: |
+ TestCaseData(); |
+ |
+ const char* const script_; |
+ const char* const declaration_parameters_; |
+ const char* const arguments_; |
+}; |
+ |
+static const TestCaseData kTestCaseData[] = { |
+ {"var x = (y = 3) + (x = y); return x + y;"}, |
+ {"var x = 55;\n" |
+ "var y = x + (x = 1) + (x = 2) + (x = 3);\n" |
+ "return y;"}, |
+ {"var x = 10; return x >>> 3;\n"}, |
+ {"var x = 0; return x || (1, 2, 3);\n"}, |
+ {"return a || (a, b, a, b, c = 5, 3);\n"}, |
+ {"var a = 3; var b = 4; a = b; b = a; a = b; return a;\n"}, |
+ {"var a = 1; return [[a, 2], [a + 2]];\n"}, |
+ {"var a = 1; if (a || a < 0) { return 1; }\n"}, |
+ {"var b;" |
+ "b = a.name;" |
+ "b = a.name;" |
+ "a.name = a;" |
+ "b = a.name;" |
+ "a.name = a;" |
+ "return b;"}, |
+ {"var sum = 0;\n" |
+ "outer: {\n" |
+ " for (var x = 0; x < 10; ++x) {\n" |
+ " for (var y = 0; y < 3; ++y) {\n" |
+ " ++sum;\n" |
+ " if (x + y == 12) { break outer; }\n" |
+ " }\n" |
+ " }\n" |
+ "}\n" |
+ "return sum;\n"}, |
+ {"var a = 1;" |
+ "switch (a) {" |
+ " case 1: return a * a + 1;" |
+ " case 1: break;" |
+ " case 2: return (a = 3) * a + (a = 4);" |
+ " case 3:" |
+ "}" |
+ "return a;"}, |
+ {"for (var p of [0, 1, 2]) {}"}, |
+ {"var x = { 'a': 1, 'b': 2 };" |
+ "for (x['a'] of [1,2,3]) { return x['a']; }"}, |
+ {"while (x == 4) {\n" |
+ " var y = x + 1;\n" |
+ " if (y == 2) break;\n" |
+ " for (z['a'] of [0]) {\n" |
+ " x += (x *= 3) + y;" |
+ " }\n" |
+ "}\n"}, |
+ {"function g(a, b) { return a.func(b + b, b); }\n" |
+ "g(new (function Obj() { this.func = function() { return; }})(), 1)\n"}, |
+ {"return some_global[name];", "name", "'a'"}}; |
class OptimizedBytecodeSourcePositionTester final { |
public: |
@@ -116,8 +134,8 @@ class OptimizedBytecodeSourcePositionTester final { |
} |
bool SourcePositionsMatch(int optimization_bitmap, const char* function_body, |
- const char* function_decl_params = "", |
- const char* function_args = ""); |
+ const char* function_decl_params, |
+ const char* function_args); |
private: |
Handle<BytecodeArray> MakeBytecode(int optimization_bitmap, |
@@ -220,8 +238,10 @@ void TestSourcePositionsEquivalent(int optimization_bitmap) { |
handles.main_isolate()->interpreter()->Initialize(); |
OptimizedBytecodeSourcePositionTester tester(handles.main_isolate()); |
- for (auto test_script : kTestScripts) { |
- CHECK(tester.SourcePositionsMatch(optimization_bitmap, test_script)); |
+ for (auto test_case_data : kTestCaseData) { |
+ CHECK(tester.SourcePositionsMatch( |
+ optimization_bitmap, test_case_data.script(), |
+ test_case_data.declaration_parameters(), test_case_data.arguments())); |
} |
} |