Mercurial > hg > graal-compiler
comparison graal/com.oracle.truffle.api.dsl.test/src/com/oracle/truffle/api/dsl/test/SpecializationFallthroughTest.java @ 16756:5148aab962af
Truffle-DSL: updated tests for the new generation layout.
author | Christian Humer <christian.humer@gmail.com> |
---|---|
date | Mon, 11 Aug 2014 15:53:05 +0200 |
parents | |
children | 9f38d222fa6c |
comparison
equal
deleted
inserted
replaced
16755:bd28da642eea | 16756:5148aab962af |
---|---|
1 package com.oracle.truffle.api.dsl.test; | |
2 | |
3 import static com.oracle.truffle.api.dsl.test.TestHelper.*; | |
4 | |
5 import org.junit.*; | |
6 | |
7 import com.oracle.truffle.api.dsl.*; | |
8 import com.oracle.truffle.api.dsl.test.SpecializationFallthroughTestFactory.FallthroughTest0Factory; | |
9 import com.oracle.truffle.api.dsl.test.SpecializationFallthroughTestFactory.FallthroughTest1Factory; | |
10 import com.oracle.truffle.api.dsl.test.SpecializationFallthroughTestFactory.FallthroughTest2Factory; | |
11 import com.oracle.truffle.api.dsl.test.SpecializationFallthroughTestFactory.FallthroughTest3Factory; | |
12 import com.oracle.truffle.api.dsl.test.SpecializationFallthroughTestFactory.FallthroughTest4Factory; | |
13 import com.oracle.truffle.api.dsl.test.SpecializationFallthroughTestFactory.FallthroughTest5Factory; | |
14 import com.oracle.truffle.api.dsl.test.TestHelper.ExecutionListener; | |
15 import com.oracle.truffle.api.dsl.test.TypeSystemTest.TestRootNode; | |
16 import com.oracle.truffle.api.dsl.test.TypeSystemTest.ValueNode; | |
17 | |
18 public class SpecializationFallthroughTest { | |
19 | |
20 @Test | |
21 public void testFallthrough0() { | |
22 assertRuns(FallthroughTest0Factory.getInstance(), // | |
23 array(0, 0, 1, 2), // | |
24 array(0, 0, 1, 2),// | |
25 new ExecutionListener() { | |
26 public void afterExecution(TestRootNode<? extends ValueNode> node, int index, Object value, Object expectedResult, Object actualResult, boolean last) { | |
27 if (!last) { | |
28 return; | |
29 } | |
30 if (FallthroughTest0.fallthroughCount > 1) { | |
31 Assert.fail("The fallthrough case must never be triggered twice. Therfore count must be <= 1, but is not."); | |
32 } | |
33 } | |
34 }); | |
35 } | |
36 | |
37 @NodeChildren({@NodeChild("a")}) | |
38 static class FallthroughTest0 extends ValueNode { | |
39 | |
40 static int fallthroughCount = 0; | |
41 | |
42 public FallthroughTest0() { | |
43 fallthroughCount = 0; | |
44 } | |
45 | |
46 @Specialization(rewriteOn = ArithmeticException.class) | |
47 int do1(int a) throws ArithmeticException { | |
48 if (a == 0) { | |
49 fallthroughCount++; | |
50 throw new ArithmeticException(); | |
51 } | |
52 return a; | |
53 } | |
54 | |
55 @Generic | |
56 Object doFallback(Object a) { | |
57 return a; | |
58 } | |
59 } | |
60 | |
61 /* | |
62 * Tests that the fall through is never triggered twice for monomorphic cases. | |
63 */ | |
64 @Test | |
65 public void testFallthrough1() { | |
66 assertRuns(FallthroughTest1Factory.getInstance(), // | |
67 array(0, 0, 0, 1, 2), // | |
68 array(0, 0, 0, 1, 2),// | |
69 new ExecutionListener() { | |
70 public void afterExecution(TestRootNode<? extends ValueNode> node, int index, Object value, Object expectedResult, Object actualResult, boolean last) { | |
71 if (!last) { | |
72 return; | |
73 } | |
74 if (FallthroughTest1.fallthroughCount > 1) { | |
75 Assert.fail("The fallthrough case must never be triggered twice. Therfore count must be <= 1, but is not."); | |
76 } | |
77 } | |
78 }); | |
79 } | |
80 | |
81 /* TODO assert falltrough do1 before do2 */ | |
82 @NodeChildren({@NodeChild("a")}) | |
83 static class FallthroughTest1 extends ValueNode { | |
84 | |
85 static int fallthroughCount; | |
86 | |
87 public FallthroughTest1() { | |
88 fallthroughCount = 0; | |
89 } | |
90 | |
91 @Specialization(rewriteOn = ArithmeticException.class) | |
92 int do1(int a) throws ArithmeticException { | |
93 if (a == 0) { | |
94 fallthroughCount++; | |
95 throw new ArithmeticException(); | |
96 } | |
97 return a; | |
98 } | |
99 | |
100 @Specialization | |
101 int do2(int a) { | |
102 return a; | |
103 } | |
104 | |
105 } | |
106 | |
107 /* | |
108 * Tests that the fall through is never triggered twice with two falltrhoughs in one operation. | |
109 */ | |
110 @Test | |
111 public void testFallthrough2() { | |
112 assertRuns(FallthroughTest2Factory.getInstance(), // | |
113 array(0, 0, 1, 1, 2, 2), // | |
114 array(0, 0, 1, 1, 2, 2),// | |
115 new ExecutionListener() { | |
116 public void afterExecution(TestRootNode<? extends ValueNode> node, int index, Object value, Object expectedResult, Object actualResult, boolean last) { | |
117 if (!last) { | |
118 return; | |
119 } | |
120 if (FallthroughTest2.fallthrough1 > 1) { | |
121 Assert.fail(); | |
122 } | |
123 if (FallthroughTest2.fallthrough2 > 1) { | |
124 Assert.fail(); | |
125 } | |
126 FallthroughTest2.fallthrough1 = 0; | |
127 FallthroughTest2.fallthrough2 = 0; | |
128 } | |
129 }); | |
130 } | |
131 | |
132 @NodeChildren({@NodeChild("a")}) | |
133 static class FallthroughTest2 extends ValueNode { | |
134 | |
135 static int fallthrough1; | |
136 static int fallthrough2; | |
137 | |
138 @Specialization(order = 1, rewriteOn = ArithmeticException.class) | |
139 int do1(int a) throws ArithmeticException { | |
140 if (a == 0) { | |
141 fallthrough1++; | |
142 throw new ArithmeticException(); | |
143 } | |
144 return a; | |
145 } | |
146 | |
147 @Specialization(order = 2, rewriteOn = ArithmeticException.class) | |
148 int do2(int a) throws ArithmeticException { | |
149 if (a == 1) { | |
150 fallthrough2++; | |
151 throw new ArithmeticException(); | |
152 } | |
153 return a; | |
154 } | |
155 | |
156 @Specialization | |
157 int do3(int a) { | |
158 return a; | |
159 } | |
160 } | |
161 | |
162 /* | |
163 * Tests that the fall through is never triggered twice. In this case mixed fallthrough with | |
164 * normal specializations. | |
165 */ | |
166 @Test | |
167 public void testFallthrough3() { | |
168 assertRuns(FallthroughTest3Factory.getInstance(), // | |
169 array(0, 0, 1, 1, 2, 2), // | |
170 array(0, 0, 1, 1, 2, 2),// | |
171 new ExecutionListener() { | |
172 public void afterExecution(TestRootNode<? extends ValueNode> node, int index, Object value, Object expectedResult, Object actualResult, boolean last) { | |
173 if (!last) { | |
174 return; | |
175 } | |
176 if (FallthroughTest3.fallthrough1 > 1) { | |
177 Assert.fail(String.valueOf(FallthroughTest3.fallthrough1)); | |
178 } | |
179 FallthroughTest3.fallthrough1 = 0; | |
180 } | |
181 }); | |
182 } | |
183 | |
184 @NodeChildren({@NodeChild("a")}) | |
185 static class FallthroughTest3 extends ValueNode { | |
186 | |
187 static int fallthrough1; | |
188 | |
189 boolean guard0(int a) { | |
190 return a == 1; | |
191 } | |
192 | |
193 @Specialization(guards = "guard0") | |
194 int do2(int a) { | |
195 return a; | |
196 } | |
197 | |
198 @Specialization(rewriteOn = ArithmeticException.class) | |
199 int do1(int a) throws ArithmeticException { | |
200 if (a == 0) { | |
201 fallthrough1++; | |
202 throw new ArithmeticException(); | |
203 } | |
204 return a; | |
205 } | |
206 | |
207 @Specialization | |
208 int do3(int a) { | |
209 return a; | |
210 } | |
211 | |
212 } | |
213 | |
214 @Test | |
215 public void testFallthrough4() { | |
216 assertRuns(FallthroughTest4Factory.getInstance(), // | |
217 array(0, 0, 1, 1, 2, 2), // | |
218 array(0, 0, 1, 1, 2, 2),// | |
219 new ExecutionListener() { | |
220 public void afterExecution(TestRootNode<? extends ValueNode> node, int index, Object value, Object expectedResult, Object actualResult, boolean last) { | |
221 if (!last) { | |
222 return; | |
223 } | |
224 if (FallthroughTest4.fallthrough1 > 1) { | |
225 Assert.fail(String.valueOf(FallthroughTest4.fallthrough1)); | |
226 } | |
227 if (FallthroughTest4.fallthrough2 > 1) { | |
228 Assert.fail(String.valueOf(FallthroughTest4.fallthrough1)); | |
229 } | |
230 FallthroughTest4.fallthrough1 = 0; | |
231 FallthroughTest4.fallthrough2 = 0; | |
232 } | |
233 }); | |
234 } | |
235 | |
236 @NodeChildren({@NodeChild("a")}) | |
237 static class FallthroughTest4 extends ValueNode { | |
238 | |
239 static int fallthrough1; | |
240 static int fallthrough2; | |
241 | |
242 @Specialization(order = 1, rewriteOn = ArithmeticException.class) | |
243 int do1(int a) throws ArithmeticException { | |
244 if (a == 0) { | |
245 fallthrough1++; | |
246 throw new ArithmeticException(); | |
247 } | |
248 return a; | |
249 } | |
250 | |
251 @Specialization(order = 2, rewriteOn = ArithmeticException.class) | |
252 int do2(int a) throws ArithmeticException { | |
253 if (a == 1) { | |
254 fallthrough2++; | |
255 throw new ArithmeticException(); | |
256 } | |
257 return a; | |
258 } | |
259 | |
260 @Specialization | |
261 int do3(int a) { | |
262 return a; | |
263 } | |
264 | |
265 } | |
266 | |
267 @Test | |
268 public void testFallthrough5() { | |
269 assertRuns(FallthroughTest5Factory.getInstance(), // | |
270 array(0, 0, 1, 1, 2, 2), // | |
271 array(0, 0, 1, 1, 2, 2),// | |
272 new ExecutionListener() { | |
273 public void afterExecution(TestRootNode<? extends ValueNode> node, int index, Object value, Object expectedResult, Object actualResult, boolean last) { | |
274 if (!last) { | |
275 return; | |
276 } | |
277 if (FallthroughTest5.fallthrough1 > 1) { | |
278 Assert.fail(String.valueOf(FallthroughTest5.fallthrough1)); | |
279 } | |
280 FallthroughTest5.fallthrough1 = 0; | |
281 } | |
282 }); | |
283 } | |
284 | |
285 @NodeChildren({@NodeChild("a")}) | |
286 static class FallthroughTest5 extends ValueNode { | |
287 | |
288 static int fallthrough1; | |
289 | |
290 @Specialization(guards = "isDo1", rewriteOn = ArithmeticException.class) | |
291 int do1(int a) throws ArithmeticException { | |
292 if (a == 0) { | |
293 fallthrough1++; | |
294 throw new ArithmeticException(); | |
295 } | |
296 return a; | |
297 } | |
298 | |
299 protected static boolean isDo1(int a) { | |
300 return a == 0 || a == 1; | |
301 } | |
302 | |
303 @Specialization(guards = "isDo1") | |
304 int do2(int a) { | |
305 return a; | |
306 } | |
307 | |
308 @Specialization | |
309 int do3(int a) { | |
310 return a; | |
311 } | |
312 | |
313 } | |
314 | |
315 @NodeChildren({@NodeChild("a")}) | |
316 static class FallthroughTest6 extends ValueNode { | |
317 | |
318 static int fallthrough1; | |
319 static int fallthrough2; | |
320 static int fallthrough3; | |
321 static int fallthrough4; | |
322 | |
323 @Specialization(order = 1, rewriteOn = ArithmeticException.class) | |
324 int do4(int a) throws ArithmeticException { | |
325 return a; | |
326 } | |
327 | |
328 @Specialization(order = 2, rewriteOn = ArithmeticException.class) | |
329 int do2(int a) throws ArithmeticException { | |
330 return a; | |
331 } | |
332 | |
333 @Specialization(order = 3, rewriteOn = ArithmeticException.class) | |
334 int do3(int a) throws ArithmeticException { | |
335 return a; | |
336 } | |
337 | |
338 @Specialization(order = 4, rewriteOn = ArithmeticException.class) | |
339 int do1(int a) throws ArithmeticException { | |
340 return a; | |
341 } | |
342 | |
343 @Specialization | |
344 double do5(double a) { | |
345 return a; | |
346 } | |
347 | |
348 } | |
349 | |
350 } |