use of io.nuls.contract.vm.Frame in project nuls by nuls-io.
the class Athrow method athrow.
public static void athrow(final Frame frame) {
ObjectRef objectRef = frame.operandStack.popRef();
if (objectRef == null) {
frame.throwNullPointerException();
return;
}
// Log.opcode(frame.getCurrentOpCode(), objectRef);
while (frame.vm.isNotEmptyFrame()) {
final Frame lastFrame = frame.vm.lastFrame();
TryCatchBlockNode tryCatchBlockNode = getTryCatchBlockNode(lastFrame, objectRef);
if (tryCatchBlockNode != null) {
lastFrame.operandStack.clear();
lastFrame.operandStack.pushRef(objectRef);
lastFrame.jump(tryCatchBlockNode.handler);
return;
} else {
frame.vm.popFrame();
}
}
frame.vm.getResult().exception(objectRef);
}
use of io.nuls.contract.vm.Frame in project nuls by nuls-io.
the class NativeThrowable method fillInStackTrace.
/**
* native
*
* @see Throwable#fillInStackTrace(int)
*/
private static Result fillInStackTrace(MethodCode methodCode, MethodArgs methodArgs, Frame frame) {
int dummy = (int) methodArgs.invokeArgs[0];
ObjectRef objectRef = methodArgs.objectRef;
int size = frame.vm.vmStack.size();
boolean isThrowable = true;
List<Frame> frames = new ArrayList<>();
for (int i = size - 1; i >= 0; i--) {
Frame frame1 = frame.vm.vmStack.get(i);
if (isThrowable) {
if (Instanceof.instanceof_(frame1.methodCode.className, "java/lang/Throwable", frame)) {
continue;
} else {
isThrowable = false;
}
}
frames.add(frame1);
}
ObjectRef stackTraceElementsRef = frame.heap.newArray(VariableType.STACK_TRACE_ELEMENT_ARRAY_TYPE, frames.size());
frame.heap.putField(objectRef, "stackTraceElements", stackTraceElementsRef);
int index = 0;
for (Frame frame1 : frames) {
ObjectRef declaringClass = frame.heap.newString(frame1.methodCode.className);
ObjectRef methodName = frame.heap.newString(frame1.methodCode.name);
ObjectRef fileName = frame.heap.newString(frame1.methodCode.classCode.sourceFile);
int lineNumber = frame1.getLine();
ObjectRef stackTraceElementRef = frame.heap.runNewObjectWithArgs(VariableType.STACK_TRACE_ELEMENT_TYPE, null, declaringClass, methodName, fileName, lineNumber);
frame.heap.putArray(stackTraceElementsRef, index++, stackTraceElementRef);
}
Result result = NativeMethod.result(methodCode, objectRef, frame);
return result;
}
Aggregations