OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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/compiler/js-operator.h" | 5 #include "src/compiler/js-operator.h" |
6 #include "src/compiler/opcodes.h" | 6 #include "src/compiler/opcodes.h" |
7 #include "src/compiler/operator.h" | 7 #include "src/compiler/operator.h" |
8 #include "src/compiler/operator-properties.h" | 8 #include "src/compiler/operator-properties.h" |
9 #include "test/unittests/test-utils.h" | 9 #include "test/unittests/test-utils.h" |
10 | 10 |
11 namespace v8 { | 11 namespace v8 { |
12 namespace internal { | 12 namespace internal { |
13 namespace compiler { | 13 namespace compiler { |
14 | 14 |
15 namespace { | |
16 | |
17 const LanguageMode kLanguageModes[] = {SLOPPY, STRICT, STRONG}; | |
18 | |
19 | |
20 #if GTEST_HAS_COMBINE | |
21 | |
22 template <typename T> | |
23 class JSOperatorTestWithLanguageModeAndParam | |
24 : public TestWithZone, | |
25 public ::testing::WithParamInterface<::testing::tuple<LanguageMode, T>> { | |
26 protected: | |
27 LanguageMode language_mode() const { | |
28 return ::testing::get<0>(B::GetParam()); | |
29 } | |
30 const T& GetParam() const { return ::testing::get<1>(B::GetParam()); } | |
31 | |
32 private: | |
33 typedef ::testing::WithParamInterface<::testing::tuple<LanguageMode, T>> B; | |
34 }; | |
35 | |
36 #endif // GTEST_HAS_COMBINE | |
37 | |
38 } // namespace | |
39 | |
40 | |
41 // ----------------------------------------------------------------------------- | 15 // ----------------------------------------------------------------------------- |
42 // Shared operators without language mode. | 16 // Shared operators. |
43 | 17 |
44 namespace { | 18 namespace { |
45 | 19 |
46 struct SharedOperator { | 20 struct SharedOperator { |
47 const Operator* (JSOperatorBuilder::*constructor)(); | 21 const Operator* (JSOperatorBuilder::*constructor)(); |
48 IrOpcode::Value opcode; | 22 IrOpcode::Value opcode; |
49 Operator::Properties properties; | 23 Operator::Properties properties; |
50 int value_input_count; | 24 int value_input_count; |
51 int frame_state_input_count; | 25 int frame_state_input_count; |
52 int effect_input_count; | 26 int effect_input_count; |
53 int control_input_count; | 27 int control_input_count; |
54 int value_output_count; | 28 int value_output_count; |
55 int effect_output_count; | 29 int effect_output_count; |
56 int control_output_count; | 30 int control_output_count; |
57 }; | 31 }; |
58 | 32 |
59 | |
60 const SharedOperator kSharedOperators[] = { | 33 const SharedOperator kSharedOperators[] = { |
61 #define SHARED(Name, properties, value_input_count, frame_state_input_count, \ | 34 #define SHARED(Name, properties, value_input_count, frame_state_input_count, \ |
62 effect_input_count, control_input_count, value_output_count, \ | 35 effect_input_count, control_input_count, value_output_count, \ |
63 effect_output_count, control_output_count) \ | 36 effect_output_count, control_output_count) \ |
64 { \ | 37 { \ |
65 &JSOperatorBuilder::Name, IrOpcode::kJS##Name, properties, \ | 38 &JSOperatorBuilder::Name, IrOpcode::kJS##Name, properties, \ |
66 value_input_count, frame_state_input_count, effect_input_count, \ | 39 value_input_count, frame_state_input_count, effect_input_count, \ |
67 control_input_count, value_output_count, effect_output_count, \ | 40 control_input_count, value_output_count, effect_output_count, \ |
68 control_output_count \ | 41 control_output_count \ |
69 } | 42 } |
70 SHARED(Equal, Operator::kNoProperties, 2, 1, 1, 1, 1, 1, 2), | 43 SHARED(Equal, Operator::kNoProperties, 2, 1, 1, 1, 1, 1, 2), |
71 SHARED(NotEqual, Operator::kNoProperties, 2, 1, 1, 1, 1, 1, 2), | 44 SHARED(NotEqual, Operator::kNoProperties, 2, 1, 1, 1, 1, 1, 2), |
72 SHARED(StrictEqual, Operator::kNoThrow, 2, 0, 1, 1, 1, 1, 0), | 45 SHARED(StrictEqual, Operator::kNoThrow, 2, 0, 1, 1, 1, 1, 0), |
73 SHARED(StrictNotEqual, Operator::kNoThrow, 2, 0, 1, 1, 1, 1, 0), | 46 SHARED(StrictNotEqual, Operator::kNoThrow, 2, 0, 1, 1, 1, 1, 0), |
| 47 SHARED(LessThan, Operator::kNoProperties, 2, 2, 1, 1, 1, 1, 2), |
| 48 SHARED(GreaterThan, Operator::kNoProperties, 2, 2, 1, 1, 1, 1, 2), |
| 49 SHARED(LessThanOrEqual, Operator::kNoProperties, 2, 2, 1, 1, 1, 1, 2), |
| 50 SHARED(GreaterThanOrEqual, Operator::kNoProperties, 2, 2, 1, 1, 1, 1, 2), |
74 SHARED(ToNumber, Operator::kNoProperties, 1, 1, 1, 1, 1, 1, 2), | 51 SHARED(ToNumber, Operator::kNoProperties, 1, 1, 1, 1, 1, 1, 2), |
75 SHARED(ToString, Operator::kNoProperties, 1, 1, 1, 1, 1, 1, 2), | 52 SHARED(ToString, Operator::kNoProperties, 1, 1, 1, 1, 1, 1, 2), |
76 SHARED(ToName, Operator::kNoProperties, 1, 1, 1, 1, 1, 1, 2), | 53 SHARED(ToName, Operator::kNoProperties, 1, 1, 1, 1, 1, 1, 2), |
77 SHARED(ToObject, Operator::kNoProperties, 1, 1, 1, 1, 1, 1, 2), | 54 SHARED(ToObject, Operator::kNoProperties, 1, 1, 1, 1, 1, 1, 2), |
78 SHARED(Yield, Operator::kNoProperties, 1, 0, 1, 1, 1, 1, 2), | 55 SHARED(Yield, Operator::kNoProperties, 1, 0, 1, 1, 1, 1, 2), |
79 SHARED(Create, Operator::kEliminatable, 2, 1, 1, 0, 1, 1, 0), | 56 SHARED(Create, Operator::kEliminatable, 2, 1, 1, 0, 1, 1, 0), |
80 SHARED(HasProperty, Operator::kNoProperties, 2, 1, 1, 1, 1, 1, 2), | 57 SHARED(HasProperty, Operator::kNoProperties, 2, 1, 1, 1, 1, 1, 2), |
81 SHARED(TypeOf, Operator::kEliminatable, 1, 0, 1, 0, 1, 1, 0), | 58 SHARED(TypeOf, Operator::kEliminatable, 1, 0, 1, 0, 1, 1, 0), |
82 SHARED(InstanceOf, Operator::kNoProperties, 2, 1, 1, 1, 1, 1, 2), | 59 SHARED(InstanceOf, Operator::kNoProperties, 2, 1, 1, 1, 1, 1, 2), |
83 SHARED(CreateWithContext, Operator::kNoProperties, 2, 0, 1, 1, 1, 1, 2), | 60 SHARED(CreateWithContext, Operator::kNoProperties, 2, 0, 1, 1, 1, 1, 2), |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
141 JSOperatorBuilder javascript(zone()); | 118 JSOperatorBuilder javascript(zone()); |
142 const SharedOperator& sop = GetParam(); | 119 const SharedOperator& sop = GetParam(); |
143 const Operator* op = (javascript.*sop.constructor)(); | 120 const Operator* op = (javascript.*sop.constructor)(); |
144 EXPECT_EQ(sop.properties, op->properties()); | 121 EXPECT_EQ(sop.properties, op->properties()); |
145 } | 122 } |
146 | 123 |
147 | 124 |
148 INSTANTIATE_TEST_CASE_P(JSOperatorTest, JSSharedOperatorTest, | 125 INSTANTIATE_TEST_CASE_P(JSOperatorTest, JSSharedOperatorTest, |
149 ::testing::ValuesIn(kSharedOperators)); | 126 ::testing::ValuesIn(kSharedOperators)); |
150 | 127 |
151 | |
152 // ----------------------------------------------------------------------------- | |
153 // Shared operators with language mode. | |
154 | |
155 | |
156 #if GTEST_HAS_COMBINE | |
157 | |
158 namespace { | |
159 | |
160 struct SharedOperatorWithLanguageMode { | |
161 const Operator* (JSOperatorBuilder::*constructor)(LanguageMode); | |
162 IrOpcode::Value opcode; | |
163 Operator::Properties properties; | |
164 int value_input_count; | |
165 int frame_state_input_count; | |
166 int effect_input_count; | |
167 int control_input_count; | |
168 int value_output_count; | |
169 int effect_output_count; | |
170 int control_output_count; | |
171 }; | |
172 | |
173 | |
174 const SharedOperatorWithLanguageMode kSharedOperatorsWithLanguageMode[] = { | |
175 #define SHARED(Name, properties, value_input_count, frame_state_input_count, \ | |
176 effect_input_count, control_input_count, value_output_count, \ | |
177 effect_output_count, control_output_count) \ | |
178 { \ | |
179 &JSOperatorBuilder::Name, IrOpcode::kJS##Name, properties, \ | |
180 value_input_count, frame_state_input_count, effect_input_count, \ | |
181 control_input_count, value_output_count, effect_output_count, \ | |
182 control_output_count \ | |
183 } | |
184 SHARED(LessThan, Operator::kNoProperties, 2, 2, 1, 1, 1, 1, 2), | |
185 SHARED(GreaterThan, Operator::kNoProperties, 2, 2, 1, 1, 1, 1, 2), | |
186 SHARED(LessThanOrEqual, Operator::kNoProperties, 2, 2, 1, 1, 1, 1, 2), | |
187 SHARED(GreaterThanOrEqual, Operator::kNoProperties, 2, 2, 1, 1, 1, 1, 2), | |
188 #undef SHARED | |
189 }; | |
190 | |
191 | |
192 std::ostream& operator<<(std::ostream& os, | |
193 const SharedOperatorWithLanguageMode& sop) { | |
194 return os << IrOpcode::Mnemonic(sop.opcode); | |
195 } | |
196 | |
197 } // namespace | |
198 | |
199 | |
200 class JSSharedOperatorWithLanguageModeTest | |
201 : public JSOperatorTestWithLanguageModeAndParam< | |
202 SharedOperatorWithLanguageMode> {}; | |
203 | |
204 | |
205 TEST_P(JSSharedOperatorWithLanguageModeTest, InstancesAreGloballyShared) { | |
206 const SharedOperatorWithLanguageMode& sop = GetParam(); | |
207 JSOperatorBuilder javascript1(zone()); | |
208 JSOperatorBuilder javascript2(zone()); | |
209 EXPECT_EQ((javascript1.*sop.constructor)(language_mode()), | |
210 (javascript2.*sop.constructor)(language_mode())); | |
211 } | |
212 | |
213 | |
214 TEST_P(JSSharedOperatorWithLanguageModeTest, NumberOfInputsAndOutputs) { | |
215 JSOperatorBuilder javascript(zone()); | |
216 const SharedOperatorWithLanguageMode& sop = GetParam(); | |
217 const Operator* op = (javascript.*sop.constructor)(language_mode()); | |
218 | |
219 const int context_input_count = 1; | |
220 EXPECT_EQ(sop.value_input_count, op->ValueInputCount()); | |
221 EXPECT_EQ(context_input_count, OperatorProperties::GetContextInputCount(op)); | |
222 EXPECT_EQ(sop.frame_state_input_count, | |
223 OperatorProperties::GetFrameStateInputCount(op)); | |
224 EXPECT_EQ(sop.effect_input_count, op->EffectInputCount()); | |
225 EXPECT_EQ(sop.control_input_count, op->ControlInputCount()); | |
226 EXPECT_EQ(sop.value_input_count + context_input_count + | |
227 sop.frame_state_input_count + sop.effect_input_count + | |
228 sop.control_input_count, | |
229 OperatorProperties::GetTotalInputCount(op)); | |
230 | |
231 EXPECT_EQ(sop.value_output_count, op->ValueOutputCount()); | |
232 EXPECT_EQ(sop.effect_output_count, op->EffectOutputCount()); | |
233 EXPECT_EQ(sop.control_output_count, op->ControlOutputCount()); | |
234 } | |
235 | |
236 | |
237 TEST_P(JSSharedOperatorWithLanguageModeTest, OpcodeIsCorrect) { | |
238 JSOperatorBuilder javascript(zone()); | |
239 const SharedOperatorWithLanguageMode& sop = GetParam(); | |
240 const Operator* op = (javascript.*sop.constructor)(language_mode()); | |
241 EXPECT_EQ(sop.opcode, op->opcode()); | |
242 } | |
243 | |
244 | |
245 TEST_P(JSSharedOperatorWithLanguageModeTest, Parameter) { | |
246 JSOperatorBuilder javascript(zone()); | |
247 const SharedOperatorWithLanguageMode& sop = GetParam(); | |
248 const Operator* op = (javascript.*sop.constructor)(language_mode()); | |
249 EXPECT_EQ(language_mode(), OpParameter<LanguageMode>(op)); | |
250 } | |
251 | |
252 | |
253 TEST_P(JSSharedOperatorWithLanguageModeTest, Properties) { | |
254 JSOperatorBuilder javascript(zone()); | |
255 const SharedOperatorWithLanguageMode& sop = GetParam(); | |
256 const Operator* op = (javascript.*sop.constructor)(language_mode()); | |
257 EXPECT_EQ(sop.properties, op->properties()); | |
258 } | |
259 | |
260 | |
261 INSTANTIATE_TEST_CASE_P( | |
262 JSOperatorTest, JSSharedOperatorWithLanguageModeTest, | |
263 ::testing::Combine(::testing::ValuesIn(kLanguageModes), | |
264 ::testing::ValuesIn(kSharedOperatorsWithLanguageMode))); | |
265 | |
266 #endif // GTEST_HAS_COMBINE | |
267 | |
268 } // namespace compiler | 128 } // namespace compiler |
269 } // namespace internal | 129 } // namespace internal |
270 } // namespace v8 | 130 } // namespace v8 |
OLD | NEW |