blob: 694e947aae3f6eb3457621d0e3ebfabac005f552 [file] [log] [blame]
/*
* Copyright (c) 2003, 2018, 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.
*/
package nsk.jvmti.PopFrame;
import nsk.share.Wicket;
import java.io.PrintStream;
/**
* This is auxiliary tested class
*/
public class popframe003p extends Thread {
static final int PASSED = 0;
static final int FAILED = 2;
private PrintStream out;
private boolean DEBUG_MODE;
public static volatile int totRes = PASSED;
public static Object barrier = new Object();
public Wicket startingBarrier;
// dummy global static fields
static public byte bytePubStatGlFld = 1;
static public short shortPubStatGlFld = 2;
static public int intPubStatGlFld = 3;
static public long longPubStatGlFld = 4L;
static public float floatPubStatGlFld = 5.1F;
static public double doublePubStatGlFld = 6.2D;
static public char charPubStatGlFld = 'a';
static public boolean booleanPubStatGlFld = false;
static public String strPubStatGlFld = "static global field";
// dummy instance fields
byte byteGlFld = 11;
short shortGlFld = 22;
int intGlFld = 33;
long longGlFld = 44L;
private float floatGlFld = 55F;
double doubleGlFld = 66D;
char charGlFld = 'c';
boolean booleanGlFld = true;
String strGlFld = "instance field";
Object objGl = this;
// dummy public instance fields
public byte bytePubGlFld = 0;
public short shortPubGlFld = -2;
public int intPubGlFld = -3;
public long longPubGlFld = -4L;
public float floatPubGlFld = -5.1F;
public double doublePubGlFld = -6.2D;
public char charPubGlFld = 'e';
public boolean booleanPubGlFld = false;
public String strPubGlFld = "public instance field";
private popFrameCls popframeCls;
popframe003p(String name, PrintStream out, boolean verbose) {
super(name);
this.out = out;
DEBUG_MODE = verbose;
startingBarrier = new Wicket();
popframeCls = new popFrameCls();
}
public void run() {
popframeCls.activeMeth(1, Long.MAX_VALUE,
Double.MIN_VALUE, 'c', false);
/* check that any changes for the global instance fields,
* which occurred in the called method, remain
*/
if (byteGlFld != 1 || shortGlFld != 2 ||
intGlFld != 3 || longGlFld != 4L ||
floatGlFld != 5.1F || doubleGlFld != 6.2D ||
charGlFld != 'd' || booleanGlFld != false ||
!strGlFld.equals("nstnc fld") || !objGl.equals(Integer.valueOf("1973")) ||
bytePubGlFld != 7 || shortPubGlFld != 8 ||
intPubGlFld != 9 || longPubGlFld != -10L ||
floatPubGlFld != -11F || doublePubGlFld != -12D ||
charPubGlFld != 'z' || booleanPubGlFld != false ||
strPubGlFld != null) {
out.println("TEST FAILED: changes for the instance fields of a class,\n" +
"\twhich have been made in the popped frame's method, did not remain:\n" +
"\tinstance fields values:\n\t\tbyteGlFld=" +
byteGlFld + "\texpected: 1\n" +
"\t\tshortGlFld=" + shortGlFld + "\texpected: 2\n" +
"\t\tintGlFld=" + intGlFld + "\texpected: 3\n" +
"\t\tlongGlFld=" + longGlFld + "\texpected: 4\n" +
"\t\tfloatGlFld=" + floatGlFld + "\texpected: 5.1\n" +
"\t\tdoubleGlFld=" + doubleGlFld + "\texpected: 6.2\n" +
"\t\tcharGlFld='" + charGlFld + "'\texpected: 'd'\n" +
"\t\tbooleanGlFld=" + booleanGlFld + "\texpected: false\n" +
"\t\tstrGlFld=\"" + strGlFld + "\"\texpected: \"nstnc fld\"\n" +
"\t\tobjGl=\"" + objGl.toString() + "\"\texpected: \"123\"\n" +
"\tpublic instance fields values:\n\t\tbytePubGlFld=" +
bytePubGlFld + "\texpected: 2\n" +
"\t\tshortPubGlFld=" + shortPubGlFld + "\texpected: 3\n" +
"\t\tintPubGlFld=" + intPubGlFld + "\texpected: 4\n" +
"\t\tlongPubGlFld=" + longPubGlFld + "\texpected: 5\n" +
"\t\tfloatPubGlFld=" + floatPubGlFld + "\texpected: 6.2\n" +
"\t\tdoublePubGlFld=" + doublePubGlFld + "\texpected: 7.35\n" +
"\t\tcharPubGlFld='" + charPubGlFld + "'\texpected: 'b'\n" +
"\t\tbooleanPubGlFld=" + booleanPubGlFld + "\texpected: true\n" +
"\t\tstrPubGlFld=\"" + strPubGlFld + "\"\texpected: null\n");
totRes = FAILED;
} else if (DEBUG_MODE)
out.println("Check #5 PASSED: changes for the instance fields of a class,\n" +
"\twhich have been made in the popped frame's method, remained\n" +
"popframe003p (" + this + "): exiting...");
}
class popFrameCls {
// dummy popFrameCls fields
protected byte bytePubFld = 10;
public short shortPubFld = 20;
public int intPubFld = 30;
public long longPubFld = 40L;
public float floatPubFld = 50.1F;
public double doublePubFld = 60.2D;
public char charPubFld = 'b';
public boolean booleanPubFld = true;
protected String strPubFld = "static field";
// flag to notify when exit from 'while' loop in activeMeth method
public volatile boolean popFrameHasBeenDone = false;
void activeMeth(int i, long l, double d, char c, boolean b) {
boolean compl = true;
if (popFrameHasBeenDone) { // popping has been done
if (DEBUG_MODE)
out.println("popframe003p (" + this +
"): enter activeMeth() after popping");
/* check that any changes for the arguments,
* which occurred in the called method, remain
*/
if (i != 2 || l != Long.MIN_VALUE ||
d != Double.MAX_VALUE || c != 'c' || b != true) {
out.println("TEST FAILED: changes for the arguments of " +
"the popped frame's method, did not remain\n" +
"\tcurrent argument values: i=" + i + " l=" + l +
" d=" + d + " c='" + c + "'\n");
totRes = FAILED;
} else if (DEBUG_MODE)
out.println("Check #3 PASSED: changes for the arguments of " +
"the popped frame's method, remained\n");
/* check that any changes for the class fields,
* which occurred in the called method, remain
*/
if (bytePubFld != 0 || shortPubFld != 0 ||
intPubFld != 0 || longPubFld != 0L ||
floatPubFld != 0F || doublePubFld != 0D ||
charPubFld != ' ' || booleanPubFld != false ||
!strPubFld.equals("static fld")) {
out.println("TEST FAILED: changes for the fields of an inner class,\n" +
"\twhich have been made in the popped frame's method, did not remain:\n" +
"\tstatic fields values:\n\t\tbytePubFld=" + bytePubFld + "\texpected: 0\n" +
"\t\tshortPubFld=" + shortPubFld + "\texpected: 0\n" +
"\t\tintPubFld=" + intPubFld + "\texpected: 0\n" +
"\t\tlongPubFld=" + longPubFld + "\texpected: 0\n" +
"\t\tfloatPubFld=" + floatPubFld + "\texpected: 0\n" +
"\t\tdoublePubFld=" + doublePubFld + "\texpected: 0\n" +
"\t\tcharPubFld='" + charPubFld + "'\texpected: ' '\n" +
"\t\tbooleanPubFld=" + booleanPubFld + "\texpected: false\n" +
"\t\tstrPubFld=\"" + strPubFld + "\"\texpected: \"static fld\"\n");
totRes = FAILED;
} else if (DEBUG_MODE)
out.println("Check #4 PASSED: changes for the fields of an inner class,\n" +
"\twhich have been made in the popped frame's method, remained\n" +
"popframe003p (" + this + "): exiting...\n");
return;
}
// make some variable changes:
// for the arguments
i = 2;
l = Long.MIN_VALUE;
d = Double.MAX_VALUE;
b = true;
// for the global static fields
bytePubStatGlFld = 2;
shortPubStatGlFld = 3;
intPubStatGlFld = 4;
longPubStatGlFld = 5L;
floatPubStatGlFld = 6.2F;
doublePubStatGlFld = 7.35D;
charPubStatGlFld = 'b';
booleanPubStatGlFld = true;
strPubStatGlFld = "sttc glbl fld";
// for the global instance fields
byteGlFld = 1;
shortGlFld = 2;
intGlFld = 3;
longGlFld = 4L;
floatGlFld = 5.1F;
doubleGlFld = 6.2D;
charGlFld = 'd';
booleanGlFld = false;
strGlFld = "nstnc fld";
objGl = new Integer(1973);
// for the global public instance fields
bytePubGlFld = 7;
shortPubGlFld = 8;
intPubGlFld = 9;
longPubGlFld = -10L;
floatPubGlFld = -11F;
doublePubGlFld = -12D;
charPubGlFld = 'z';
booleanPubGlFld = false;
strPubGlFld = null;
// for the popFrameCls public fields
bytePubFld = 0;
shortPubFld = 0;
intPubFld = 0;
longPubFld = 0L;
floatPubFld = 0F;
doublePubFld = 0D;
charPubFld = ' ';
booleanPubFld = false;
strPubFld = "static fld";
try {
// notify the main thread about readiness
synchronized (barrier) {
if (DEBUG_MODE)
out.println("popFrameCls (" + this +
"): notifying main thread");
startingBarrier.unlock();
if (DEBUG_MODE)
out.println("popFrameCls (" + this +
"): inside activeMethod()");
}
// loop until the main thread pops us
int ii = 0;
int n = 1000;
while (!popFrameHasBeenDone) {
if (n <= 0) {
n = 1000;
}
if (ii > n) {
ii = 0;
n--;
}
ii++;
}
// popping has been done
out.println("TEST FAILED: a tested frame has not been really popped");
totRes = FAILED;
compl = false;
} catch (Exception e) {
out.println("FAILURE: popframe003p (" + this + "): caught " + e);
totRes = FAILED;
compl = false;
} finally {
if (compl) {
out.println("TEST FAILED: finally block was executed after PopFrame()");
totRes = FAILED;
}
}
}
}
public void popFrameHasBeenDone() {
popframeCls.popFrameHasBeenDone = true;
}
}