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