blob: e43c6801f0e5bf8626ef61762bdf0082284b7e58 [file] [log] [blame]
/*
* Copyright (c) 2006, 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.
*/
// THIS TEST IS LINE NUMBER SENSITIVE
package nsk.share.jpda;
import java.net.*;
import nsk.share.*;
// ForceEarlyReturnTestThread intended for testing ForceEarlyReturn functionality.
//
// ForceEarlyReturnTestThread contains test methods with different return type
// (types corresponds to subclasses of com.sun.jdi.Value or JDWP type identifiers).
// Debugger VM should set breakpoint on line log("...") and when test thread stop at breakpoint call
// forceEarlyReturn(), so instructions after breakpoint shouldn't be executed(unexpectedMethod() shouldn't be called)
// When started thread executes all test methods in order assigned in 'testedTypesNames' array.
// It is possible to run this thread in 'testThread' mode, in this mode thread check that values returned from
// test methods equals to those that should be returned through forceEarlyReturn, and no
// instructions was executed in called method after force return (finally blocks are not executed too).
// In non-testThread mode thread check that values returned from test methods was not changed.
public class ForceEarlyReturnTestThread
extends Thread
{
void VoidMethod()
{
try
{
log("in void method"); // breakpointLines[0]
}
finally
{
unexpectedMethod();
}
unexpectedMethod();
}
boolean BooleanMethod()
{
try
{
log("in boolean method"); // breakpointLines[1]
}
finally
{
unexpectedMethod();
}
unexpectedMethod();
return unexpectedBooleanValue;
}
byte ByteMethod()
{
try
{
log("in byte method"); // breakpointLines[2]
}
finally
{
unexpectedMethod();
}
unexpectedMethod();
return unexpectedByteValue;
}
short ShortMethod()
{
try
{
log("in short method"); // breakpointLines[3]
}
finally
{
unexpectedMethod();
}
unexpectedMethod();
return unexpectedShortValue;
}
char CharMethod()
{
try
{
log("in char method"); // breakpointLines[4]
}
finally
{
unexpectedMethod();
}
unexpectedMethod();
return unexpectedCharValue;
}
int IntMethod()
{
try
{
log("in int method"); // breakpointLines[5]
}
finally
{
unexpectedMethod();
}
unexpectedMethod();
return unexpectedIntValue;
}
long LongMethod()
{
try
{
log("in long method"); // breakpointLines[6]
}
finally
{
unexpectedMethod();
}
unexpectedMethod();
return unexpectedLongValue;
}
float FloatMethod()
{
try
{
log("in float method"); // breakpointLines[7]
}
finally
{
unexpectedMethod();
}
unexpectedMethod();
return unexpectedFloatValue;
}
double DoubleMethod()
{
try
{
log("in double method"); // breakpointLines[8]
}
finally
{
unexpectedMethod();
}
unexpectedMethod();
return unexpectedDoubleValue;
}
Object[] ObjectArrayMethod()
{
try
{
log("in object array method"); // breakpointLines[9]
}
finally
{
unexpectedMethod();
}
unexpectedMethod();
return unexpectedObjectArrayValue;
}
String StringMethod()
{
try
{
log("in string method"); // breakpointLines[10]
}
finally
{
unexpectedMethod();
}
unexpectedMethod();
return unexpectedStringValue;
}
Thread ThreadMethod()
{
try
{
log("in thread method"); // breakpointLines[11]
}
finally
{
unexpectedMethod();
}
unexpectedMethod();
return unexpectedThreadValue;
}
ThreadGroup ThreadGroupMethod()
{
try
{
log("in thread group method"); // breakpointLines[12]
}
finally
{
unexpectedMethod();
}
unexpectedMethod();
return unexpectedThreadGroupValue;
}
Class<?> ClassObjectMethod()
{
try
{
log("in class object method"); // breakpointLines[13]
}
finally
{
unexpectedMethod();
}
unexpectedMethod();
return unexpectedClassObjectValue;
}
ClassLoader ClassLoaderMethod()
{
try
{
log("in class loader method"); // breakpointLines[14]
}
finally
{
unexpectedMethod();
}
unexpectedMethod();
return unexpectedClassLoaderValue;
}
Object ObjectMethod()
{
try
{
log("in object method"); // breakpointLines[15]
}
finally
{
unexpectedMethod();
}
unexpectedMethod();
return unexpectedObjectValue;
}
Boolean BooleanWrapperMethod()
{
try
{
log("in boolean wrapper method"); // breakpointLines[16]
}
finally
{
unexpectedMethod();
}
unexpectedMethod();
return unexpectedBooleanWrapperValue;
}
Byte ByteWrapperMethod()
{
try
{
log("in byte wrapper method"); // breakpointLines[17]
}
finally
{
unexpectedMethod();
}
unexpectedMethod();
return unexpectedByteWrapperValue;
}
Short ShortWrapperMethod()
{
try
{
log("in short wrapper method"); // breakpointLines[18]
}
finally
{
unexpectedMethod();
}
unexpectedMethod();
return unexpectedShortWrapperValue;
}
Character CharWrapperMethod()
{
try
{
log("in char wrapper method"); // breakpointLines[19]
}
finally
{
unexpectedMethod();
}
unexpectedMethod();
return unexpectedCharWrapperValue;
}
Integer IntWrapperMethod()
{
try
{
log("in int wrapper method"); // breakpointLines[20]
}
finally
{
unexpectedMethod();
}
unexpectedMethod();
return unexpectedIntWrapperValue;
}
Long LongWrapperMethod()
{
try
{
log("in long wrapper method"); // breakpointLines[21]
}
finally
{
unexpectedMethod();
}
unexpectedMethod();
return unexpectedLongWrapperValue;
}
Float FloatWrapperMethod()
{
try
{
log("in float wrapper method"); // breakpointLines[22]
}
finally
{
unexpectedMethod();
}
unexpectedMethod();
return unexpectedFloatWrapperValue;
}
Double DoubleWrapperMethod()
{
try
{
log("in double wrapper method"); // breakpointLines[23]
}
finally
{
unexpectedMethod();
}
unexpectedMethod();
return unexpectedDoubleWrapperValue;
}
private void log(String message)
{
log.display(currentThread().getName() + ": " + message);
}
private void logError(String message)
{
log.complain(currentThread().getName() + ": " + message);
}
// values which should be passed in forceEarlyReturn():
public static boolean expectedBooleanValue = Boolean.TRUE;
public static byte expectedByteValue = Byte.MAX_VALUE;
public static char expectedCharValue = Character.MAX_VALUE;
public static short expectedShortValue = Short.MAX_VALUE;
public static int expectedIntValue = Integer.MAX_VALUE;
public static long expectedLongValue = Long.MAX_VALUE;
public static float expectedFloatValue = Float.MAX_VALUE;
public static double expectedDoubleValue = Double.MAX_VALUE;
public static Object[] expectedObjectArrayValue = new Object[1000];
public static Thread expectedThreadValue = new Thread();
public static ThreadGroup expectedThreadGroupValue = new ThreadGroup("Expected thread group");
public static Class<?> expectedClassObjectValue = ForceEarlyReturnTestThread.class;
public static ClassLoader expectedClassLoaderValue = new URLClassLoader(new URL[]{});
public static String expectedStringValue = "EXPECTED STRING";
public static Object expectedObjectValue = new Object();
public static Boolean expectedBooleanWrapperValue = new Boolean(Boolean.TRUE);
public static Byte expectedByteWrapperValue = new Byte(Byte.MAX_VALUE);
public static Character expectedCharWrapperValue = new Character(Character.MAX_VALUE);
public static Short expectedShortWrapperValue = new Short(Short.MAX_VALUE);
public static Integer expectedIntWrapperValue = new Integer(Integer.MAX_VALUE);
public static Long expectedLongWrapperValue = new Long(Long.MAX_VALUE);
public static Float expectedFloatWrapperValue = new Float(Float.MAX_VALUE);
public static Double expectedDoubleWrapperValue = new Double(Double.MAX_VALUE);
// values which should be returned from test methods without forceEarlyReturn():
public static boolean unexpectedBooleanValue = Boolean.FALSE;
public static byte unexpectedByteValue = 0;
public static char unexpectedCharValue = 0;
public static short unexpectedShortValue = 0;
public static int unexpectedIntValue = 0;
public static long unexpectedLongValue = 0;
public static float unexpectedFloatValue = 0;
public static double unexpectedDoubleValue = 0;
public static Object[] unexpectedObjectArrayValue = new Object[1000];
public static String unexpectedStringValue = "UNEXPECTED STRING";
public static Thread unexpectedThreadValue = new Thread();
public static ThreadGroup unexpectedThreadGroupValue = new ThreadGroup("Unexpected thread group");
public static Class<?> unexpectedClassObjectValue = Object.class;
public static ClassLoader unexpectedClassLoaderValue = new URLClassLoader(new URL[]{});
public static Object unexpectedObjectValue = new Object();
public static Boolean unexpectedBooleanWrapperValue = new Boolean(Boolean.FALSE);
public static Byte unexpectedByteWrapperValue = new Byte((byte)0);
public static Character unexpectedCharWrapperValue = new Character((char)0);
public static Short unexpectedShortWrapperValue = new Short((short)0);
public static Integer unexpectedIntWrapperValue = new Integer(0);
public static Long unexpectedLongWrapperValue = new Long(0);
public static Float unexpectedFloatWrapperValue = new Float(0);
public static Double unexpectedDoubleWrapperValue = new Double(0);
public static int[] breakpointLines = {
49,
63,
79,
95,
111,
127,
143,
159,
175,
191,
207,
223,
239,
255,
271,
287,
303,
319,
335,
351,
367,
383,
399,
415};
/* Invalid data for ForceEarlyReturn, needed to check is ForceEarlyReturn complies with following part of specification:
* Object values must be assignment compatible with the method return type
* (This implies that the method return type must be loaded through the enclosing class's class loader).
* Primitive values must be either assignment compatible with the method return type or must
* be convertible to the variable type without loss of information.
*/
public static boolean invalidVoidValue = Boolean.TRUE;
public static boolean invalidObjectValue = Boolean.TRUE;
public static byte invalidBooleanValue = Byte.MAX_VALUE;
public static short invalidByteValue = Short.MAX_VALUE;
public static char invalidShortValue = Character.MAX_VALUE;
public static int invalidCharValue = Integer.MAX_VALUE;
public static long invalidIntValue = Long.MAX_VALUE;
public static float invalidLongValue = Float.MAX_VALUE;
public static double invalidFloatValue = Double.MAX_VALUE;
public static Object[] invalidDoubleValue = new Object[1000];
public static String invalidObjectArrayValue = "EXPECTED STRING";
public static Thread invalidStringValue = new Thread("Invalid thread");
public static ThreadGroup invalidThreadValue = new ThreadGroup("Invalid thread group");
public static Class<?> invalidThreadGroupValue = ForceEarlyReturnTestThread.class;
public static ClassLoader invalidClassObjectValue = new URLClassLoader(new URL[]{});
public static Object invalidClassLoaderValue = new Object();
public static Byte invalidBooleanWrapperValue = new Byte(Byte.MAX_VALUE);
public static Short invalidByteWrapperValue = new Short(Short.MAX_VALUE);
public static Character invalidShortWrapperValue = new Character(Character.MAX_VALUE);
public static Integer invalidCharWrapperValue = new Integer(Integer.MAX_VALUE);
public static Long invalidIntWrapperValue = new Long(Long.MAX_VALUE);
public static Float invalidLongWrapperValue = new Float(Float.MAX_VALUE);
public static Double invalidFloatWrapperValue = new Double(Double.MAX_VALUE);
public static Object[] invalidDoubleWrapperValue = new Object[1000];
// names of tested types, this names can be used to derive names of tested methods(typeName + 'Method'),
// names of fields containing predefined data to be returned through ForceEarlyReturn('expected' + typeName + 'Value'),
// names of fields containing invalid data for ForceEarlyReturn(needed to check is ForceEarlyReturn complies with its specification('invalid' + typeName + 'Value'))
public static String testedTypesNames[] =
{
"Void",
"Boolean",
"Byte",
"Short",
"Char",
"Int",
"Long",
"Float",
"Double",
"ObjectArray",
"String",
"Thread",
"ThreadGroup",
"ClassObject",
"ClassLoader",
"Object",
"BooleanWrapper",
"ByteWrapper",
"ShortWrapper",
"CharWrapper",
"IntWrapper",
"LongWrapper",
"FloatWrapper",
"DoubleWrapper",
};
private Log log;
// is forceEarlyReturn would called for this thread
private boolean isTestThread;
// how many times call all test methods (zero means infinite execution)
private int iterationsNumber = 1;
// test thread wait on 'startExecutionWicket' in beginning of run()
private Wicket startExecutionWicket = new Wicket();
private boolean success = true;
public ForceEarlyReturnTestThread(Log log, boolean isTestThread, int iterationNumber)
{
this.log = log;
this.isTestThread = isTestThread;
this.iterationsNumber = iterationNumber;
}
private volatile boolean stopExecution;
public void stopExecution()
{
stopExecution = true;
}
public void startExecuion()
{
startExecutionWicket.unlockAll();
}
public void run()
{
// first, debuggee VM starts and suspends test threads to let debugger initialize breakpoints
startExecutionWicket.waitFor();
int iterationCount = 0;
// test thread executes test methods 'iterationNumber' times
// non-test thread execute until not interrupted
// (iterationsNumber = 0 means infinite execution)
while(!stopExecution && (!isTestThread || ((iterationsNumber == 0) || (iterationCount++ < iterationsNumber))))
{
// execute test methods in order given in 'testMethodsNames' array
for(int i = 0; (i < testedTypesNames.length) && !stopExecution; i++)
{
executeMethod(testedTypesNames[i] + "Method");
/*
* Small delay was inserted because of if test starts several ForceEarlyReturnTestThreads
* with parameter isTestThread = false, these threads may consume too many CPU time and test
* execution will be very slow
*/
if (!isTestThread) {
try {
Thread.sleep(1);
} catch (InterruptedException e) {
logError("Unexpected exception: " + e);
e.printStackTrace(log.getOutStream());
success = false;
}
}
}
}
log("Test thread exit");
}
// execute test method and check that correct value is returned
private void executeMethod(String methodName)
{
if(methodName.equals("VoidMethod"))
{
VoidMethod();
}
if(methodName.equals("BooleanMethod"))
{
boolean result = BooleanMethod();
// log(Thread.currentThread() + ": result of " + methodName + ": " + result);
boolean expectedResult;
expectedResult = isTestThread ? expectedBooleanValue : unexpectedBooleanValue;
if(result != expectedResult)
{
logError("unexpected result of " + methodName + ": " + result + ", expected is: " + expectedResult);
success = false;
}
}
if(methodName.equals("ByteMethod"))
{
byte result = ByteMethod();
// log(Thread.currentThread() + ": result of " + methodName + ": " + result);
byte expectedResult;
expectedResult = isTestThread ? expectedByteValue : unexpectedByteValue;
if(result != expectedResult)
{
logError("unexpected result of " + methodName + ": " + result + ", expected is: " + expectedResult);
success = false;
}
}
if(methodName.equals("CharMethod"))
{
char result = CharMethod();
// log(Thread.currentThread() + ": result of " + methodName + ": " + result);
char expectedResult;
expectedResult = isTestThread ? expectedCharValue : unexpectedCharValue;
if(result != expectedResult)
{
logError("unexpected result of " + methodName + ": " + result + ", expected is: " + expectedResult);
success = false;
}
}
if(methodName.equals("ShortMethod"))
{
short result = ShortMethod();
// log(Thread.currentThread() + ": result of " + methodName + ": " + result);
short expectedResult;
expectedResult = isTestThread ? expectedShortValue : unexpectedShortValue;
if(result != expectedResult)
{
logError("unexpected result of " + methodName + ": " + result + ", expected is: " + expectedResult);
success = false;
}
}
if(methodName.equals("IntMethod"))
{
int result = IntMethod();
// log(Thread.currentThread() + ": result of " + methodName + ": " + result);
int expectedResult;
expectedResult = isTestThread ? expectedIntValue : unexpectedIntValue;
if(result != expectedResult)
{
logError("unexpected result of " + methodName + ": " + result + ", expected is: " + expectedResult);
success = false;
}
}
if(methodName.equals("LongMethod"))
{
long result = LongMethod();
// log(Thread.currentThread() + ": result of " + methodName + ": " + result);
long expectedResult;
expectedResult = isTestThread ? expectedLongValue : unexpectedLongValue;
if(result != expectedResult)
{
logError("unexpected result of " + methodName + ": " + result + ", expected is: " + expectedResult);
success = false;
}
}
if(methodName.equals("FloatMethod"))
{
float result = FloatMethod();
// log(Thread.currentThread() + ": result of " + methodName + ": " + result);
float expectedResult;
expectedResult = isTestThread ? expectedFloatValue : unexpectedFloatValue;
if(result != expectedResult)
{
logError("unexpected result of " + methodName + ": " + result + ", expected is: " + expectedResult);
success = false;
}
}
if(methodName.equals("DoubleMethod"))
{
double result = DoubleMethod();
// log(Thread.currentThread() + ": result of " + methodName + ": " + result);
double expectedResult;
expectedResult = isTestThread ? expectedDoubleValue : unexpectedDoubleValue;
if(result != expectedResult)
{
logError("unexpected result of " + methodName + ": " + result + ", expected is: " + expectedResult);
success = false;
}
}
if(methodName.equals("StringMethod"))
{
String result = StringMethod();
// log(Thread.currentThread() + ": result of " + methodName + ": " + result);
String expectedResult;
expectedResult = isTestThread ? expectedStringValue : unexpectedStringValue;
if(!result.equals(expectedResult))
{
logError("unexpected result of " + methodName + ": " + result + ", expected is: " + expectedResult);
success = false;
}
}
if(methodName.equals("ObjectMethod"))
{
Object result = ObjectMethod();
// log(Thread.currentThread() + ": result of " + methodName + ": " + result);
Object expectedResult;
expectedResult = isTestThread ? expectedObjectValue : unexpectedObjectValue;
if(result != expectedResult)
{
logError("unexpected result of " + methodName + ": " + result + ", expected is: " + expectedResult);
success = false;
}
}
if(methodName.equals("ObjectArrayMethod"))
{
Object[] result = ObjectArrayMethod();
// log(Thread.currentThread() + ": result of " + methodName + ": " + result);
Object[] expectedResult;
expectedResult = isTestThread ? expectedObjectArrayValue : unexpectedObjectArrayValue;
if(result != expectedResult)
{
logError("unexpected result of " + methodName + ": " + result + ", expected is: " + expectedResult);
success = false;
}
}
if(methodName.equals("ThreadMethod"))
{
Thread result = ThreadMethod();
// log(Thread.currentThread() + ": result of " + methodName + ": " + result);
Thread expectedResult;
expectedResult = isTestThread ? expectedThreadValue : unexpectedThreadValue;
if(result != expectedResult)
{
logError("unexpected result of " + methodName + ": " + result + ", expected is: " + expectedResult);
success = false;
}
}
if(methodName.equals("ThreadGroupMethod"))
{
ThreadGroup result = ThreadGroupMethod();
// log(Thread.currentThread() + ": result of " + methodName + ": " + result);
ThreadGroup expectedResult;
expectedResult = isTestThread ? expectedThreadGroupValue : unexpectedThreadGroupValue;
if(result != expectedResult)
{
logError("unexpected result of " + methodName + ": " + result + ", expected is: " + expectedResult);
success = false;
}
}
if(methodName.equals("ClassObjectMethod"))
{
Class<?> result = ClassObjectMethod();
// log(Thread.currentThread() + ": result of " + methodName + ": " + result);
Class<?> expectedResult;
expectedResult = isTestThread ? expectedClassObjectValue : unexpectedClassObjectValue;
if(result != expectedResult)
{
logError("unexpected result of " + methodName + ": " + result + ", expected is: " + expectedResult);
success = false;
}
}
if(methodName.equals("ClassLoaderMethod"))
{
ClassLoader result = ClassLoaderMethod();
// log(Thread.currentThread() + ": result of " + methodName + ": " + result);
ClassLoader expectedResult;
expectedResult = isTestThread ? expectedClassLoaderValue : unexpectedClassLoaderValue;
if(result != expectedResult)
{
logError("unexpected result of " + methodName + ": " + result + ", expected is: " + expectedResult);
success = false;
}
}
if(methodName.equals("BooleanWrapperMethod"))
{
Boolean result = BooleanWrapperMethod();
// log(Thread.currentThread() + ": result of " + methodName + ": " + result);
Boolean expectedResult;
expectedResult = isTestThread ? expectedBooleanWrapperValue : unexpectedBooleanWrapperValue;
if(result != expectedResult)
{
logError("unexpected result of " + methodName + ": " + result + ", expected is: " + expectedResult);
success = false;
}
}
if(methodName.equals("ByteWrapperMethod"))
{
Byte result = ByteWrapperMethod();
// log(Thread.currentThread() + ": result of " + methodName + ": " + result);
Byte expectedResult;
expectedResult = isTestThread ? expectedByteWrapperValue : unexpectedByteWrapperValue;
if(result != expectedResult)
{
logError("unexpected result of " + methodName + ": " + result + ", expected is: " + expectedResult);
success = false;
}
}
if(methodName.equals("ShortWrapperMethod"))
{
Short result = ShortWrapperMethod();
// log(Thread.currentThread() + ": result of " + methodName + ": " + result);
Short expectedResult;
expectedResult = isTestThread ? expectedShortWrapperValue : unexpectedShortWrapperValue;
if(result != expectedResult)
{
logError("unexpected result of " + methodName + ": " + result + ", expected is: " + expectedResult);
success = false;
}
}
if(methodName.equals("CharWrapperMethod"))
{
Character result = CharWrapperMethod();
// log(Thread.currentThread() + ": result of " + methodName + ": " + result);
Character expectedResult;
expectedResult = isTestThread ? expectedCharWrapperValue : unexpectedCharWrapperValue;
if(result != expectedResult)
{
logError("unexpected result of " + methodName + ": " + result + ", expected is: " + expectedResult);
success = false;
}
}
if(methodName.equals("IntWrapperMethod"))
{
Integer result = IntWrapperMethod();
// log(Thread.currentThread() + ": result of " + methodName + ": " + result);
Integer expectedResult;
expectedResult = isTestThread ? expectedIntWrapperValue : unexpectedIntWrapperValue;
if(result != expectedResult)
{
logError("unexpected result of " + methodName + ": " + result + ", expected is: " + expectedResult);
success = false;
}
}
if(methodName.equals("LongWrapperMethod"))
{
Long result = LongWrapperMethod();
// log(Thread.currentThread() + ": result of " + methodName + ": " + result);
Long expectedResult;
expectedResult = isTestThread ? expectedLongWrapperValue : unexpectedLongWrapperValue;
if(result != expectedResult)
{
logError("unexpected result of " + methodName + ": " + result + ", expected is: " + expectedResult);
success = false;
}
}
if(methodName.equals("FloatWrapperMethod"))
{
Float result = FloatWrapperMethod();
// log(Thread.currentThread() + ": result of " + methodName + ": " + result);
Float expectedResult;
expectedResult = isTestThread ? expectedFloatWrapperValue : unexpectedFloatWrapperValue;
if(result != expectedResult)
{
logError("unexpected result of " + methodName + ": " + result + ", expected is: " + expectedResult);
success = false;
}
}
if(methodName.equals("DoubleWrapperMethod"))
{
Double result = DoubleWrapperMethod();
// log(Thread.currentThread() + ": result of " + methodName + ": " + result);
Double expectedResult;
expectedResult = isTestThread ? expectedDoubleWrapperValue : unexpectedDoubleWrapperValue;
if(result != expectedResult)
{
logError("unexpected result of " + methodName + ": " + result + ", expected is: " + expectedResult);
success = false;
}
}
}
// method which shouldn't be executed in test thread
void unexpectedMethod()
{
if(isTestThread)
{
success = false;
logError("unexpected code is executed after forceEarlyReturn");
}
}
public boolean getSuccess()
{
return success;
}
}