/*
* Copyright (c) 2013, 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 4386002 4429245
* @summary Test fix for: Incorrect values reported for some locals of type long
* @author Tim Bell
*
* @run build TestScaffold VMConnection TargetListener TargetAdapter
* @run compile -g FetchLocals.java
* @run driver FetchLocals
*/
import com.sun.jdi.*;
import com.sun.jdi.event.*;
import java.util.*;
class FetchLocalsDebugee {
public long testMethod() {
short s = 12345;
int i = 8675309;
boolean pt = true;
long w = 973230999L;
byte b = 0x3b;
long x = w * 1000L;
char c = '\u005A'; // 005A = "Z"
long y = 22;
float f = 6.66f;
double d = 7.77;
System.out.print("pt is: ");
System.out.println(pt);
System.out.print("b is: ");
System.out.println(b);
System.out.print("c is: ");
System.out.println(c);
System.out.print("s is: ");
System.out.println(s);
System.out.print("i is: ");
System.out.println(i);
System.out.print("w is: ");
System.out.print(w);
System.out.print(" (0x");
System.out.print(Long.toHexString(w));
System.out.println(")");
System.out.print("x is: ");
System.out.print(x);
System.out.print(" (0x");
System.out.print(Long.toHexString(x));
System.out.println(")");
System.out.print("y is: ");
System.out.print(y);
System.out.print(" (0x");
System.out.print(Long.toHexString(y));
System.out.println(")");
System.out.print("f is: ");
System.out.println(f);
System.out.print("d is: ");
System.out.println(d);
System.out.println(); // This is FetchLocals::LINE
if (w == 0xde00ad00be00ef00L) {
System.out.print ("The debugger was here. w modified to: 0x");
System.out.println(Long.toHexString(w));
} else {
System.out.print ("w contains : 0x");
System.out.println(Long.toHexString(w));
}
System.out.println();
return x;
}
public static void main(String[] args) {
System.out.print ("FetchLocalsDebugee");
System.out.println(" Starting up...");
FetchLocalsDebugee my = new FetchLocalsDebugee ();
long result = my.testMethod();
System.out.print ("testMethod() returned: ");
System.out.print (result);
System.out.print (" (0x");
System.out.print (Long.toHexString(result));
System.out.println(")");
System.out.print ("FetchLocalsDebugee");
System.out.println(" Shutting down...");
}
}
public class FetchLocals extends TestScaffold {
static final int LINE = 86;
FetchLocals (String args[]) {
super(args);
}
public static void main(String[] args)
throws Exception
{
new FetchLocals (args).startTests();
}
/** Express a 64 bit double as a hex string
*/
private static String hexify(double d) {
long bits = Double.doubleToLongBits(d);
return (" (0x" + java.lang.Long.toHexString(bits) + ")");
}
/** Express a 32 bit float as a hex string
*/
private static String hexify(float f) {
int bits = Float.floatToIntBits(f);
return (" (0x" + java.lang.Integer.toHexString(bits) + ")");
}
protected void test(String name, BooleanValue testV, boolean expectV)
throws Exception
{
if (testV.value() != expectV) {
System.out.println("Error for " + name + " = " + testV.value() +
" should be: " + expectV);
testFailed = true;
} else {
System.out.print ("Tested OK: ");
System.out.print (name);
System.out.print (" = ");
System.out.println(expectV);
}
}
protected void test(String name, ByteValue testV, byte expectV)
throws Exception
{
if (testV.value() != expectV) {
System.out.println("Error for " + name + " = " + testV.value() +
" should be: " + expectV);
testFailed = true;
} else {
System.out.print ("Tested OK: ");
System.out.print (name);
System.out.print (" = ");
System.out.println(expectV);
}
}
protected void test(String name, CharValue testV, char expectV)
throws Exception
{
if (testV.value() != expectV) {
System.out.println("Error for " + name + " = " + testV.value() +
" should be: " + expectV);
testFailed = true;
} else {
System.out.print ("Tested OK: ");
System.out.print (name);
System.out.print (" = ");
System.out.println(expectV);
}
}
protected void test(String name, ShortValue testV, short expectV)
throws Exception
{
if (testV.value() != expectV) {
System.out.println("Error for " + name + " = " + testV.value() +
" should be: " + expectV);
testFailed = true;
} else {
System.out.print ("Tested OK: ");
System.out.print (name);
System.out.print (" = ");
System.out.println(expectV);
}
}
protected void test(String name, IntegerValue testV, int expectV)
throws Exception
{
if (testV.value() != expectV) {
System.out.println("Error for " + name + " = " + testV.value() +
" should be: " + expectV);
testFailed = true;
} else {
System.out.print ("Tested OK: ");
System.out.print (name);
System.out.print (" = ");
System.out.println(expectV);
}
}
protected void test(String name, LongValue testV, long expectV)
throws Exception
{
if (testV.value() != expectV) {
System.out.println("Error for " + name + " = 0x" +
Long.toHexString(testV.value()) +
" should be: 0x" +
Long.toHexString(expectV));
testFailed = true;
} else {
System.out.print ("Tested OK: ");
System.out.print (name);
System.out.print (" = ");
System.out.println(expectV);
}
}
protected void test(String name, FloatValue testV, float expectV)
throws Exception
{
if (testV.value() != expectV) {
System.out.println("Error for " + name + " = " + testV.value() +
hexify(testV.value()) +
" should be: " + expectV +
hexify(expectV));
testFailed = true;
} else {
System.out.print ("Tested OK: ");
System.out.print (name);
System.out.print (" = ");
System.out.println(expectV);
}
}
protected void test(String name, DoubleValue testV, double expectV)
throws Exception
{
if (testV.value() != expectV) {
System.out.println("Error for " + name + " = " + testV.value() +
hexify(testV.value()) +
" should be: " + expectV +
hexify(expectV));
testFailed = true;
} else {
System.out.print ("Tested OK: ");
System.out.print (name);
System.out.print (" = ");
System.out.println(expectV);
}
}
protected void testLocalVariables (StackFrame sf)
throws Exception
{
/*
* Test values in the local method testMethod ():
* 1) Read current data
* 2) Test against the expected value
* 3) Set to a new value
* 4) Read again
* 5) Test against the expected value
*/
LocalVariable lv = sf.visibleVariableByName("pt");
BooleanValue booleanV = (BooleanValue) sf.getValue(lv);
test("pt", booleanV, true);
booleanV = vm().mirrorOf(false);
sf.setValue(lv, booleanV);
booleanV = (BooleanValue) sf.getValue(lv);
test("pt", booleanV, false);
lv = sf.visibleVariableByName("b");
ByteValue byteV = (ByteValue) sf.getValue(lv);
byte bTmp = 0x3b;
test("b", byteV, bTmp);
bTmp = 0x7e;
byteV = vm().mirrorOf(bTmp);
sf.setValue(lv, byteV);
byteV = (ByteValue) sf.getValue(lv);
test("b", byteV, bTmp);
lv = sf.visibleVariableByName("c");
CharValue charV = (CharValue) sf.getValue(lv);
char cTmp = '\u005A';
test("c", charV, cTmp);
cTmp = 'A';
charV = vm().mirrorOf(cTmp);
sf.setValue(lv, charV);
charV = (CharValue) sf.getValue(lv);
test("c", charV, cTmp);
lv = sf.visibleVariableByName("s");
ShortValue shortV = (ShortValue) sf.getValue(lv);
short sTmp = 12345;
test("s", shortV, sTmp);
sTmp = -32766;
shortV = vm().mirrorOf(sTmp);
sf.setValue(lv, shortV);
shortV = (ShortValue) sf.getValue(lv);
test("s", shortV, sTmp);
lv = sf.visibleVariableByName("i");
IntegerValue integerV = (IntegerValue) sf.getValue(lv);
int iTmp = 8675309;
test("i", integerV, iTmp);
iTmp = -42;
integerV = vm().mirrorOf(iTmp);
sf.setValue(lv, integerV);
integerV = (IntegerValue) sf.getValue(lv);
test("i", integerV, iTmp);
lv = sf.visibleVariableByName("w");
LongValue longV = (LongValue) sf.getValue(lv);
long wTmp = 973230999L;
test("w", longV, wTmp);
wTmp = 0xde00ad00be00ef00L;
longV = vm().mirrorOf(wTmp);
sf.setValue(lv, longV);
longV = (LongValue) sf.getValue(lv);
test("w", longV, wTmp);
lv = sf.visibleVariableByName("x");
longV = (LongValue) sf.getValue(lv);
long xTmp = 973230999L * 1000L;
test("x", longV, xTmp);
xTmp = 0xca00fe00ba00be00L;
longV = vm().mirrorOf(xTmp);
sf.setValue(lv, longV);
longV = (LongValue) sf.getValue(lv);
test("x", longV, xTmp);
lv = sf.visibleVariableByName("y");
longV = (LongValue) sf.getValue(lv);
long yTmp = 22;
test("y", longV, yTmp);
yTmp = 0xdeadbeefcafebabeL;
longV = vm().mirrorOf(yTmp);
sf.setValue(lv, longV);
longV = (LongValue) sf.getValue(lv);
test("x", longV, yTmp);
lv = sf.visibleVariableByName("f");
FloatValue floatV = (FloatValue) sf.getValue(lv);
float fTmp = 6.66f;
test("f", floatV, fTmp);
fTmp = (float)java.lang.Math.PI;
floatV = vm().mirrorOf(fTmp);
sf.setValue(lv, floatV);
floatV = (FloatValue)sf.getValue(lv);
test("f", floatV, fTmp);
lv = sf.visibleVariableByName("d");
DoubleValue doubleV = (DoubleValue) sf.getValue(lv);
double dTmp = 7.77;
test("d", doubleV, dTmp);
dTmp = java.lang.Math.E;
doubleV = vm().mirrorOf(dTmp);
sf.setValue(lv, doubleV);
doubleV = (DoubleValue) sf.getValue(lv);
test("d", doubleV, dTmp);
}
protected void runTests()
throws Exception
{
startToMain("FetchLocalsDebugee");
/*
* Get to the bottom of testMethod():
*/
try {
BreakpointEvent bpe = resumeTo("FetchLocalsDebugee", LINE);
/*
* Fetch values from fields; what did we get?
*/
StackFrame sf = bpe.thread().frame(0);
testLocalVariables (sf);
} catch(Exception ex) {
ex.printStackTrace();
testFailed = true;
} finally {
// Allow application to complete and shut down
resumeToVMDisconnect();
}
if (!testFailed) {
System.out.println("FetchLocals: passed");
} else {
throw new Exception("FetchLocals: failed");
}
}
}