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