Search in sources :

Example 1 with Frame

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);
}
Also used : TryCatchBlockNode(org.objectweb.asm.tree.TryCatchBlockNode) Frame(io.nuls.contract.vm.Frame) ObjectRef(io.nuls.contract.vm.ObjectRef)

Example 2 with Frame

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;
}
Also used : Frame(io.nuls.contract.vm.Frame) ArrayList(java.util.ArrayList) ObjectRef(io.nuls.contract.vm.ObjectRef) Result(io.nuls.contract.vm.Result)

Aggregations

Frame (io.nuls.contract.vm.Frame)2 ObjectRef (io.nuls.contract.vm.ObjectRef)2 Result (io.nuls.contract.vm.Result)1 ArrayList (java.util.ArrayList)1 TryCatchBlockNode (org.objectweb.asm.tree.TryCatchBlockNode)1