| /* | |
| * Copyright (c) 2007, 2017, Oracle and/or its affiliates. All rights reserved. | |
| * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| * | |
| * This code is free software; you can redistribute it and/or modify it | |
| * under the terms of the GNU General Public License version 2 only, as | |
| * published by the Free Software Foundation. | |
| * | |
| * This code is distributed in the hope that it will be useful, but WITHOUT | |
| * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| * version 2 for more details (a copy is included in the LICENSE file that | |
| * accompanied this code). | |
| * | |
| * You should have received a copy of the GNU General Public License version | |
| * 2 along with this work; if not, write to the Free Software Foundation, | |
| * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| * | |
| * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| * or visit www.oracle.com if you need additional information or have any | |
| * questions. | |
| */ | |
| // THIS TEST IS LINE NUMBER SENSITIVE | |
| /** | |
| * @test | |
| * @bug 4359312 4450091 | |
| * @summary Test PTR 1421 JVM exceptions making a call to LocalVariable.type().name() | |
| * @author Tim Bell (based on the PTR 1421 report submitted by IBM). | |
| * | |
| * @run build TestScaffold VMConnection TargetListener TargetAdapter | |
| * @run compile -g GetLocalVariables.java | |
| * @run driver GetLocalVariables | |
| */ | |
| import com.sun.jdi.*; | |
| import com.sun.jdi.event.*; | |
| import com.sun.jdi.request.*; | |
| import java.util.*; | |
| /********** target program **********/ | |
| class GetLocalVariablesTarg { | |
| private static char s_char1 = 'a'; | |
| private static char s_char2 = (char) 0; | |
| private static char s_char3 = (char) 1; | |
| private static char s_char4 = (char) 32; | |
| private static char s_char5 = '\u7ffe'; | |
| private static char s_char6 = '\u7fff'; | |
| private static char s_char7 = '\u8000'; | |
| private static char s_char8 = '\u8001'; | |
| private static char s_char9 = '\ufffe'; | |
| private static char s_char10 = '\uffff'; | |
| private static byte s_byte1 = (byte) 146; | |
| private static byte s_byte2 = (byte) 0; | |
| private static byte s_byte3 = (byte) 1; | |
| private static byte s_byte4 = (byte) 15; | |
| private static byte s_byte5 = (byte) 127; | |
| private static byte s_byte6 = (byte) 128; | |
| private static byte s_byte7 = (byte) - 1; | |
| private static byte s_byte8 = (byte) - 15; | |
| private static byte s_byte9 = (byte) - 127; | |
| private static byte s_byte10 = (byte) - 128; | |
| private static short s_short1 = (short) 28123; | |
| private static short s_short2 = (short) 0; | |
| private static short s_short3 = (short) 1; | |
| private static short s_short4 = (short) 15; | |
| private static short s_short5 = (short) 0x7ffe; | |
| private static short s_short6 = (short) 0x7fff; | |
| private static short s_short7 = (short) -1; | |
| private static short s_short8 = (short) -15; | |
| private static short s_short9 = (short) -0x7ffe; | |
| private static short s_short10 = (short) -0x7fff; | |
| private static int s_int1 = 3101246; | |
| private static int s_int2 = 0; | |
| private static int s_int3 = 1; | |
| private static int s_int4 = 15; | |
| private static int s_int5 = 0x7ffffffe; | |
| private static int s_int6 = 0x7fffffff; | |
| private static int s_int7 = -1; | |
| private static int s_int8 = -15; | |
| private static int s_int9 = -0x7ffffffe; | |
| private static int s_int10 = -0x7fffffff; | |
| private static long s_long1 = 0x0123456789ABCDEFL; | |
| private static long s_long2 = 0; | |
| private static long s_long3 = 1; | |
| private static long s_long4 = 15; | |
| private static long s_long5 = 0x000000007fffffffL; | |
| private static long s_long6 = 0x0000000080000000L; | |
| private static long s_long7 = 0x0000000100000000L; | |
| private static long s_long8 = 0x7fffffffffffffffL; | |
| private static long s_long9 = 0x8000000000000000L; | |
| private static long s_long10 = -15; | |
| private static float s_float1 = 2.3145f; | |
| private static float s_float2 = 0f; | |
| private static double s_double1 = 1.469d; | |
| private static double s_double2 = 0; | |
| private static int s_iarray1[] = {1, 2, 3}; | |
| private static int s_iarray2[] = null; | |
| private static int s_marray1[][] = {{1, 2, 3}, {3, 4, 5}, null, {6, 7}}; | |
| private static int s_marray2[][] = null; | |
| private static String s_sarray1[] = {"abc", null, "def", "ghi"}; | |
| private static String s_sarray2[] = null; | |
| private static Object s_sarray3[] = s_sarray1; | |
| private static String s_string1 = "abcdef"; | |
| private static String s_string2 = null; | |
| private static String s_string3 = "a\u1234b\u7777"; | |
| private char i_char; | |
| private byte i_byte; | |
| private short i_short; | |
| private int i_int; | |
| private long i_long; | |
| private float i_float; | |
| private double i_double; | |
| private int i_iarray[]; | |
| private int i_marray[][]; | |
| private String i_string; | |
| public GetLocalVariablesTarg() | |
| { | |
| int index; | |
| i_char = 'B'; | |
| i_byte = 120; | |
| i_short = 12048; | |
| i_int = 0x192842; | |
| i_long = 123591230941L; | |
| i_float = 235.15e5f; | |
| i_double = 176e-1d; | |
| i_iarray = new int[5]; | |
| i_marray = new int[7][]; | |
| i_string = "empty"; | |
| for (index = 0; index < i_iarray.length; ++index) | |
| i_iarray[index] = index + 1; | |
| i_marray[0] = new int[2]; | |
| i_marray[1] = new int[4]; | |
| i_marray[2] = null; | |
| i_marray[3] = new int[1]; | |
| i_marray[4] = new int[3]; | |
| i_marray[5] = null; | |
| i_marray[6] = new int[7]; | |
| for (index = 0; index < i_marray.length; ++index) | |
| if (i_marray[index] != null) | |
| for (int index2 = 0; index2 < i_marray[index].length; ++index2) | |
| i_marray[index][index2] = index + index2; | |
| } | |
| public GetLocalVariablesTarg(char p_char, byte p_byte, short p_short, | |
| int p_int, long p_long, float p_float, | |
| double p_double, int p_iarray[], int p_marray[][], | |
| String p_string) | |
| { | |
| i_char = p_char; | |
| i_byte = p_byte; | |
| i_short = p_short; | |
| i_int = p_int; | |
| i_long = p_long; | |
| i_float = p_float; | |
| i_double = p_double; | |
| i_iarray = p_iarray; | |
| i_marray = p_marray; | |
| i_string = p_string; | |
| } | |
| public static void test_expressions() | |
| { | |
| GetLocalVariablesTarg e1 = new GetLocalVariablesTarg(); | |
| GetLocalVariablesTarg e2 = null; | |
| GetLocalVariablesTarg e3 = e1; | |
| GetLocalVariablesTarg e4 = new GetLocalVariablesTarg(s_char1, s_byte1, s_short1, s_int1, | |
| s_long1, s_float1, s_double1, | |
| s_iarray1, s_marray1, "e4"); | |
| GetLocalVariablesTarg e5 = new GetLocalVariablesTarg(s_char2, s_byte2, s_short2, s_int2, | |
| s_long2, s_float2, s_double2, | |
| s_iarray2, s_marray2, "e5"); | |
| char l_char = (char) ( | |
| s_char1 + s_char2 + s_char3 + s_char4 + s_char5 + | |
| s_char6 + s_char7 + s_char8 + s_char9 + s_char10); | |
| byte l_byte = (byte) ( | |
| s_byte1 + s_byte2 + s_byte3 + s_byte4 + s_byte5 + | |
| s_byte6 + s_byte7 + s_byte8 + s_byte9 + s_byte10); | |
| short l_short = (short) ( | |
| s_short1 + s_short2 + s_short3 + s_short4 + s_short5 + | |
| s_short6 + s_short7 + s_short8 + s_short9 + s_short10); | |
| int l_int = s_int1 + s_int2 + s_int3 + s_int4 + s_int5 + | |
| s_int6 + s_int7 + s_int8 + s_int9 + s_int10; | |
| long l_long = s_long1 + s_long2 + s_long3 + s_long4 + s_long5 + | |
| s_long6 + s_long7 + s_long8 + s_long9 + s_long10; | |
| float l_float = s_float1 + s_float2; | |
| double l_double = s_double1 + s_double2; | |
| int[] l_iarray = null; | |
| int[][] l_marray = null; | |
| String l_string = s_string1 + s_string3 + s_sarray1[0]; | |
| if (s_sarray2 == null) | |
| l_string += "?"; | |
| if (s_sarray3 instanceof String[]) | |
| l_string += "<io>"; | |
| Object e6 = new GetLocalVariablesTarg(l_char, l_byte, l_short, l_int, | |
| l_long, l_float, l_double, l_iarray, | |
| l_marray, l_string); | |
| e1.test_1(); // RESUME_TO_LINE | |
| e3.test_1(); | |
| e4.test_1(); | |
| e5.test_1(); | |
| ((GetLocalVariablesTarg) e6).test_1(); | |
| e3 = null; | |
| if (e3 == e1) | |
| e3.test_1(); | |
| e3 = e4; | |
| if (e3 == e2) | |
| e3 = e5; | |
| e3.test_1(); | |
| } | |
| public void test_1() | |
| { | |
| double l_add = i_double + i_short; | |
| long l_subtract = i_long - i_int; | |
| long l_multiply = i_byte * i_int; | |
| i_double = l_add + i_float; | |
| i_short = (short) l_subtract; | |
| i_long = l_multiply + i_byte + i_short; | |
| } | |
| public static void main(String[] args) { | |
| System.out.println("Howdy!"); | |
| test_expressions(); | |
| System.out.println("Goodbye from GetLocalVariablesTarg!"); | |
| } | |
| } | |
| /********** test program **********/ | |
| public class GetLocalVariables extends TestScaffold { | |
| static final int RESUME_TO_LINE = 222; | |
| ReferenceType targetClass; | |
| ThreadReference mainThread; | |
| GetLocalVariables (String args[]) { | |
| super(args); | |
| } | |
| public static void main(String[] args) | |
| throws Exception | |
| { | |
| new GetLocalVariables (args).startTests(); | |
| } | |
| /********** test core **********/ | |
| protected void runTests() | |
| throws Exception | |
| { | |
| /* | |
| * Get to the top of main() to determine targetClass and mainThread | |
| */ | |
| BreakpointEvent bpe = startToMain("GetLocalVariablesTarg"); | |
| targetClass = bpe.location().declaringType(); | |
| mainThread = bpe.thread(); | |
| EventRequestManager erm = vm().eventRequestManager(); | |
| bpe = resumeTo("GetLocalVariablesTarg", RESUME_TO_LINE); | |
| /* | |
| * We've arrived. Look around at some variables. | |
| */ | |
| StackFrame frame = bpe.thread().frame(0); | |
| List localVars = frame.visibleVariables(); | |
| System.out.println(" Visible variables at this point are: "); | |
| for (Iterator it = localVars.iterator(); it.hasNext();) { | |
| LocalVariable lv = (LocalVariable) it.next(); | |
| System.out.print(lv.name()); | |
| System.out.print(" typeName: "); | |
| System.out.print(lv.typeName()); | |
| System.out.print(" signature: "); | |
| System.out.print(lv.type().signature()); | |
| System.out.print(" primitive type: "); | |
| System.out.println(lv.type().name()); | |
| } | |
| /* | |
| * resume the target listening for events | |
| */ | |
| listenUntilVMDisconnect(); | |
| /* | |
| * deal with results of test if anything has called failure("foo") | |
| * testFailed will be true | |
| */ | |
| if (!testFailed) { | |
| println("GetLocalVariables: passed"); | |
| } else { | |
| throw new Exception("GetLocalVariables: failed"); | |
| } | |
| } | |
| } |