ObjectStampJoinTest.java revision 12651:6ef01bd40ce2
1107590Sobrien/* 2169689Skan * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. 3132718Skan * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4107590Sobrien * 5107590Sobrien * This code is free software; you can redistribute it and/or modify it 6107590Sobrien * under the terms of the GNU General Public License version 2 only, as 7132718Skan * published by the Free Software Foundation. 8107590Sobrien * 9132718Skan * This code is distributed in the hope that it will be useful, but WITHOUT 10132718Skan * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11132718Skan * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12132718Skan * version 2 for more details (a copy is included in the LICENSE file that 13107590Sobrien * accompanied this code). 14132718Skan * 15132718Skan * You should have received a copy of the GNU General Public License version 16132718Skan * 2 along with this work; if not, write to the Free Software Foundation, 17132718Skan * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18132718Skan * 19107590Sobrien * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20132718Skan * or visit www.oracle.com if you need additional information or have any 21169689Skan * questions. 22169689Skan */ 23107590Sobrienpackage org.graalvm.compiler.nodes.test; 24107590Sobrien 25169689Skanimport jdk.vm.ci.meta.JavaKind; 26107590Sobrien 27169689Skanimport org.junit.Assert; 28107590Sobrienimport org.junit.Test; 29107590Sobrien 30132718Skanimport org.graalvm.compiler.core.common.type.ObjectStamp; 31132718Skanimport org.graalvm.compiler.core.common.type.Stamp; 32132718Skanimport org.graalvm.compiler.core.common.type.StampFactory; 33169689Skanimport org.graalvm.compiler.core.common.type.TypeReference; 34132718Skanimport org.graalvm.compiler.nodes.type.StampTool; 35132718Skan 36169689Skanpublic class ObjectStampJoinTest extends AbstractObjectStampTest { 37132718Skan 38132718Skan // class A 39169689Skan // class B extends A 40169689Skan // class C extends B implements I 41132718Skan // class D extends A 42169689Skan // abstract class E extends A 43169689Skan // interface I 44169689Skan 45169689Skan @Test 46169689Skan public void testJoin0() { 47169689Skan Stamp a = StampFactory.object(getType(A.class)); 48169689Skan Stamp b = StampFactory.object(getType(B.class)); 49107590Sobrien Assert.assertEquals(b, join(a, b)); 50107590Sobrien } 51107590Sobrien 52107590Sobrien @Test 53107590Sobrien public void testJoin1() { 54107590Sobrien Stamp aNonNull = StampFactory.objectNonNull(getType(A.class)); 55117395Skan Stamp b = StampFactory.object(getType(B.class)); 56117395Skan Stamp bNonNull = StampFactory.objectNonNull(getType(B.class)); 57117395Skan Assert.assertEquals(bNonNull, join(aNonNull, b)); 58107590Sobrien } 59117395Skan 60132718Skan @Test 61132718Skan public void testJoin2() { 62169689Skan Stamp aExact = StampFactory.objectNonNull(getType(A.class).asExactReference()); 63169689Skan Stamp b = StampFactory.object(getType(B.class)); 64132718Skan Assert.assertEquals(StampFactory.empty(JavaKind.Object), join(aExact, b)); 65132718Skan } 66132718Skan 67132718Skan @Test 68132718Skan public void testJoin3() { 69132718Skan Stamp d = StampFactory.object(getType(D.class)); 70132718Skan Stamp c = StampFactory.object(getType(C.class)); 71132718Skan Assert.assertTrue(StampTool.isPointerAlwaysNull(join(c, d))); 72132718Skan } 73132718Skan 74132718Skan @Test 75132718Skan public void testJoin4() { 76132718Skan Stamp dExactNonNull = StampFactory.objectNonNull(getType(D.class)); 77169689Skan Stamp c = StampFactory.object(getType(C.class)); 78169689Skan Assert.assertEquals(StampFactory.empty(JavaKind.Object), join(c, dExactNonNull)); 79169689Skan } 80132718Skan 81132718Skan @Test 82117395Skan public void testJoin5() { 83117395Skan Stamp dExact = StampFactory.object(getType(D.class).asExactReference()); 84117395Skan Stamp c = StampFactory.object(getType(C.class)); 85117395Skan Stamp join = join(c, dExact); 86117395Skan Assert.assertTrue(StampTool.isPointerAlwaysNull(join)); 87117395Skan Assert.assertNull(StampTool.typeReferenceOrNull(join)); 88117395Skan Assert.assertFalse(StampTool.isExactType(join)); 89117395Skan } 90117395Skan 91117395Skan @Test 92132718Skan public void testJoin6() { 93132718Skan Stamp dExactNonNull = StampFactory.objectNonNull(getType(D.class).asExactReference()); 94169689Skan Stamp alwaysNull = StampFactory.alwaysNull(); 95169689Skan Stamp join = join(alwaysNull, dExactNonNull); 96169689Skan Assert.assertFalse(join.hasValues()); 97169689Skan Assert.assertFalse(StampTool.isPointerAlwaysNull(join)); 98169689Skan } 99169689Skan 100117395Skan @Test 101117395Skan public void testJoin7() { 102117395Skan Stamp aExact = StampFactory.object(getType(A.class).asExactReference()); 103117395Skan Stamp e = StampFactory.object(getType(E.class)); 104117395Skan Stamp join = join(aExact, e); 105117395Skan Assert.assertTrue(StampTool.isPointerAlwaysNull(join)); 106117395Skan Assert.assertNull(StampTool.typeReferenceOrNull(join)); 107132718Skan Assert.assertFalse(StampTool.isExactType(join)); 108132718Skan } 109132718Skan 110169689Skan @Test 111169689Skan public void testJoin8() { 112169689Skan Stamp bExact = StampFactory.objectNonNull(getType(B.class).asExactReference()); 113169689Skan Stamp dExact = StampFactory.object(getType(D.class).asExactReference()); 114132718Skan Stamp join = join(bExact, dExact); 115132718Skan Assert.assertFalse(join.hasValues()); 116169689Skan } 117169689Skan 118132718Skan @Test 119132718Skan public void testJoin9() { 120132718Skan Stamp bExact = StampFactory.object(getType(B.class).asExactReference()); 121132718Skan Stamp dExact = StampFactory.object(getType(D.class).asExactReference()); 122117395Skan Stamp join = join(bExact, dExact); 123169689Skan Assert.assertTrue(StampTool.isPointerAlwaysNull(join)); 124169689Skan Assert.assertNull(StampTool.typeReferenceOrNull(join)); 125169689Skan Assert.assertNull(StampTool.typeReferenceOrNull(join)); 126169689Skan } 127117395Skan 128117395Skan @Test 129169689Skan public void testJoinInterfaceSimple() { 130169689Skan // Tests joining of interface 131169689Skan testJoinInterface(A.class, B.class, I.class); 132117395Skan } 133169689Skan 134169689Skan @Test 135169689Skan public void testJoinInterfaceArray() { 136169689Skan // Tests joining of arrays interface 137169689Skan testJoinInterface(A[].class, B[].class, I[].class); 138169689Skan } 139169689Skan 140169689Skan @Test 141169689Skan public void testJoinInterfaceMultiArray() { 142169689Skan // Tests joining of multidimensional arrays of interface 143169689Skan testJoinInterface(A[][].class, B[][].class, I[][].class); 144169689Skan } 145169689Skan 146132718Skan private void testJoinInterface(Class<?> typeA, Class<?> typeB, Class<?> typeI) { 147132718Skan testJoinInterface0(typeA, typeI); 148169689Skan testJoinInterface1(typeA, typeI); 149169689Skan testJoinInterface2(typeB, typeI); 150107590Sobrien testJoinInterface3(typeB, typeI); 151132718Skan } 152132718Skan 153169689Skan private void testJoinInterface0(Class<?> typeA, Class<?> typeI) { 154132718Skan Stamp a = StampFactory.object(getType(typeA)); 155169689Skan Stamp i = StampFactory.object(getType(typeI)); 156107590Sobrien Assert.assertNotSame(StampFactory.empty(JavaKind.Object), join(a, i)); 157169689Skan } 158169689Skan 159169689Skan private void testJoinInterface1(Class<?> typeA, Class<?> typeI) { 160169689Skan Stamp aNonNull = StampFactory.objectNonNull(getType(typeA)); 161169689Skan Stamp i = StampFactory.object(getType(typeI)); 162169689Skan Stamp join = join(aNonNull, i); 163169689Skan Assert.assertTrue(join instanceof ObjectStamp); 164169689Skan Assert.assertTrue(((ObjectStamp) join).nonNull()); 165169689Skan } 166169689Skan 167169689Skan private void testJoinInterface2(Class<?> typeB, Class<?> typeI) { 168107590Sobrien Stamp bExact = StampFactory.objectNonNull(getType(typeB).asExactReference()); 169169689Skan Stamp i = StampFactory.object(getType(typeI)); 170169689Skan Stamp join = join(i, bExact); 171169689Skan Assert.assertEquals(StampFactory.empty(JavaKind.Object), join); 172107590Sobrien } 173169689Skan 174169689Skan private void testJoinInterface3(Class<?> typeB, Class<?> typeI) { 175169689Skan Stamp bExact = StampFactory.objectNonNull(getType(typeB).asExactReference()); 176169689Skan // Create non-trusted reference. 177107590Sobrien Stamp i = StampFactory.object(TypeReference.createWithoutAssumptions(getType(typeI).getType())); 178169689Skan Stamp join = join(i, bExact); 179107590Sobrien Assert.assertEquals(bExact, join); 180169689Skan } 181169689Skan 182169689Skan} 183169689Skan