Search in sources :

Example 1 with MethodArgs

use of io.nuls.contract.vm.MethodArgs 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 2 with MethodArgs

use of io.nuls.contract.vm.MethodArgs 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 3 with MethodArgs

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

the class Invokeinterface method invokeinterface.

public static void invokeinterface(Frame frame) {
    MethodInsnNode methodInsnNode = frame.methodInsnNode();
    String interfaceName = methodInsnNode.owner;
    String interfaceMethodName = methodInsnNode.name;
    String interfaceMethodDesc = methodInsnNode.desc;
    List<VariableType> variableTypes = VariableType.parseArgs(interfaceMethodDesc);
    MethodArgs methodArgs = new MethodArgs(variableTypes, frame.operandStack, false);
    ObjectRef objectRef = methodArgs.objectRef;
    if (objectRef == null) {
        frame.throwNullPointerException();
        return;
    }
    String className = objectRef.getVariableType().getType();
    MethodCode methodCode = frame.methodArea.loadMethod(className, interfaceMethodName, interfaceMethodDesc);
    // Log.opcode(frame.getCurrentOpCode(), className, interfaceMethodName, interfaceMethodDesc);
    frame.vm.run(methodCode, methodArgs.frameArgs, true);
}
Also used : VariableType(io.nuls.contract.vm.code.VariableType) MethodInsnNode(org.objectweb.asm.tree.MethodInsnNode) ObjectRef(io.nuls.contract.vm.ObjectRef) MethodCode(io.nuls.contract.vm.code.MethodCode) MethodArgs(io.nuls.contract.vm.MethodArgs)

Example 4 with MethodArgs

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

the class Invokevirtual method invokevirtual.

public static void invokevirtual(Frame frame) {
    MethodInsnNode methodInsnNode = frame.methodInsnNode();
    String className = methodInsnNode.owner;
    String methodName = methodInsnNode.name;
    String methodDesc = methodInsnNode.desc;
    List<VariableType> variableTypes = VariableType.parseArgs(methodDesc);
    MethodArgs methodArgs = new MethodArgs(variableTypes, frame.operandStack, false);
    ObjectRef objectRef = methodArgs.objectRef;
    if (objectRef == null) {
        frame.throwNullPointerException();
        return;
    }
    String type = objectRef.getVariableType().getType();
    if (!Objects.equals(className, type)) {
        if (objectRef.getVariableType().isPrimitiveType()) {
        } else {
            className = type;
        }
    }
    if (objectRef.isArray()) {
        className = Constants.OBJECT_CLASS_NAME;
    }
    MethodCode methodCode = frame.methodArea.loadMethod(className, methodName, methodDesc);
    // Log.opcode(frame.getCurrentOpCode(), objectRef, methodName, methodDesc);
    Result result = NativeMethod.run(methodCode, methodArgs, frame);
    if (result != null) {
        return;
    }
    frame.vm.run(methodCode, methodArgs.frameArgs, true);
}
Also used : VariableType(io.nuls.contract.vm.code.VariableType) MethodInsnNode(org.objectweb.asm.tree.MethodInsnNode) ObjectRef(io.nuls.contract.vm.ObjectRef) MethodCode(io.nuls.contract.vm.code.MethodCode) MethodArgs(io.nuls.contract.vm.MethodArgs) Result(io.nuls.contract.vm.Result)

Aggregations

MethodArgs (io.nuls.contract.vm.MethodArgs)4 MethodCode (io.nuls.contract.vm.code.MethodCode)4 MethodInsnNode (org.objectweb.asm.tree.MethodInsnNode)4 ObjectRef (io.nuls.contract.vm.ObjectRef)3 Result (io.nuls.contract.vm.Result)3 VariableType (io.nuls.contract.vm.code.VariableType)2