Mercurial > hg > truffle
comparison truffle/com.oracle.truffle.api.dsl.test/src/com/oracle/truffle/api/dsl/test/AssumptionsTest.java @ 22521:69e80ff8d725
Add a higher-level test checking that invalid specializations are removed before insertion.
author | Benoit Daloze <benoit.daloze@jku.at> |
---|---|
date | Fri, 18 Dec 2015 17:00:32 +0100 |
parents | 60c68f691534 |
children |
comparison
equal
deleted
inserted
replaced
22520:20ce790acc30 | 22521:69e80ff8d725 |
---|---|
23 package com.oracle.truffle.api.dsl.test; | 23 package com.oracle.truffle.api.dsl.test; |
24 | 24 |
25 import static com.oracle.truffle.api.dsl.test.TestHelper.createCallTarget; | 25 import static com.oracle.truffle.api.dsl.test.TestHelper.createCallTarget; |
26 import static com.oracle.truffle.api.dsl.test.TestHelper.getNode; | 26 import static com.oracle.truffle.api.dsl.test.TestHelper.getNode; |
27 import static org.junit.Assert.assertEquals; | 27 import static org.junit.Assert.assertEquals; |
28 import static org.junit.Assert.assertNotSame; | |
28 import static org.junit.Assert.fail; | 29 import static org.junit.Assert.fail; |
29 | 30 |
30 import java.util.HashMap; | 31 import java.util.HashMap; |
31 import java.util.Map; | 32 import java.util.Map; |
32 | 33 |
47 import com.oracle.truffle.api.dsl.test.AssumptionsTestFactory.FieldTestFactory; | 48 import com.oracle.truffle.api.dsl.test.AssumptionsTestFactory.FieldTestFactory; |
48 import com.oracle.truffle.api.dsl.test.AssumptionsTestFactory.MethodTestFactory; | 49 import com.oracle.truffle.api.dsl.test.AssumptionsTestFactory.MethodTestFactory; |
49 import com.oracle.truffle.api.dsl.test.AssumptionsTestFactory.MultipleAssumptionArraysTestFactory; | 50 import com.oracle.truffle.api.dsl.test.AssumptionsTestFactory.MultipleAssumptionArraysTestFactory; |
50 import com.oracle.truffle.api.dsl.test.AssumptionsTestFactory.MultipleAssumptionsTestFactory; | 51 import com.oracle.truffle.api.dsl.test.AssumptionsTestFactory.MultipleAssumptionsTestFactory; |
51 import com.oracle.truffle.api.dsl.test.AssumptionsTestFactory.NodeFieldTest2Factory; | 52 import com.oracle.truffle.api.dsl.test.AssumptionsTestFactory.NodeFieldTest2Factory; |
53 import com.oracle.truffle.api.dsl.test.AssumptionsTestFactory.RemoveAndCacheSpecializationTestFactory; | |
52 import com.oracle.truffle.api.dsl.test.AssumptionsTestFactory.RemoveSpecializationTestFactory; | 54 import com.oracle.truffle.api.dsl.test.AssumptionsTestFactory.RemoveSpecializationTestFactory; |
53 import com.oracle.truffle.api.dsl.test.AssumptionsTestFactory.StaticFieldTestFactory; | 55 import com.oracle.truffle.api.dsl.test.AssumptionsTestFactory.StaticFieldTestFactory; |
54 import com.oracle.truffle.api.dsl.test.TypeSystemTest.ValueNode; | 56 import com.oracle.truffle.api.dsl.test.TypeSystemTest.ValueNode; |
55 | 57 |
56 public class AssumptionsTest { | 58 public class AssumptionsTest { |
355 return false; | 357 return false; |
356 } | 358 } |
357 | 359 |
358 } | 360 } |
359 | 361 |
362 @Test | |
363 public void testAssumptionRemovesInvalidSpecializationBeforeNext() { | |
364 CallTarget root = createCallTarget(RemoveAndCacheSpecializationTestFactory.getInstance()); | |
365 RemoveAndCacheSpecializationTest node = getNode(root); | |
366 | |
367 assertEquals(1, root.call(1)); | |
368 SpecializationNode start0 = ((SpecializedNode) node).getSpecializationNode(); | |
369 assertEquals("ValidAssumptionNode_", start0.getClass().getSimpleName()); | |
370 | |
371 node.assumption1.invalidate(); | |
372 // The specialization should be removed, and a new cached entry be inserted | |
373 assertEquals(2, root.call(2)); | |
374 SpecializationNode start1 = ((SpecializedNode) node).getSpecializationNode(); | |
375 assertNotSame(start0, start1); | |
376 assertEquals("ValidAssumptionNode_", start1.getClass().getSimpleName()); | |
377 } | |
378 | |
379 @NodeChild | |
380 @SuppressWarnings("unused") | |
381 static class RemoveAndCacheSpecializationTest extends ValueNode { | |
382 | |
383 protected final Assumption assumption1 = Truffle.getRuntime().createAssumption(); | |
384 protected final Assumption assumption2 = Truffle.getRuntime().createAssumption(); | |
385 | |
386 protected Assumption assumptionForValue(int value) { | |
387 return value == 1 ? assumption1 : assumption2; | |
388 } | |
389 | |
390 @Specialization(guards = "value == cachedValue", assumptions = "assumptionForValue(cachedValue)", limit = "1") | |
391 int validAssumption(int value, @Cached("value") int cachedValue) { | |
392 return cachedValue; | |
393 } | |
394 | |
395 @Specialization | |
396 int uncached(int value) { | |
397 return -1; | |
398 } | |
399 | |
400 } | |
401 | |
360 @NodeChild | 402 @NodeChild |
361 static class ErrorIncompatibleReturnType extends ValueNode { | 403 static class ErrorIncompatibleReturnType extends ValueNode { |
362 @ExpectError("Incompatible return type int. Assumptions must be assignable to Assumption or Assumption[].") | 404 @ExpectError("Incompatible return type int. Assumptions must be assignable to Assumption or Assumption[].") |
363 @Specialization(assumptions = "3") | 405 @Specialization(assumptions = "3") |
364 static int do1(int value) { | 406 static int do1(int value) { |