| /* |
| * 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; |
| } |
| } |