CastTest.java (791:2199365892b1) | CastTest.java (1006:95fc7fd39be2) |
---|---|
1/* 2 * Copyright (c) 2010, 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 * --- 28 unchanged lines hidden (view full) --- 37 38import static com.sun.tools.javac.code.Flags.*; 39 40/** 41 * Check invariants in cast conversion involving primitive types and arrays 42 */ 43public class CastTest extends TypeHarness { 44 | 1/* 2 * Copyright (c) 2010, 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 * --- 28 unchanged lines hidden (view full) --- 37 38import static com.sun.tools.javac.code.Flags.*; 39 40/** 41 * Check invariants in cast conversion involving primitive types and arrays 42 */ 43public class CastTest extends TypeHarness { 44 |
45 Type[] allTypes; | 45 Type[] types_no_boxing; 46 Type[] types_boxing; |
46 47 static final boolean T = true; 48 static final boolean F = false; 49 | 47 48 static final boolean T = true; 49 static final boolean F = false; 50 |
50 boolean[][] cast_result = { | 51 boolean[][] cast_result_no_boxing = { |
51 //byte, short, int, long, float, double, char, bool, C, +C, I, T, byte[], short[], int[], long[], float[], double[], char[], bool[], C[], +C[], I[], T[] 52 /*byte*/ { T , T , T , T , T , T , T , F , F, F , F, F, F , F , F , F , F , F , F , F , F , F , F , F }, 53 /*short*/ { T , T , T , T , T , T , T , F , F, F , F, F, F , F , F , F , F , F , F , F , F , F , F , F }, 54 /*int*/ { T , T , T , T , T , T , T , F , F, F , F, F, F , F , F , F , F , F , F , F , F , F , F , F }, 55 /*long*/ { T , T , T , T , T , T , T , F , F, F , F, F, F , F , F , F , F , F , F , F , F , F , F , F }, 56 /*float*/ { T , T , T , T , T , T , T , F , F, F , F, F, F , F , F , F , F , F , F , F , F , F , F , F }, 57 /*double*/ { T , T , T , T , T , T , T , F , F, F , F, F, F , F , F , F , F , F , F , F , F , F , F , F }, 58 /*char*/ { T , T , T , T , T , T , T , F , F, F , F, F, F , F , F , F , F , F , F , F , F , F , F , F }, --- 10 unchanged lines hidden (view full) --- 69 /*double[]*/{ F , F , F , F , F , F , F , F , F, F , F, T, F , F , F , F , F , T , F , F , F , F , F , F }, 70 /*char[]*/ { F , F , F , F , F , F , F , F , F, F , F, T, F , F , F , F , F , F , T , F , F , F , F , F }, 71 /*bool[]*/ { F , F , F , F , F , F , F , F , F, F , F, T, F , F , F , F , F , F , F , T , F , F , F , F }, 72 /*C[]*/ { F , F , F , F , F , F , F , F , F, F , F, T, F , F , F , F , F , F , F , F , T , F , T , T }, 73 /*+C[]*/ { F , F , F , F , F , F , F , F , F, F , F, T, F , F , F , F , F , F , F , F , F , T , F , T }, 74 /*I[]*/ { F , F , F , F , F , F , F , F , F, F , F, T, F , F , F , F , F , F , F , F , T , F , T , T }, 75 /*T[]*/ { F , F , F , F , F , F , F , F , F, F , F, T, F , F , F , F , F , F , F , F , T , T , T , T }}; 76 | 52 //byte, short, int, long, float, double, char, bool, C, +C, I, T, byte[], short[], int[], long[], float[], double[], char[], bool[], C[], +C[], I[], T[] 53 /*byte*/ { T , T , T , T , T , T , T , F , F, F , F, F, F , F , F , F , F , F , F , F , F , F , F , F }, 54 /*short*/ { T , T , T , T , T , T , T , F , F, F , F, F, F , F , F , F , F , F , F , F , F , F , F , F }, 55 /*int*/ { T , T , T , T , T , T , T , F , F, F , F, F, F , F , F , F , F , F , F , F , F , F , F , F }, 56 /*long*/ { T , T , T , T , T , T , T , F , F, F , F, F, F , F , F , F , F , F , F , F , F , F , F , F }, 57 /*float*/ { T , T , T , T , T , T , T , F , F, F , F, F, F , F , F , F , F , F , F , F , F , F , F , F }, 58 /*double*/ { T , T , T , T , T , T , T , F , F, F , F, F, F , F , F , F , F , F , F , F , F , F , F , F }, 59 /*char*/ { T , T , T , T , T , T , T , F , F, F , F, F, F , F , F , F , F , F , F , F , F , F , F , F }, --- 10 unchanged lines hidden (view full) --- 70 /*double[]*/{ F , F , F , F , F , F , F , F , F, F , F, T, F , F , F , F , F , T , F , F , F , F , F , F }, 71 /*char[]*/ { F , F , F , F , F , F , F , F , F, F , F, T, F , F , F , F , F , F , T , F , F , F , F , F }, 72 /*bool[]*/ { F , F , F , F , F , F , F , F , F, F , F, T, F , F , F , F , F , F , F , T , F , F , F , F }, 73 /*C[]*/ { F , F , F , F , F , F , F , F , F, F , F, T, F , F , F , F , F , F , F , F , T , F , T , T }, 74 /*+C[]*/ { F , F , F , F , F , F , F , F , F, F , F, T, F , F , F , F , F , F , F , F , F , T , F , T }, 75 /*I[]*/ { F , F , F , F , F , F , F , F , F, F , F, T, F , F , F , F , F , F , F , F , T , F , T , T }, 76 /*T[]*/ { F , F , F , F , F , F , F , F , F, F , F, T, F , F , F , F , F , F , F , F , T , T , T , T }}; 77 |
78 boolean[][] cast_result_boxing = { 79 //byte, short, int, long, float, double, char, bool, Byte, Short, Integer, Long, Float, Double, Character, Boolean, Object 80 /*byte*/ { T , T , T , T , T , T , T , F , T , F , F , F , F , F , F , F , T }, 81 /*short*/ { T , T , T , T , T , T , T , F , F , T , F , F , F , F , F , F , T }, 82 /*int*/ { T , T , T , T , T , T , T , F , F , F , T , F , F , F , F , F , T }, 83 /*long*/ { T , T , T , T , T , T , T , F , F , F , F , T , F , F , F , F , T }, 84 /*float*/ { T , T , T , T , T , T , T , F , F , F , F , F , T , F , F , F , T }, 85 /*double*/ { T , T , T , T , T , T , T , F , F , F , F , F , F , T , F , F , T }, 86 /*char*/ { T , T , T , T , T , T , T , F , F , F , F , F , F , F , T , F , T }, 87 /*bool*/ { F , F , F , F , F , F , F , T , F , F , F , F , F , F , F , T , T }, 88 /*Byte*/ { T , T , T , T , T , T , F , F , T , F , F , F , F , F , F , F , T }, 89 /*Short*/ { F , T , T , T , T , T , F , F , F , T , F , F , F , F , F , F , T }, 90 /*Integer*/ { F , F , T , T , T , T , F , F , F , F , T , F , F , F , F , F , T }, 91 /*Long*/ { F , F , F , T , T , T , F , F , F , F , F , T , F , F , F , F , T }, 92 /*Float*/ { F , F , F , F , T , T , F , F , F , F , F , F , T , F , F , F , T }, 93 /*Double*/ { F , F , F , F , F , T , F , F , F , F , F , F , F , T , F , F , T }, 94 /*Character*/ { F , F , T , T , T , T , T , F , F , F , F , F , F , F , T , F , T }, 95 /*Boolean*/ { F , F , F , F , F , F , F , T , F , F , F , F , F , F , F , T , T }, 96 /*Object*/ { T , T , T , T , T , T , T , T , T , T , T , T , T , T , T , T , T }}; |
|
77 CastTest() { 78 Type[] primitiveTypes = { 79 predef.byteType, 80 predef.shortType, 81 predef.intType, 82 predef.longType, 83 predef.floatType, 84 predef.doubleType, 85 predef.charType, 86 predef.booleanType }; 87 | 97 CastTest() { 98 Type[] primitiveTypes = { 99 predef.byteType, 100 predef.shortType, 101 predef.intType, 102 predef.longType, 103 predef.floatType, 104 predef.doubleType, 105 predef.charType, 106 predef.booleanType }; 107 |
108 Type[] boxedTypes = new Type[primitiveTypes.length + 1]; 109 for (int i = 0 ; i < primitiveTypes.length ; i++) { 110 boxedTypes[i] = box(primitiveTypes[i]); 111 } 112 113 boxedTypes[primitiveTypes.length] = predef.objectType; 114 115 types_boxing = join(Type.class, primitiveTypes, boxedTypes); 116 |
|
88 Type[] referenceTypes = { 89 fac.Class(), 90 fac.Class(FINAL), 91 fac.Interface(), 92 fac.TypeVariable() }; 93 94 Type[] arrayTypes = new Type[primitiveTypes.length + referenceTypes.length]; 95 int idx = 0; 96 for (Type t : join(Type.class, primitiveTypes, referenceTypes)) { 97 arrayTypes[idx++] = fac.Array(t); 98 } 99 | 117 Type[] referenceTypes = { 118 fac.Class(), 119 fac.Class(FINAL), 120 fac.Interface(), 121 fac.TypeVariable() }; 122 123 Type[] arrayTypes = new Type[primitiveTypes.length + referenceTypes.length]; 124 int idx = 0; 125 for (Type t : join(Type.class, primitiveTypes, referenceTypes)) { 126 arrayTypes[idx++] = fac.Array(t); 127 } 128 |
100 allTypes = join(Type.class, primitiveTypes, referenceTypes, arrayTypes); | 129 types_no_boxing = join(Type.class, primitiveTypes, referenceTypes, arrayTypes); |
101 } 102 | 130 } 131 |
103 void test() { 104 for (int i = 0; i < allTypes.length ; i++) { 105 for (int j = 0; j < allTypes.length ; j++) { 106 assertCastable(allTypes[i], allTypes[j], cast_result[i][j]); | 132 void test(Type[] all_types, boolean[][] cast_result) { 133 for (int i = 0; i < all_types.length ; i++) { 134 for (int j = 0; j < all_types.length ; j++) { 135 assertCastable(all_types[i], all_types[j], cast_result[i][j]); |
107 } 108 } 109 } 110 | 136 } 137 } 138 } 139 |
140 void runTests() { 141 test(types_no_boxing, cast_result_no_boxing); 142 test(types_boxing, cast_result_boxing); 143 } 144 |
|
111 @SuppressWarnings("unchecked") 112 <T> T[] join(Class<T> type, T[]... args) { 113 int totalLength = 0; 114 for (T[] arr : args) { 115 totalLength += arr.length; 116 } 117 T[] new_arr = (T[])Array.newInstance(type, totalLength); 118 int idx = 0; 119 for (T[] arr : args) { 120 System.arraycopy(arr, 0, new_arr, idx, arr.length); 121 idx += arr.length; 122 } 123 return new_arr; 124 } 125 126 public static void main(String[] args) { | 145 @SuppressWarnings("unchecked") 146 <T> T[] join(Class<T> type, T[]... args) { 147 int totalLength = 0; 148 for (T[] arr : args) { 149 totalLength += arr.length; 150 } 151 T[] new_arr = (T[])Array.newInstance(type, totalLength); 152 int idx = 0; 153 for (T[] arr : args) { 154 System.arraycopy(arr, 0, new_arr, idx, arr.length); 155 idx += arr.length; 156 } 157 return new_arr; 158 } 159 160 public static void main(String[] args) { |
127 new CastTest().test(); | 161 new CastTest().runTests(); |
128 } 129} | 162 } 163} |