Search in sources :

Example 41 with ObjectRef

use of io.nuls.contract.vm.ObjectRef in project nuls by nuls-io.

the class NativeThrowable method getStackTraceElement.

/**
 * native
 *
 * @see Throwable#getStackTraceElement(int)
 */
private static Result getStackTraceElement(MethodCode methodCode, MethodArgs methodArgs, Frame frame) {
    int index = (int) methodArgs.invokeArgs[0];
    ObjectRef objectRef = methodArgs.objectRef;
    ObjectRef stackTraceElementsRef = (ObjectRef) frame.heap.getField(objectRef, "stackTraceElements");
    ObjectRef stackTraceElementRef = (ObjectRef) frame.heap.getArray(stackTraceElementsRef, index);
    Result result = NativeMethod.result(methodCode, stackTraceElementRef, frame);
    return result;
}
Also used : ObjectRef(io.nuls.contract.vm.ObjectRef) Result(io.nuls.contract.vm.Result)

Example 42 with ObjectRef

use of io.nuls.contract.vm.ObjectRef 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)

Example 43 with ObjectRef

use of io.nuls.contract.vm.ObjectRef in project nuls by nuls-io.

the class NativeVM method initialize.

/**
 * native
 *
 * @see VM#initialize()
 */
private static Result initialize(MethodCode methodCode, MethodArgs methodArgs, Frame frame) {
    ObjectRef savedProps = (ObjectRef) frame.heap.getStatic(TYPE, "savedProps");
    ObjectRef key = frame.heap.newString("user.script");
    ObjectRef value = frame.heap.newString("");
    MethodCode methodCode1 = frame.methodArea.loadMethod("java/util/Properties", "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
    frame.vm.run(methodCode1, new Object[] { savedProps, key, value }, false);
    Result result = NativeMethod.result(methodCode, null, frame);
    return result;
}
Also used : ObjectRef(io.nuls.contract.vm.ObjectRef) MethodCode(io.nuls.contract.vm.code.MethodCode) Result(io.nuls.contract.vm.Result)

Example 44 with ObjectRef

use of io.nuls.contract.vm.ObjectRef in project nuls by nuls-io.

the class NativeSystem method identityHashCode.

/**
 * native
 *
 * @see System#identityHashCode(Object)
 */
private static Result identityHashCode(MethodCode methodCode, MethodArgs methodArgs, Frame frame) {
    ObjectRef objectRef = (ObjectRef) methodArgs.invokeArgs[0];
    int hashCode = identityHashCode(objectRef);
    Result result = NativeMethod.result(methodCode, hashCode, frame);
    return result;
}
Also used : ObjectRef(io.nuls.contract.vm.ObjectRef) Result(io.nuls.contract.vm.Result)

Example 45 with ObjectRef

use of io.nuls.contract.vm.ObjectRef in project nuls by nuls-io.

the class NativeSystem method arraycopy.

/**
 * native
 *
 * @see System#arraycopy(Object, int, Object, int, int)
 */
private static Result arraycopy(MethodCode methodCode, MethodArgs methodArgs, Frame frame) {
    Object[] args = methodArgs.invokeArgs;
    ObjectRef srcObjectRef = (ObjectRef) args[0];
    int srcPos = (int) args[1];
    ObjectRef destObjectRef = (ObjectRef) args[2];
    int destPos = (int) args[3];
    int length = (int) args[4];
    if (length > 0 && frame.checkArray(srcObjectRef, srcPos) && frame.checkArray(srcObjectRef, srcPos + length - 1) && frame.checkArray(destObjectRef, destPos) && frame.checkArray(destObjectRef, destPos + length - 1)) {
        frame.heap.arraycopy(srcObjectRef, srcPos, destObjectRef, destPos, length);
    }
    Result result = NativeMethod.result(methodCode, null, frame);
    return result;
}
Also used : ObjectRef(io.nuls.contract.vm.ObjectRef) Result(io.nuls.contract.vm.Result)

Aggregations

ObjectRef (io.nuls.contract.vm.ObjectRef)74 Result (io.nuls.contract.vm.Result)35 VariableType (io.nuls.contract.vm.code.VariableType)18 MethodCode (io.nuls.contract.vm.code.MethodCode)6 ClassCode (io.nuls.contract.vm.code.ClassCode)5 MethodArgs (io.nuls.contract.vm.MethodArgs)3 MethodInsnNode (org.objectweb.asm.tree.MethodInsnNode)3 TypeInsnNode (org.objectweb.asm.tree.TypeInsnNode)3 Frame (io.nuls.contract.vm.Frame)2 FieldInsnNode (org.objectweb.asm.tree.FieldInsnNode)2 BiMap (com.google.common.collect.BiMap)1 BlockHeaderDto (io.nuls.contract.entity.BlockHeaderDto)1 VM (io.nuls.contract.vm.VM)1 ErrorException (io.nuls.contract.vm.exception.ErrorException)1 ArrayList (java.util.ArrayList)1 LinkedHashMap (java.util.LinkedHashMap)1 Map (java.util.Map)1 AccountState (org.ethereum.core.AccountState)1 DataWord (org.ethereum.vm.DataWord)1 Type (org.objectweb.asm.Type)1