Search in sources :

Example 6 with Result

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

the class NativeClass method getName0.

/**
 * native
 *
 * @see Class#getName0()
 */
private static Result getName0(MethodCode methodCode, MethodArgs methodArgs, Frame frame) {
    ObjectRef objectRef = methodArgs.objectRef;
    VariableType variableType;
    if (objectRef.getVariableType().isArray()) {
        variableType = objectRef.getVariableType();
    } else {
        variableType = VariableType.valueOf(objectRef.getRef());
    }
    String name;
    if (variableType.isArray()) {
        name = variableType.getDesc();
    } else {
        name = variableType.getType();
        if (name.startsWith("L") && name.endsWith(";")) {
            name = name.substring(1, name.length() - 1);
        }
    }
    name = name.replace('/', '.');
    ObjectRef ref = frame.heap.newString(name);
    Result result = NativeMethod.result(methodCode, ref, frame);
    return result;
}
Also used : VariableType(io.nuls.contract.vm.code.VariableType) ObjectRef(io.nuls.contract.vm.ObjectRef) Result(io.nuls.contract.vm.Result)

Example 7 with Result

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

the class NativeClass method desiredAssertionStatus0.

/**
 * native
 *
 * @see Class#desiredAssertionStatus0(Class)
 */
private static Result desiredAssertionStatus0(MethodCode methodCode, MethodArgs methodArgs, Frame frame) {
    boolean status = false;
    Result result = NativeMethod.result(methodCode, status, frame);
    return result;
}
Also used : Result(io.nuls.contract.vm.Result)

Example 8 with Result

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

the class Invokestatic method invokestatic.

public static void invokestatic(Frame frame) {
    MethodInsnNode methodInsnNode = frame.methodInsnNode();
    String className = methodInsnNode.owner;
    String methodName = methodInsnNode.name;
    String methodDesc = methodInsnNode.desc;
    MethodCode methodCode = frame.methodArea.loadMethod(className, methodName, methodDesc);
    MethodArgs methodArgs = new MethodArgs(methodCode.argsVariableType, frame.operandStack, true);
    // Log.opcode(frame.getCurrentOpCode(), className, methodName, methodDesc);
    Result result = NativeMethod.run(methodCode, methodArgs, frame);
    if (result != null) {
        return;
    }
    frame.vm.run(methodCode, methodArgs.frameArgs, true);
}
Also used : MethodInsnNode(org.objectweb.asm.tree.MethodInsnNode) MethodCode(io.nuls.contract.vm.code.MethodCode) MethodArgs(io.nuls.contract.vm.MethodArgs) Result(io.nuls.contract.vm.Result)

Example 9 with Result

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

the class Invokespecial method invokespecial.

public static void invokespecial(Frame frame) {
    MethodInsnNode methodInsnNode = frame.methodInsnNode();
    String className = methodInsnNode.owner;
    String methodName = methodInsnNode.name;
    String methodDesc = methodInsnNode.desc;
    MethodCode methodCode = frame.methodArea.loadMethod(className, methodName, methodDesc);
    MethodArgs methodArgs = new MethodArgs(methodCode.argsVariableType, frame.operandStack, false);
    ObjectRef objectRef = methodArgs.objectRef;
    if (objectRef == null) {
        frame.throwNullPointerException();
        return;
    }
    if (Constants.OBJECT_CLASS_NAME.equals(className) && Constants.CONSTRUCTOR_NAME.equals(methodName)) {
        return;
    }
    Result result = NativeMethod.run(methodCode, methodArgs, frame);
    if (result != null) {
        return;
    }
    frame.vm.run(methodCode, methodArgs.frameArgs, true);
}
Also used : MethodInsnNode(org.objectweb.asm.tree.MethodInsnNode) MethodCode(io.nuls.contract.vm.code.MethodCode) ObjectRef(io.nuls.contract.vm.ObjectRef) MethodArgs(io.nuls.contract.vm.MethodArgs) Result(io.nuls.contract.vm.Result)

Example 10 with Result

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

the class NativeMethod method result.

public static Result result(MethodCode methodCode, Object resultValue, Frame frame) {
    VariableType variableType = methodCode.returnVariableType;
    Result result = new Result(variableType);
    if (variableType.isNotVoid()) {
        result.value(resultValue);
        if (resultValue == null) {
            frame.operandStack.pushRef(null);
        } else if (variableType.isPrimitive()) {
            frame.operandStack.push(resultValue, variableType);
        } else if (resultValue instanceof ObjectRef) {
            frame.operandStack.pushRef((ObjectRef) resultValue);
        } else {
            throw new IllegalArgumentException("unknown result value");
        }
    }
    return result;
}
Also used : VariableType(io.nuls.contract.vm.code.VariableType) ObjectRef(io.nuls.contract.vm.ObjectRef) Result(io.nuls.contract.vm.Result)

Aggregations

Result (io.nuls.contract.vm.Result)63 ObjectRef (io.nuls.contract.vm.ObjectRef)35 VariableType (io.nuls.contract.vm.code.VariableType)12 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 Frame (io.nuls.contract.vm.Frame)1 VM (io.nuls.contract.vm.VM)1 ErrorException (io.nuls.contract.vm.exception.ErrorException)1 ArrayList (java.util.ArrayList)1 AccountState (org.ethereum.core.AccountState)1 DataWord (org.ethereum.vm.DataWord)1