//
// Copyright (C) 2006 United States Government as represented by the
// Administrator of the National Aeronautics and Space Administration
// (NASA). All Rights Reserved.
//
// This software is distributed under the NASA Open Source Agreement
// (NOSA), version 1.3. The NOSA has been approved by the Open Source
// Initiative. See the file NOSA-1.3-JPF at the top of the distribution
// directory tree for the complete NOSA document.
//
// THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY OF ANY
// KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, BUT NOT
// LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM TO
// SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR
// A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT
// THE SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT
// DOCUMENTATION, IF PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE.
//
package gov.nasa.jpf.vm;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.function.BiConsumer;
import cmu.conditional.Conditional;
import cmu.conditional.One;
import de.fosd.typechef.featureexpr.FeatureExpr;
import gov.nasa.jpf.annotation.MJI;
/**
* MJI NativePeer class for java.lang.Throwable library abstraction
*/
public class JPF_java_lang_Throwable extends NativePeer {
/**
* return array of StackTraceElement elements from the snapshot stored in the Throwable
*/
@MJI
public int createStackTrace_____3Ljava_lang_StackTraceElement_2 (MJIEnv env, int objref, FeatureExpr ctx) {
int aref = env.getReferenceField(ctx, objref, "snapshot").getValue();
int[] snap = env.getIntArrayObject(ctx, aref);
return env.getThreadInfo().createStackTraceElements(ctx, snap);
}
@MJI
public int fillInStackTrace____Ljava_lang_Throwable_2 (MJIEnv env, int objref, FeatureExpr ctx) {
ThreadInfo ti = env.getThreadInfo();
int[] snap = ti.getSnapshot(ctx, objref);
int aref = env.newIntArray(ctx, snap);
env.setReferenceField(ctx, objref, "snapshot", aref);
return objref;
}
// native because we don't want to waste states
@MJI
public void printStackTrace____V (final MJIEnv env, Conditional<Integer> objRef, FeatureExpr ctx) {
objRef.mapf(ctx, new BiConsumer<FeatureExpr, Integer>() {
@Override
public void accept(FeatureExpr ctx, Integer objRef) {
env.getThreadInfo().printStackTrace(ctx, objRef);
}
});
}
// a helper method to get a string representation of the stacktrace
@MJI
public int getStackTraceAsString____Ljava_lang_String_2 (MJIEnv env, int objRef, FeatureExpr ctx) {
ThreadInfo ti = env.getThreadInfo();
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
ti.printStackTrace(ctx, pw, objRef);
String stackTrace = sw.toString();
pw.close();
return env.newString(ctx, stackTrace);
}
@MJI
public int toString____Ljava_lang_String_2 (MJIEnv env, int objRef, FeatureExpr ctx){
ClassInfo ci = env.getClassInfo(objRef);
int msgRef = env.getReferenceField(ctx, objRef, "detailMessage").getValue();
String s = ci.getName();
if (msgRef != MJIEnv.NULL){
s += ": ";
Conditional<String> message = env.getStringObjectNew(ctx, msgRef);
if (message instanceof One) {
s += message.getValue();
} else {
s += message;
}
}
return env.newString(ctx, s);
}
}