Search in sources :

Example 21 with VariableType

use of io.nuls.contract.vm.code.VariableType 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

VariableType (io.nuls.contract.vm.code.VariableType)21 ObjectRef (io.nuls.contract.vm.ObjectRef)18 Result (io.nuls.contract.vm.Result)12 ClassCode (io.nuls.contract.vm.code.ClassCode)4 TypeInsnNode (org.objectweb.asm.tree.TypeInsnNode)3 MethodArgs (io.nuls.contract.vm.MethodArgs)2 MethodCode (io.nuls.contract.vm.code.MethodCode)2 MethodInsnNode (org.objectweb.asm.tree.MethodInsnNode)2 ProgramMethodArg (io.nuls.contract.vm.program.ProgramMethodArg)1 ArrayList (java.util.ArrayList)1 List (java.util.List)1 MultiANewArrayInsnNode (org.objectweb.asm.tree.MultiANewArrayInsnNode)1