1 /*
2  * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.
8  *
9  * This code is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12  * version 2 for more details (a copy is included in the LICENSE file that
13  * accompanied this code).
14  *
15  * You should have received a copy of the GNU General Public License version
16  * 2 along with this work; if not, write to the Free Software Foundation,
17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18  *
19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20  * or visit www.oracle.com if you need additional information or have any
21  * questions.
22  */
23 
24 package compiler.types.correctness.scenarios;
25 
26 import compiler.types.correctness.hierarchies.TypeHierarchy;
27 import jdk.test.lib.Asserts;
28 
29 /**
30  * Tests instanceof
31  */
32 public class ClassInstanceOf<T extends TypeHierarchy.I> extends Scenario<T, Integer> {
ClassInstanceOf(ProfilingType profilingType, TypeHierarchy<? extends T, ? extends T> hierarchy)33     public ClassInstanceOf(ProfilingType profilingType,
34                            TypeHierarchy<? extends T, ? extends T> hierarchy) {
35         super("ClassInstanceOf", profilingType, hierarchy);
36     }
37 
38     @Override
run(T obj)39     public Integer run(T obj) {
40         switch (profilingType) {
41             case RETURN:
42                 T t = collectReturnType(obj);
43                 if (t instanceof TypeHierarchy.A) {
44                     return inlinee(t);
45                 }
46                 return TypeHierarchy.TEMP;
47             case ARGUMENTS:
48                 field = obj;
49                 if (field instanceof TypeHierarchy.A) {
50                     return inlinee(field);
51                 }
52                 return TypeHierarchy.TEMP;
53             case PARAMETERS:
54                 if (obj instanceof TypeHierarchy.A) {
55                     return inlinee(obj);
56                 }
57                 return TypeHierarchy.TEMP;
58         }
59         throw new RuntimeException("Should not reach here");
60     }
61 
inlinee(T obj)62     public int inlinee(T obj) {
63         return obj.m();
64     }
65 
66     @Override
check(Integer result, T orig)67     public void check(Integer result, T orig) {
68         if (orig instanceof TypeHierarchy.A) {
69             Asserts.assertEquals(result, orig.m(), "Results are not equal for TypeHierarchy.A");
70         } else {
71             Asserts.assertEquals(result, TypeHierarchy.TEMP, "Result differs from expected");
72         }
73     }
74 }
75