OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #include "src/compiler/pipeline.h" | 7 #include "src/compiler/pipeline.h" |
8 #include "src/handles.h" | 8 #include "src/handles.h" |
9 #include "src/interpreter/bytecode-generator.h" | 9 #include "src/interpreter/bytecode-generator.h" |
10 #include "src/interpreter/interpreter.h" | 10 #include "src/interpreter/interpreter.h" |
11 #include "src/isolate.h" | 11 #include "src/isolate.h" |
12 #include "src/parsing/parser.h" | 12 #include "src/parsing/parser.h" |
13 #include "test/cctest/cctest.h" | 13 #include "test/cctest/cctest.h" |
14 #include "test/cctest/interpreter/source-position-matcher.h" | 14 #include "test/cctest/interpreter/source-position-matcher.h" |
15 | 15 |
16 namespace v8 { | 16 namespace v8 { |
17 namespace internal { | 17 namespace internal { |
18 namespace interpreter { | 18 namespace interpreter { |
19 | 19 |
20 // Flags enabling optimizations that change generated bytecode array. | 20 // Flags enabling optimizations that change generated bytecode array. |
21 // Format is <command-line flag> <flag name> <bit index> | 21 // Format is <command-line flag> <flag name> <bit index> |
22 #define OPTIMIZATION_FLAGS(V) \ | 22 #define OPTIMIZATION_FLAGS(V) \ |
23 V(FLAG_ignition_reo, kUseReo, 0) \ | 23 V(FLAG_ignition_reo, kUseReo, 0) \ |
24 V(FLAG_ignition_peephole, kUsePeephole, 1) \ | 24 V(FLAG_ignition_peephole, kUsePeephole, 1) \ |
25 V(FLAG_ignition_filter_expression_positions, \ | 25 V(FLAG_ignition_filter_expression_positions, kUseFilterExpressionPositions, \ |
26 kUseUseFilterExpressionPositions, 2) | 26 2) \ |
| 27 V(FLAG_ignition_deadcode, kUseDeadCode, 3) |
27 | 28 |
28 #define DECLARE_BIT(_, Name, BitIndex) static const int Name = 1 << BitIndex; | 29 #define DECLARE_BIT(_, Name, BitIndex) static const int Name = 1 << BitIndex; |
29 OPTIMIZATION_FLAGS(DECLARE_BIT) | 30 OPTIMIZATION_FLAGS(DECLARE_BIT) |
30 #undef DECLARE_BIT | 31 #undef DECLARE_BIT |
31 | 32 |
32 // Test cases source positions are checked for. Please ensure all | 33 // Test cases source positions are checked for. Please ensure all |
33 // combinations of flags are present here. This is done manually | 34 // combinations of flags are present here. This is done manually |
34 // because it provides easier to comprehend failure case for humans. | 35 // because it provides easier to comprehend failure case for humans. |
35 #define TEST_CASES(V) \ | 36 #define TEST_CASES(V) \ |
36 V(UsingReo, kUseReo) \ | 37 V(UsingReo, kUseReo) \ |
37 V(UsingPeephole, kUsePeephole) \ | 38 V(UsingPeephole, kUsePeephole) \ |
38 V(UsingReoAndPeephole, kUseReo | kUsePeephole) \ | 39 V(UsingDeadCode, kUseDeadCode) \ |
39 V(UsingUseFilterExpressionPositions, kUseUseFilterExpressionPositions) \ | 40 V(UsingFilterExpressionPositions, kUseFilterExpressionPositions) \ |
40 V(UsingReoAndUseFilterExpressionPositions, \ | 41 V(UsingReoAndPeephole, kUseReo | kUsePeephole) \ |
41 kUseReo | kUseUseFilterExpressionPositions) \ | 42 V(UsingReoAndFilterExpressionPositions, \ |
42 V(UsingPeepholeAndUseFilterExpressionPositions, \ | 43 kUseReo | kUseFilterExpressionPositions) \ |
43 kUsePeephole | kUseUseFilterExpressionPositions) \ | 44 V(UsingReoAndDeadCode, kUseReo | kUseDeadCode) \ |
44 V(UsingAllOptimizations, \ | 45 V(UsingPeepholeAndFilterExpressionPositions, \ |
45 kUseReo | kUsePeephole | kUseUseFilterExpressionPositions) | 46 kUsePeephole | kUseFilterExpressionPositions) \ |
| 47 V(UsingPeepholeAndDeadCode, kUsePeephole | kUseDeadCode) \ |
| 48 V(UsingFilterExpressionPositionsAndDeadCode, \ |
| 49 kUseFilterExpressionPositions | kUseDeadCode) \ |
| 50 V(UsingAllOptimizations, \ |
| 51 kUseReo | kUsePeephole | kUseFilterExpressionPositions | kUseDeadCode) |
46 | 52 |
47 struct TestCaseData { | 53 struct TestCaseData { |
48 TestCaseData(const char* const script, | 54 TestCaseData(const char* const script, |
49 const char* const declaration_parameters = "", | 55 const char* const declaration_parameters = "", |
50 const char* const arguments = "") | 56 const char* const arguments = "") |
51 : script_(script), | 57 : script_(script), |
52 declaration_parameters_(declaration_parameters), | 58 declaration_parameters_(declaration_parameters), |
53 arguments_(arguments) {} | 59 arguments_(arguments) {} |
54 | 60 |
55 const char* const script() const { return script_; } | 61 const char* const script() const { return script_; } |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
135 | 141 |
136 bool SourcePositionsMatch(int optimization_bitmap, const char* function_body, | 142 bool SourcePositionsMatch(int optimization_bitmap, const char* function_body, |
137 const char* function_decl_params, | 143 const char* function_decl_params, |
138 const char* function_args); | 144 const char* function_args); |
139 | 145 |
140 private: | 146 private: |
141 Handle<BytecodeArray> MakeBytecode(int optimization_bitmap, | 147 Handle<BytecodeArray> MakeBytecode(int optimization_bitmap, |
142 const char* function_body, | 148 const char* function_body, |
143 const char* function_decl_params, | 149 const char* function_decl_params, |
144 const char* function_args); | 150 const char* function_args); |
145 static std::string MakeFunctionName(int optimization_bitmap); | 151 static std::string MakeScript(const char* function_body, |
146 static std::string MakeScript(const char* function_name, | |
147 const char* function_body, | |
148 const char* function_decl_params, | 152 const char* function_decl_params, |
149 const char* function_args); | 153 const char* function_args); |
150 | 154 |
151 void SetOptimizationFlags(int optimization_bitmap); | 155 void SetOptimizationFlags(int optimization_bitmap); |
152 void SaveOptimizationFlags(); | 156 void SaveOptimizationFlags(); |
153 void RestoreOptimizationFlags(); | 157 void RestoreOptimizationFlags(); |
154 | 158 |
155 Isolate* isolate() const { return isolate_; } | 159 Isolate* isolate() const { return isolate_; } |
156 | 160 |
157 Isolate* isolate_; | 161 Isolate* isolate_; |
158 int saved_optimization_bitmap_; | 162 int saved_optimization_bitmap_; |
159 bool saved_flag_ignition_; | 163 bool saved_flag_ignition_; |
160 bool saved_flag_always_opt_; | 164 bool saved_flag_always_opt_; |
161 }; | 165 }; |
162 | 166 |
163 // static | 167 // static |
164 std::string OptimizedBytecodeSourcePositionTester::MakeFunctionName( | 168 std::string OptimizedBytecodeSourcePositionTester::MakeScript( |
165 int optimization_bitmap) { | 169 const char* function_body, const char* function_decl_params, |
| 170 const char* function_args) { |
166 std::ostringstream os; | 171 std::ostringstream os; |
167 os << "test_function_" << optimization_bitmap; | 172 os << "function test_function" |
168 return os.str(); | 173 << "(" << function_decl_params << ") {"; |
169 } | |
170 | |
171 // static | |
172 std::string OptimizedBytecodeSourcePositionTester::MakeScript( | |
173 const char* function_name, const char* function_body, | |
174 const char* function_decl_params, const char* function_args) { | |
175 std::ostringstream os; | |
176 os << "function " << function_name << "(" << function_decl_params << ") {"; | |
177 os << function_body; | 174 os << function_body; |
178 os << "}"; | 175 os << "}"; |
179 os << function_name << "(" << function_args << ");"; | 176 os << "test_function(" << function_args << ");"; |
180 return os.str(); | 177 return os.str(); |
181 } | 178 } |
182 | 179 |
183 Handle<BytecodeArray> OptimizedBytecodeSourcePositionTester::MakeBytecode( | 180 Handle<BytecodeArray> OptimizedBytecodeSourcePositionTester::MakeBytecode( |
184 int optimization_bitmap, const char* function_body, | 181 int optimization_bitmap, const char* function_body, |
185 const char* function_decl_params, const char* function_args) { | 182 const char* function_decl_params, const char* function_args) { |
186 std::string function_name = MakeFunctionName(optimization_bitmap); | 183 std::string script = |
187 std::string script = MakeScript(function_name.c_str(), function_body, | 184 MakeScript(function_body, function_decl_params, function_args); |
188 function_decl_params, function_args); | |
189 SetOptimizationFlags(optimization_bitmap); | 185 SetOptimizationFlags(optimization_bitmap); |
190 CompileRun(script.c_str()); | 186 CompileRun(script.c_str()); |
191 | 187 |
192 Local<Function> api_function = | 188 Local<Function> api_function = Local<Function>::Cast( |
193 Local<Function>::Cast(CcTest::global() | 189 CcTest::global() |
194 ->Get(CcTest::isolate()->GetCurrentContext(), | 190 ->Get(CcTest::isolate()->GetCurrentContext(), v8_str("test_function")) |
195 v8_str(function_name.c_str())) | 191 .ToLocalChecked()); |
196 .ToLocalChecked()); | |
197 Handle<JSFunction> function = | 192 Handle<JSFunction> function = |
198 Handle<JSFunction>::cast(v8::Utils::OpenHandle(*api_function)); | 193 Handle<JSFunction>::cast(v8::Utils::OpenHandle(*api_function)); |
199 return handle(function->shared()->bytecode_array()); | 194 return handle(function->shared()->bytecode_array()); |
200 } | 195 } |
201 | 196 |
202 void OptimizedBytecodeSourcePositionTester::SetOptimizationFlags( | 197 void OptimizedBytecodeSourcePositionTester::SetOptimizationFlags( |
203 int optimization_bitmap) { | 198 int optimization_bitmap) { |
204 #define SET_FLAG(V8Flag, BitName, _) \ | 199 #define SET_FLAG(V8Flag, BitName, _) \ |
205 V8Flag = (optimization_bitmap & BitName) ? true : false; | 200 V8Flag = (optimization_bitmap & BitName) ? true : false; |
206 OPTIMIZATION_FLAGS(SET_FLAG) | 201 OPTIMIZATION_FLAGS(SET_FLAG) |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
248 #define MAKE_TEST(Name, Bitmap) \ | 243 #define MAKE_TEST(Name, Bitmap) \ |
249 TEST(TestSourcePositionsEquivalent##Name) { \ | 244 TEST(TestSourcePositionsEquivalent##Name) { \ |
250 TestSourcePositionsEquivalent(Bitmap); \ | 245 TestSourcePositionsEquivalent(Bitmap); \ |
251 } | 246 } |
252 TEST_CASES(MAKE_TEST) | 247 TEST_CASES(MAKE_TEST) |
253 #undef MAKE_TEST | 248 #undef MAKE_TEST |
254 | 249 |
255 } // namespace interpreter | 250 } // namespace interpreter |
256 } // namespace internal | 251 } // namespace internal |
257 } // namespace v8 | 252 } // namespace v8 |
OLD | NEW |