package gov.nasa.jpf.vm.util;
import java.lang.reflect.Method;
import java.util.Arrays;
import cmu.conditional.One;
import de.fosd.typechef.featureexpr.FeatureExpr;
import gov.nasa.jpf.vm.MJIEnv;
public class InvokationUtils {
public static Object invoke(String className, String methodName, Object... params) {
try {
return invoke(Class.forName(className), methodName, params);
} catch (ClassNotFoundException e) {
System.err.println("invoke exception");
System.err.println(e);
for (StackTraceElement element : e.getStackTrace()) {
System.err.println(element);
}
System.err.println(e.getCause());
for (StackTraceElement element : e.getCause().getStackTrace()) {
System.err.println(element);
}
throw new RuntimeException(e);
}
}
public static Object invoke(Class<?> c, String methodName, Object... params) {
return invoke(c, null, methodName, params);
}
public static Object invoke(Class<?> c, Object o, String methodName, Object... params) {
try {
Class<?>[] paramTypes = new Class<?>[params.length];
for (int i = 0; i < params.length; i++) {
paramTypes[i] = (Class<?>) params[i].getClass();
try {
paramTypes[i] = (Class<?>) params[i].getClass().getField("TYPE").get(null);
} catch (Exception e) {
}
}
Method method = c.getDeclaredMethod(methodName, paramTypes);
method.setAccessible(true);
return method.invoke(o, params);
} catch (Exception e) {
System.err.println("invoke exception");
System.err.println(e);
for (StackTraceElement element : e.getStackTrace()) {
System.err.println(element);
}
System.err.println(e.getCause());
for (StackTraceElement element : e.getCause().getStackTrace()) {
System.err.println(element);
}
throw new RuntimeException(e);
}
}
public static String toString(Object[] params) {
StringBuilder paramString = new StringBuilder();
for (Object p : params) {
if (p instanceof byte[]) {
paramString.append(Arrays.toString((byte[]) p));
} else {
paramString.append(p);
}
paramString.append(", ");
}
return paramString.toString();
}
public static void setArrayElements(MJIEnv env, int bArrayRef, byte[] data, int off, int len, FeatureExpr ctx) {
for (int i = off; i < off + len; i++) {
env.setByteArrayElement(ctx, bArrayRef, i, new One<>(data[i]));
}
}
}