1 /** hard coded linenumbers in this test - DO NOT CHANGE 2 * @test/nodynamiccopyright/ 3 * @bug 4359312 4450091 4 * @summary Test PTR 1421 JVM exceptions making a call to LocalVariable.type().name() 5 * 6 * @author Tim Bell (based on the PTR 1421 report submitted by IBM). 7 * 8 * @run build TestScaffold VMConnection TargetListener TargetAdapter 9 * @run compile -g GetLocalVariables.java 10 * @run driver GetLocalVariables 11 */ 12 import com.sun.jdi.*; 13 import com.sun.jdi.event.*; 14 import com.sun.jdi.request.*; 15 16 import java.util.*; 17 18 /********** target program **********/ 19 20 class GetLocalVariablesTarg { 21 private static char s_char1 = 'a'; 22 private static char s_char2 = (char) 0; 23 private static char s_char3 = (char) 1; 24 private static char s_char4 = (char) 32; 25 private static char s_char5 = '\u7ffe'; 26 private static char s_char6 = '\u7fff'; 27 private static char s_char7 = '\u8000'; 28 private static char s_char8 = '\u8001'; 29 private static char s_char9 = '\ufffe'; 30 private static char s_char10 = '\uffff'; 31 32 private static byte s_byte1 = (byte) 146; 33 private static byte s_byte2 = (byte) 0; 34 private static byte s_byte3 = (byte) 1; 35 private static byte s_byte4 = (byte) 15; 36 private static byte s_byte5 = (byte) 127; 37 private static byte s_byte6 = (byte) 128; 38 private static byte s_byte7 = (byte) - 1; 39 private static byte s_byte8 = (byte) - 15; 40 private static byte s_byte9 = (byte) - 127; 41 private static byte s_byte10 = (byte) - 128; 42 43 private static short s_short1 = (short) 28123; 44 private static short s_short2 = (short) 0; 45 private static short s_short3 = (short) 1; 46 private static short s_short4 = (short) 15; 47 private static short s_short5 = (short) 0x7ffe; 48 private static short s_short6 = (short) 0x7fff; 49 private static short s_short7 = (short) -1; 50 private static short s_short8 = (short) -15; 51 private static short s_short9 = (short) -0x7ffe; 52 private static short s_short10 = (short) -0x7fff; 53 54 private static int s_int1 = 3101246; 55 private static int s_int2 = 0; 56 private static int s_int3 = 1; 57 private static int s_int4 = 15; 58 private static int s_int5 = 0x7ffffffe; 59 private static int s_int6 = 0x7fffffff; 60 private static int s_int7 = -1; 61 private static int s_int8 = -15; 62 private static int s_int9 = -0x7ffffffe; 63 private static int s_int10 = -0x7fffffff; 64 65 private static long s_long1 = 0x0123456789ABCDEFL; 66 private static long s_long2 = 0; 67 private static long s_long3 = 1; 68 private static long s_long4 = 15; 69 private static long s_long5 = 0x000000007fffffffL; 70 private static long s_long6 = 0x0000000080000000L; 71 private static long s_long7 = 0x0000000100000000L; 72 private static long s_long8 = 0x7fffffffffffffffL; 73 private static long s_long9 = 0x8000000000000000L; 74 private static long s_long10 = -15; 75 76 private static float s_float1 = 2.3145f; 77 private static float s_float2 = 0f; 78 79 private static double s_double1 = 1.469d; 80 private static double s_double2 = 0; 81 82 private static int s_iarray1[] = {1, 2, 3}; 83 private static int s_iarray2[] = null; 84 85 private static int s_marray1[][] = {{1, 2, 3}, {3, 4, 5}, null, {6, 7}}; 86 private static int s_marray2[][] = null; 87 88 private static String s_sarray1[] = {"abc", null, "def", "ghi"}; 89 private static String s_sarray2[] = null; 90 private static Object s_sarray3[] = s_sarray1; 91 92 private static String s_string1 = "abcdef"; 93 private static String s_string2 = null; 94 private static String s_string3 = "a\u1234b\u7777"; 95 96 private char i_char; 97 private byte i_byte; 98 private short i_short; 99 private int i_int; 100 private long i_long; 101 private float i_float; 102 private double i_double; 103 private int i_iarray[]; 104 private int i_marray[][]; 105 private String i_string; 106 107 public GetLocalVariablesTarg() 108 { 109 int index; 110 111 i_char = 'B'; 112 i_byte = 120; 113 i_short = 12048; 114 i_int = 0x192842; 115 i_long = 123591230941L; 116 i_float = 235.15e5f; 117 i_double = 176e-1d; 118 i_iarray = new int[5]; 119 i_marray = new int[7][]; 120 i_string = "empty"; 121 122 for (index = 0; index < i_iarray.length; ++index) 123 i_iarray[index] = index + 1; 124 125 i_marray[0] = new int[2]; 126 i_marray[1] = new int[4]; 127 i_marray[2] = null; 128 i_marray[3] = new int[1]; 129 i_marray[4] = new int[3]; 130 i_marray[5] = null; 131 i_marray[6] = new int[7]; 132 133 for (index = 0; index < i_marray.length; ++index) 134 if (i_marray[index] != null) 135 for (int index2 = 0; index2 < i_marray[index].length; ++index2) 136 i_marray[index][index2] = index + index2; 137 } 138 139 public GetLocalVariablesTarg(char p_char, byte p_byte, short p_short, 140 int p_int, long p_long, float p_float, 141 double p_double, int p_iarray[], int p_marray[][], 142 String p_string) 143 { 144 i_char = p_char; 145 i_byte = p_byte; 146 i_short = p_short; 147 i_int = p_int; 148 i_long = p_long; 149 i_float = p_float; 150 i_double = p_double; 151 i_iarray = p_iarray; 152 i_marray = p_marray; 153 i_string = p_string; 154 } 155 156 public static void test_expressions() 157 { 158 GetLocalVariablesTarg e1 = new GetLocalVariablesTarg(); 159 GetLocalVariablesTarg e2 = null; 160 GetLocalVariablesTarg e3 = e1; 161 GetLocalVariablesTarg e4 = new GetLocalVariablesTarg(s_char1, s_byte1, s_short1, s_int1, 162 s_long1, s_float1, s_double1, 163 s_iarray1, s_marray1, "e4"); 164 GetLocalVariablesTarg e5 = new GetLocalVariablesTarg(s_char2, s_byte2, s_short2, s_int2, 165 s_long2, s_float2, s_double2, 166 s_iarray2, s_marray2, "e5"); 167 168 char l_char = (char) ( 169 s_char1 + s_char2 + s_char3 + s_char4 + s_char5 + 170 s_char6 + s_char7 + s_char8 + s_char9 + s_char10); 171 byte l_byte = (byte) ( 172 s_byte1 + s_byte2 + s_byte3 + s_byte4 + s_byte5 + 173 s_byte6 + s_byte7 + s_byte8 + s_byte9 + s_byte10); 174 short l_short = (short) ( 175 s_short1 + s_short2 + s_short3 + s_short4 + s_short5 + 176 s_short6 + s_short7 + s_short8 + s_short9 + s_short10); 177 int l_int = s_int1 + s_int2 + s_int3 + s_int4 + s_int5 + 178 s_int6 + s_int7 + s_int8 + s_int9 + s_int10; 179 long l_long = s_long1 + s_long2 + s_long3 + s_long4 + s_long5 + 180 s_long6 + s_long7 + s_long8 + s_long9 + s_long10; 181 float l_float = s_float1 + s_float2; 182 double l_double = s_double1 + s_double2; 183 int[] l_iarray = null; 184 int[][] l_marray = null; 185 String l_string = s_string1 + s_string3 + s_sarray1[0]; 186 187 if (s_sarray2 == null) 188 l_string += "?"; 189 190 if (s_sarray3 instanceof String[]) 191 l_string += "<io>"; 192 193 Object e6 = new GetLocalVariablesTarg(l_char, l_byte, l_short, l_int, 194 l_long, l_float, l_double, l_iarray, 195 l_marray, l_string); 196 197 e1.test_1(); // <-- this is line 197 198 e3.test_1(); 199 e4.test_1(); 200 e5.test_1(); 201 ((GetLocalVariablesTarg) e6).test_1(); 202 203 e3 = null; 204 if (e3 == e1) 205 e3.test_1(); 206 e3 = e4; 207 if (e3 == e2) 208 e3 = e5; 209 e3.test_1(); 210 211 } 212 213 public void test_1() 214 { 215 double l_add = i_double + i_short; 216 long l_subtract = i_long - i_int; 217 long l_multiply = i_byte * i_int; 218 219 i_double = l_add + i_float; 220 i_short = (short) l_subtract; 221 i_long = l_multiply + i_byte + i_short; 222 } 223 224 public static void main(String[] args) { 225 System.out.println("Howdy!"); 226 test_expressions(); 227 System.out.println("Goodbye from GetLocalVariablesTarg!"); 228 } 229 } 230 231 /********** test program **********/ 232 233 public class GetLocalVariables extends TestScaffold { 234 ReferenceType targetClass; 235 ThreadReference mainThread; 236 237 GetLocalVariables (String args[]) { 238 super(args); 239 } 240 241 public static void main(String[] args) 242 throws Exception 243 { 244 new GetLocalVariables (args).startTests(); 245 } 246 247 /********** test core **********/ 248 249 protected void runTests() 250 throws Exception 251 { 252 /* 253 * Get to the top of main() to determine targetClass and mainThread 254 */ 255 BreakpointEvent bpe = startToMain("GetLocalVariablesTarg"); 256 targetClass = bpe.location().declaringType(); 257 mainThread = bpe.thread(); 258 EventRequestManager erm = vm().eventRequestManager(); 259 260 bpe = resumeTo("GetLocalVariablesTarg", 197); 261 /* 262 * We've arrived. Look around at some variables. 263 */ 264 StackFrame frame = bpe.thread().frame(0); 265 List localVars = frame.visibleVariables(); 266 System.out.println(" Visible variables at this point are: "); 267 for (Iterator it = localVars.iterator(); it.hasNext();) { 268 LocalVariable lv = (LocalVariable) it.next(); 269 System.out.print(lv.name()); 270 System.out.print(" typeName: "); 271 System.out.print(lv.typeName()); 272 System.out.print(" signature: "); 273 System.out.print(lv.type().signature()); 274 System.out.print(" primitive type: "); 275 System.out.println(lv.type().name()); 276 } 277 278 /* 279 * resume the target listening for events 280 */ 281 listenUntilVMDisconnect(); 282 283 /* 284 * deal with results of test if anything has called failure("foo") 285 * testFailed will be true 286 */ 287 if (!testFailed) { 288 println("GetLocalVariables: passed"); 289 } else { 290 throw new Exception("GetLocalVariables: failed"); 291 } 292 } 293 }