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