/* * Copyright (c) 2007, 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.
*/
class GetSetLocalTarg { publicstaticvoid main(String[] args){ int intVar = 10;
System.out.println("GetSetLocalTarg: Started");
intVar = staticMeth(intVar);
System.out.println("GetSetLocalTarg: Finished");
}
/* * The line numbers of this method *MUST NOT* be changed * because the testing algorithm counts on this layout! * It's in calls to resumeTo("GetSetLocalTarg", line).
*/ publicstaticint staticMeth(int intArg) {
System.out.println("staticMeth: Started"); int result;
{
{ boolean bool_1 = false;
intArg++; // START_LINE
}
Object obj_2 = new Object();
intArg++; // STOP_LINE. Last stop is at this point. // Only obj_2 and intArg are valid // Note: even result is not valid here!
}
result = 10; // <- This is first init of result var
System.out.println("staticMeth: Finished"); return result;
}
}
List printAllVariables(String className, String methodName) throws Exception {
println("printAllVariables for method: " + className + "." + methodName);
Method method = getMethod(className, methodName);
List localVars; try {
localVars = method.variables();
println(" Success: got a list of all method variables: " + methodName);
} catch (com.sun.jdi.AbsentInformationException ex) {
failure(" Failure: AbsentInformationException has been thrown"); returnnull;
}
int index = 0; for (Iterator it = localVars.iterator(); it.hasNext();) {
LocalVariable lv = (LocalVariable) it.next();
printOneVariable(lv, index++);
}
println(""); return localVars;
}
void checkGetSetAllVariables(List localVars, StackFrame frame) throws Exception {
println("\n checkGetSetAllVariables for method at particular frame location: "); int index = 0; for (Iterator it = localVars.iterator(); it.hasNext();) {
LocalVariable lv = (LocalVariable) it.next();
String lv_name = lv.name();
print(" Variable " + lv_name); try {
Value val = frame.getValue(lv);
frame.setValue(lv, val);
println(" has been get/set"); if (lv_name.compareTo("intArg") != 0 &&
lv_name.compareTo("obj_2") != 0) {
failure(" Failure: AbsentInformationException is expected");
}
} catch (java.lang.IllegalArgumentException ex) {
println(" is not valid"); if (lv_name.compareTo("intArg") == 0 &&
lv_name.compareTo("obj_2") == 0) {
failure(" Failure: AbsentInformationException was not expected");
}
}
}
println("");
}
void printOneVariable(LocalVariable lv, int index) throws Exception {
String tyname = lv.typeName();
println("");
println(" Var name: " + lv.name());
println(" Var type: " + tyname);
println(" Var index: " + index);
println(" Signature: " + lv.type().signature()); // Sorry, there is no way to get (and print) // a local variable slot numbers using JDI!
}
void printFrameVariables(StackFrame frame) throws Exception { int index = 0;
List localVars = frame.visibleVariables();
println("\n Visible variables at this point are: ");
for (Iterator it = localVars.iterator(); it.hasNext();) {
LocalVariable lv = (LocalVariable) it.next();
printOneVariable(lv, index++);
println(" Var value: " + frame.getValue(lv));
}
}
void checkSetBooleanTypes(StackFrame frame, LocalVariable lv) throws Exception {
BooleanValue get = (BooleanValue) frame.getValue(lv);
BooleanValue set = incrValue(get);
frame.setValue(lv, set);
// To get the new value which has been set
get = (BooleanValue) frame.getValue(lv);
println(" Var Set: " + set);
println(" Var Get: " + get);
println(""); boolean v1 = get.value(); boolean v2 = set.value();
// Check if set was done properly if (v1 == v2) {
println(" Success: Value was set correctly!");
} else {
failure(" Failure: Value was NOT set correctly!");
}
println("");
}
void checkSetByteTypes(StackFrame frame, LocalVariable lv) throws Exception {
ByteValue get = (ByteValue) frame.getValue(lv);
ByteValue set = incrValue(get);
frame.setValue(lv, set);
// To get the new value which has been set
get = (ByteValue) frame.getValue(lv);
println(" Var Set: " + set);
println(" Var Get: " + get);
println(""); byte v1 = get.value(); byte v2 = set.value();
// Check if set was done properly if (v1 == v2) {
println(" Success: Value was set correctly!");
} else {
failure(" Failure: Value was NOT set correctly!");
}
println("");
}
void checkSetCharTypes(StackFrame frame, LocalVariable lv) throws Exception {
CharValue get = (CharValue) frame.getValue(lv);
CharValue set = incrValue(get);
frame.setValue(lv, set);
// To get the new value which has been set
get = (CharValue) frame.getValue(lv);
println(" Var Set: " + set);
println(" Var Get: " + get);
println(""); char v1 = get.value(); char v2 = set.value();
// Check if set was done properly if (v1 == v2) {
println(" Success: Value was set correctly!");
} else {
failure(" Failure: Value was NOT set correctly!");
}
println("");
}
void checkSetShortTypes(StackFrame frame, LocalVariable lv) throws Exception {
ShortValue get = (ShortValue) frame.getValue(lv);
ShortValue set = incrValue(get);
frame.setValue(lv, set);
// To get the new value which has been set
get = (ShortValue) frame.getValue(lv);
println(" Var Set: " + set);
println(" Var Get: " + get);
println(""); short v1 = get.value(); short v2 = set.value();
// Check if set was done properly if (v1 == v2) {
println(" Success: Value was set correctly!");
} else {
failure(" Failure: Value was NOT set correctly!");
}
println("");
}
void checkSetIntegerTypes(StackFrame frame, LocalVariable lv) throws Exception {
IntegerValue get = (IntegerValue) frame.getValue(lv);
IntegerValue set = incrValue(get);
frame.setValue(lv, set);
// To get the new value which has been set
get = (IntegerValue) frame.getValue(lv);
println(" Var Set: " + set);
println(" Var Get: " + get);
println(""); int v1 = get.value(); int v2 = set.value();
// Check if set was done properly if (v1 == v2) {
println(" Success: Value was set correctly!");
} else {
failure(" Failure: Value was NOT set correctly!");
}
println("");
}
void checkSetLongTypes(StackFrame frame, LocalVariable lv) throws Exception {
LongValue get = (LongValue) frame.getValue(lv);
LongValue set = incrValue(get);
frame.setValue(lv, set);
// To get the new value which has been set
get = (LongValue) frame.getValue(lv);
println(" Var Set: " + set);
println(" Var Get: " + get);
println(""); long v1 = get.value(); long v2 = set.value();
// Check if set was done properly if (v1 == v2) {
println(" Success: Value was set correctly!");
} else {
failure(" Failure: Value was NOT set correctly!");
}
println("");
}
void checkSetFloatTypes(StackFrame frame, LocalVariable lv) throws Exception {
FloatValue get = (FloatValue) frame.getValue(lv);
FloatValue set = incrValue(get);
frame.setValue(lv, set);
// To get the new value which has been set
get = (FloatValue) frame.getValue(lv);
println(" Var Set: " + set);
println(" Var Get: " + get);
println(""); float v1 = get.value(); float v2 = set.value();
// Check if set was done properly if (v1 == v2) {
println(" Success: Value was set correctly!");
} else {
failure(" Failure: Value was NOT set correctly!");
}
println("");
}
void checkSetDoubleTypes(StackFrame frame, LocalVariable lv) throws Exception {
DoubleValue get = (DoubleValue) frame.getValue(lv);
DoubleValue set = incrValue(get);
frame.setValue(lv, set);
// To get the new value which has been set
get = (DoubleValue) frame.getValue(lv);
println(" Var Set: " + set);
println(" Var Get: " + get);
println(""); double v1 = get.value(); double v2 = set.value();
// Check if set was done properly if (v1 == v2) {
println(" Success: Value was set correctly!");
} else {
failure(" Failure: Value was NOT set correctly!");
}
println("");
}
void checkSetStringTypes(StackFrame frame, LocalVariable lv) throws Exception {
StringReference get = (StringReference) frame.getValue(lv);
StringReference set = incrValue((StringReference) frame.getValue(lv));
frame.setValue(lv, set);
// To get the new value which has been set
get = (StringReference) frame.getValue(lv);
println(" Var Set: " + set);
println(" Var Get: " + get);
println("");
String str1 = get.value();
String str2 = set.value();
// Check if set was done properly if (str1.compareTo(str2) == 0) {
println(" Success: String was set correctly!");
} else {
failure(" Failure: String was NOT set correctly!");
}
println("");
}
void checkSetObjectTypes(StackFrame frame, LocalVariable lv) throws Exception {
ObjectReference get = (ObjectReference) frame.getValue(lv);
ObjectReference set = get; // FIXME: Don't know how to create a mirror of Object
frame.setValue(lv, set);
// To get the new value which has been set
get = (ObjectReference) frame.getValue(lv);
println(" Var Set: " + set);
println(" Var Get: " + get);
println("");
if (set.uniqueID() == get.uniqueID()) {
println(" Success: Object was set correctly!");
} else {
failure(" Failure: Object was NOT set correctly!");
}
println("");
}
void negativeIntegerCheck(StackFrame frame, LocalVariable lv) throws Exception { try {
IntegerValue get = (IntegerValue) frame.getValue(lv);
println(" Get: No ClassCastException error!");
} catch(java.lang.ClassCastException ex) {
println(" Success: Get: ClassCastException error has cought as expected!");
} try {
IntegerValue set = vm().mirrorOf((int) 0x3F);
frame.setValue(lv, set);
println(" Set: No InvalidTypeException with Integer error!");
} catch(com.sun.jdi.InvalidTypeException ex) {
println(" Success: Set: InvalidTypeException with Integer error has cought as expected!");
}
}
void negativeFloatCheck(StackFrame frame, LocalVariable lv) throws Exception { try {
FloatValue get = (FloatValue) frame.getValue(lv);
println(" Get: No ClassCastException error!");
} catch(java.lang.ClassCastException ex) {
println(" Success: Get: ClassCastException with Float error has cought as expected!");
} try {
FloatValue set = vm().mirrorOf(1.2345f);
frame.setValue(lv, set);
println(" Set: No InvalidTypeException with Float error!");
} catch(com.sun.jdi.InvalidTypeException ex) {
println(" Success: Set: InvalidTypeException error has cought as expected!");
}
}
void negativeDoubleCheck(StackFrame frame, LocalVariable lv) throws Exception { try {
DoubleValue get = (DoubleValue) frame.getValue(lv);
println(" Get: No ClassCastException error!");
} catch(java.lang.ClassCastException ex) {
println(" Success: Get: ClassCastException with Double error has cought as expected!");
} try {
DoubleValue set = vm().mirrorOf(1.2345E02);
frame.setValue(lv, set);
println(" Set: No InvalidTypeException with Double error!");
} catch(com.sun.jdi.InvalidTypeException ex) {
println(" Success: Set: InvalidTypeException error has cought as expected!");
}
}
void checkSetFrameVariables(StackFrame frame) throws Exception {
List localVars = frame.visibleVariables(); int index = 0;
println("\n Set variable values:");
for (Iterator it = localVars.iterator(); it.hasNext();index++) {
LocalVariable lv = (LocalVariable) it.next();
String signature = lv.type().signature();
switch (signature.charAt(0)) { case'Z': // Boolean Type
checkSetBooleanTypes(frame, lv);
negativeIntegerCheck(frame, lv);
negativeFloatCheck(frame, lv);
negativeDoubleCheck(frame, lv); break; case'B': // Byte Type
checkSetByteTypes(frame, lv);
negativeIntegerCheck(frame, lv);
negativeFloatCheck(frame, lv);
negativeDoubleCheck(frame, lv); break; case'C': // Char Type
checkSetCharTypes(frame, lv);
negativeIntegerCheck(frame, lv);
negativeFloatCheck(frame, lv);
negativeDoubleCheck(frame, lv); break; case'S': // Short Type
checkSetShortTypes(frame, lv);
negativeIntegerCheck(frame, lv);
negativeFloatCheck(frame, lv);
negativeDoubleCheck(frame, lv); break; case'I': // Integer Type
checkSetIntegerTypes(frame, lv); if (index > 0) { // To skip integer method parameter
negativeFloatCheck(frame, lv);
negativeDoubleCheck(frame, lv);
} break; case'J': // Long Type
checkSetLongTypes(frame, lv);
negativeIntegerCheck(frame, lv);
negativeFloatCheck(frame, lv);
negativeDoubleCheck(frame, lv); break; case'F': // Float Type
checkSetFloatTypes(frame, lv);
negativeIntegerCheck(frame, lv);
negativeDoubleCheck(frame, lv); break; case'D': // Double Type
checkSetDoubleTypes(frame, lv);
negativeIntegerCheck(frame, lv);
negativeFloatCheck(frame, lv); break; case'L': if (signature.compareTo("Ljava/lang/String;") == 0) {
checkSetStringTypes(frame, lv);
negativeIntegerCheck(frame, lv);
negativeFloatCheck(frame, lv);
} if (signature.compareTo("Ljava/lang/Object;") == 0) {
checkSetObjectTypes(frame, lv);
negativeIntegerCheck(frame, lv);
negativeFloatCheck(frame, lv);
} break; default:
printOneVariable(lv, index);
failure(" Failure: List of local variables has a wrong entry!");
};
}
}
/********** test core **********/
protectedvoid runTests() throws Exception {
/* * Get to the top of main() to determine targetClass and mainThread
*/
BreakpointEvent bpe = startToMain("GetSetLocalTarg");
println("startToMain(GetSetLocalTarg)");
List localVars = printAllVariables("GetSetLocalTarg", "staticMeth");
for (int line = START_LINE; line <= STOP_LINE; line += 4) {
println("\n resumeTo(GetSetLocalTarg, " + line + ")");
bpe = resumeTo("GetSetLocalTarg", line);
frame = bpe.thread().frame(0);
printFrameVariables(frame);
checkSetFrameVariables(frame);
} // Check if we can Get/Set all local vars using last frame state
checkGetSetAllVariables(localVars, frame);
/* * resume until the end
*/
listenUntilVMDisconnect();
/* * deal with results of test * if anything has called failure("foo") testFailed will be true
*/ if (!testFailed) {
println("GetSetLocalTest: passed");
} else { thrownew Exception("GetSetLocalTest: failed");
}
}
}
Messung V0.5
¤ Dauer der Verarbeitung: 0.3 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.