1/*
2 * Copyright (c) 2013, 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 4386002 4429245
29 * @summary Test fix for: Incorrect values reported for some locals of type long
30 * @author Tim Bell
31 *
32 * @run build TestScaffold VMConnection TargetListener TargetAdapter
33 * @run compile -g FetchLocals.java
34 * @run driver FetchLocals
35 */
36import com.sun.jdi.*;
37import com.sun.jdi.event.*;
38import java.util.*;
39
40class FetchLocalsDebugee {
41    public long testMethod() {
42        short s = 12345;
43        int i = 8675309;
44        boolean pt = true;
45        long w = 973230999L;
46        byte b = 0x3b;
47        long x = w * 1000L;
48        char c = '\u005A';      // 005A = "Z"
49        long y = 22;
50        float f = 6.66f;
51        double d = 7.77;
52
53        System.out.print("pt is: ");
54        System.out.println(pt);
55        System.out.print("b is: ");
56        System.out.println(b);
57        System.out.print("c is: ");
58        System.out.println(c);
59        System.out.print("s is: ");
60        System.out.println(s);
61        System.out.print("i is: ");
62        System.out.println(i);
63
64        System.out.print("w is: ");
65        System.out.print(w);
66        System.out.print("     (0x");
67        System.out.print(Long.toHexString(w));
68        System.out.println(")");
69
70        System.out.print("x is: ");
71        System.out.print(x);
72        System.out.print("  (0x");
73        System.out.print(Long.toHexString(x));
74        System.out.println(")");
75
76        System.out.print("y is: ");
77        System.out.print(y);
78        System.out.print("            (0x");
79        System.out.print(Long.toHexString(y));
80        System.out.println(")");
81
82        System.out.print("f is: ");
83        System.out.println(f);
84        System.out.print("d is: ");
85        System.out.println(d);
86        System.out.println();   // This is FetchLocals::LINE
87        if (w == 0xde00ad00be00ef00L) {
88          System.out.print  ("The debugger was here.  w modified to: 0x");
89          System.out.println(Long.toHexString(w));
90        } else {
91          System.out.print  ("w contains : 0x");
92          System.out.println(Long.toHexString(w));
93        }
94        System.out.println();
95        return x;
96    }
97    public static void main(String[] args) {
98        System.out.print  ("FetchLocalsDebugee");
99        System.out.println(" Starting up...");
100        FetchLocalsDebugee my = new FetchLocalsDebugee ();
101        long result = my.testMethod();
102        System.out.print  ("testMethod() returned: ");
103        System.out.print  (result);
104        System.out.print  (" (0x");
105        System.out.print  (Long.toHexString(result));
106        System.out.println(")");
107
108        System.out.print  ("FetchLocalsDebugee");
109        System.out.println(" Shutting down...");
110    }
111}
112
113public class FetchLocals extends TestScaffold {
114    static final int LINE = 86;
115
116    FetchLocals (String args[]) {
117        super(args);
118    }
119
120    public static void main(String[] args)
121        throws Exception
122    {
123        new FetchLocals (args).startTests();
124    }
125
126    /** Express a 64 bit double as a hex string
127      */
128    private static String hexify(double d) {
129        long bits = Double.doubleToLongBits(d);
130        return (" (0x" + java.lang.Long.toHexString(bits) + ")");
131    }
132    /** Express a 32 bit float as a hex string
133      */
134    private static String hexify(float f) {
135        int bits = Float.floatToIntBits(f);
136        return (" (0x" + java.lang.Integer.toHexString(bits) + ")");
137    }
138
139    protected void test(String name, BooleanValue testV, boolean expectV)
140        throws Exception
141    {
142        if (testV.value() != expectV) {
143            System.out.println("Error for " + name + " = " + testV.value() +
144                                 " should be: " + expectV);
145            testFailed = true;
146        } else {
147            System.out.print  ("Tested OK: ");
148            System.out.print  (name);
149            System.out.print  (" = ");
150            System.out.println(expectV);
151        }
152    }
153
154    protected void test(String name, ByteValue testV, byte expectV)
155        throws Exception
156    {
157        if (testV.value() != expectV) {
158            System.out.println("Error for " + name + " = " + testV.value() +
159                                 " should be: " + expectV);
160            testFailed = true;
161        } else {
162            System.out.print  ("Tested OK: ");
163            System.out.print  (name);
164            System.out.print  (" = ");
165            System.out.println(expectV);
166        }
167    }
168
169    protected void test(String name, CharValue testV, char expectV)
170        throws Exception
171    {
172        if (testV.value() != expectV) {
173            System.out.println("Error for " + name + " = " + testV.value() +
174                                 " should be: " + expectV);
175            testFailed = true;
176        } else {
177            System.out.print  ("Tested OK: ");
178            System.out.print  (name);
179            System.out.print  (" = ");
180            System.out.println(expectV);
181        }
182    }
183
184    protected void test(String name, ShortValue testV, short expectV)
185        throws Exception
186    {
187        if (testV.value() != expectV) {
188            System.out.println("Error for " + name + " = " + testV.value() +
189                                 " should be: " + expectV);
190            testFailed = true;
191        } else {
192            System.out.print  ("Tested OK: ");
193            System.out.print  (name);
194            System.out.print  (" = ");
195            System.out.println(expectV);
196        }
197    }
198
199    protected void test(String name, IntegerValue testV, int expectV)
200        throws Exception
201    {
202        if (testV.value() != expectV) {
203            System.out.println("Error for " + name + " = " + testV.value() +
204                                 " should be: " + expectV);
205            testFailed = true;
206        } else {
207            System.out.print  ("Tested OK: ");
208            System.out.print  (name);
209            System.out.print  (" = ");
210            System.out.println(expectV);
211        }
212    }
213
214    protected void test(String name, LongValue testV, long expectV)
215        throws Exception
216    {
217        if (testV.value() != expectV) {
218            System.out.println("Error for " + name + " = 0x" +
219                                 Long.toHexString(testV.value()) +
220                                 " should be: 0x" +
221                                 Long.toHexString(expectV));
222            testFailed = true;
223        } else {
224            System.out.print  ("Tested OK: ");
225            System.out.print  (name);
226            System.out.print  (" = ");
227            System.out.println(expectV);
228        }
229    }
230
231    protected void test(String name, FloatValue testV, float expectV)
232        throws Exception
233    {
234        if (testV.value() != expectV) {
235            System.out.println("Error for " + name + " = " + testV.value() +
236                               hexify(testV.value()) +
237                               " should be: " + expectV +
238                               hexify(expectV));
239            testFailed = true;
240        } else {
241            System.out.print  ("Tested OK: ");
242            System.out.print  (name);
243            System.out.print  (" = ");
244            System.out.println(expectV);
245        }
246    }
247
248    protected void test(String name, DoubleValue testV, double expectV)
249        throws Exception
250    {
251        if (testV.value() != expectV) {
252            System.out.println("Error for " + name + " = " + testV.value() +
253                               hexify(testV.value()) +
254                               " should be: " + expectV +
255                               hexify(expectV));
256            testFailed = true;
257        } else {
258            System.out.print  ("Tested OK: ");
259            System.out.print  (name);
260            System.out.print  (" = ");
261            System.out.println(expectV);
262        }
263    }
264
265    protected void testLocalVariables (StackFrame sf)
266        throws Exception
267    {
268        /*
269         * Test values in the local method testMethod ():
270         *   1) Read current data
271         *   2) Test against the expected value
272         *   3) Set to a new value
273         *   4) Read again
274         *   5) Test against the expected value
275         */
276        LocalVariable lv = sf.visibleVariableByName("pt");
277        BooleanValue booleanV = (BooleanValue) sf.getValue(lv);
278        test("pt", booleanV, true);
279        booleanV = vm().mirrorOf(false);
280        sf.setValue(lv, booleanV);
281        booleanV = (BooleanValue) sf.getValue(lv);
282        test("pt", booleanV, false);
283
284        lv = sf.visibleVariableByName("b");
285        ByteValue byteV = (ByteValue) sf.getValue(lv);
286        byte bTmp = 0x3b;
287        test("b", byteV, bTmp);
288        bTmp = 0x7e;
289        byteV = vm().mirrorOf(bTmp);
290        sf.setValue(lv, byteV);
291        byteV = (ByteValue) sf.getValue(lv);
292        test("b", byteV, bTmp);
293
294        lv = sf.visibleVariableByName("c");
295        CharValue charV = (CharValue) sf.getValue(lv);
296        char cTmp = '\u005A';
297        test("c", charV, cTmp);
298        cTmp = 'A';
299        charV = vm().mirrorOf(cTmp);
300        sf.setValue(lv, charV);
301        charV = (CharValue) sf.getValue(lv);
302        test("c", charV, cTmp);
303
304        lv = sf.visibleVariableByName("s");
305        ShortValue shortV = (ShortValue) sf.getValue(lv);
306        short sTmp = 12345;
307        test("s", shortV, sTmp);
308        sTmp = -32766;
309        shortV = vm().mirrorOf(sTmp);
310        sf.setValue(lv, shortV);
311        shortV = (ShortValue) sf.getValue(lv);
312        test("s", shortV, sTmp);
313
314        lv = sf.visibleVariableByName("i");
315        IntegerValue integerV = (IntegerValue) sf.getValue(lv);
316        int iTmp = 8675309;
317        test("i", integerV, iTmp);
318        iTmp = -42;
319        integerV = vm().mirrorOf(iTmp);
320        sf.setValue(lv, integerV);
321        integerV = (IntegerValue) sf.getValue(lv);
322        test("i", integerV, iTmp);
323
324        lv = sf.visibleVariableByName("w");
325        LongValue longV = (LongValue) sf.getValue(lv);
326        long wTmp = 973230999L;
327        test("w", longV, wTmp);
328        wTmp = 0xde00ad00be00ef00L;
329        longV = vm().mirrorOf(wTmp);
330        sf.setValue(lv, longV);
331        longV = (LongValue) sf.getValue(lv);
332        test("w", longV, wTmp);
333
334        lv = sf.visibleVariableByName("x");
335        longV = (LongValue) sf.getValue(lv);
336        long xTmp = 973230999L * 1000L;
337        test("x", longV, xTmp);
338        xTmp = 0xca00fe00ba00be00L;
339        longV = vm().mirrorOf(xTmp);
340        sf.setValue(lv, longV);
341        longV = (LongValue) sf.getValue(lv);
342        test("x", longV, xTmp);
343
344        lv = sf.visibleVariableByName("y");
345        longV = (LongValue) sf.getValue(lv);
346        long yTmp = 22;
347        test("y", longV, yTmp);
348        yTmp = 0xdeadbeefcafebabeL;
349        longV = vm().mirrorOf(yTmp);
350        sf.setValue(lv, longV);
351        longV = (LongValue) sf.getValue(lv);
352        test("x", longV, yTmp);
353
354        lv = sf.visibleVariableByName("f");
355        FloatValue floatV = (FloatValue) sf.getValue(lv);
356        float fTmp = 6.66f;
357        test("f", floatV, fTmp);
358        fTmp = (float)java.lang.Math.PI;
359        floatV = vm().mirrorOf(fTmp);
360        sf.setValue(lv, floatV);
361        floatV = (FloatValue)sf.getValue(lv);
362        test("f", floatV, fTmp);
363
364        lv = sf.visibleVariableByName("d");
365        DoubleValue doubleV = (DoubleValue) sf.getValue(lv);
366        double dTmp = 7.77;
367        test("d", doubleV, dTmp);
368        dTmp = java.lang.Math.E;
369        doubleV = vm().mirrorOf(dTmp);
370        sf.setValue(lv, doubleV);
371        doubleV = (DoubleValue) sf.getValue(lv);
372        test("d", doubleV, dTmp);
373    }
374
375    protected void runTests()
376        throws Exception
377    {
378        startToMain("FetchLocalsDebugee");
379        /*
380         * Get to the bottom of testMethod():
381         */
382        try {
383            BreakpointEvent bpe = resumeTo("FetchLocalsDebugee", LINE);
384            /*
385             * Fetch values from fields; what did we get?
386             */
387            StackFrame sf = bpe.thread().frame(0);
388            testLocalVariables (sf);
389
390        } catch(Exception ex) {
391            ex.printStackTrace();
392            testFailed = true;
393        } finally {
394            // Allow application to complete and shut down
395            resumeToVMDisconnect();
396        }
397        if (!testFailed) {
398            System.out.println("FetchLocals: passed");
399        } else {
400            throw new Exception("FetchLocals: failed");
401        }
402    }
403}
404