Search in sources :

Example 1 with MethodCode

use of io.nuls.contract.vm.code.MethodCode in project nuls by nuls-io.

the class Heap method runNewObjectWithArgs.

public ObjectRef runNewObjectWithArgs(VariableType variableType, String methodDesc, Object... args) {
    ClassCode classCode = this.vm.methodArea.loadClass(variableType.getType());
    ObjectRef objectRef = newObject(classCode);
    MethodCode methodCode = this.vm.methodArea.loadMethod(objectRef.getVariableType().getType(), Constants.CONSTRUCTOR_NAME, methodDesc);
    if (methodCode == null) {
        throw new RuntimeException(String.format("can't new %s", variableType.getType()));
    }
    Object[] runArgs = new Object[args.length + 1];
    runArgs[0] = objectRef;
    for (int i = 1; i < runArgs.length; i++) {
        runArgs[i] = args[i - 1];
    }
    this.vm.run(methodCode, runArgs, false);
    return objectRef;
}
Also used : ClassCode(io.nuls.contract.vm.code.ClassCode) MethodCode(io.nuls.contract.vm.code.MethodCode)

Example 2 with MethodCode

use of io.nuls.contract.vm.code.MethodCode in project nuls by nuls-io.

the class NativeAbstractStringBuilder method append.

/**
 * override
 *
 * @see AbstractStringBuilder#append(float)
 * @see AbstractStringBuilder#append(double)
 */
private static Result append(MethodCode methodCode, MethodArgs methodArgs, Frame frame) {
    ObjectRef objectRef = methodArgs.objectRef;
    Object a = methodArgs.invokeArgs[0];
    ObjectRef ref = frame.heap.newString(a.toString());
    MethodCode append = frame.methodArea.loadMethod(TYPE, "append", "(Ljava/lang/String;)Ljava/lang/AbstractStringBuilder;");
    frame.vm.run(append, new Object[] { objectRef, ref }, false);
    Result result = NativeMethod.result(methodCode, objectRef, 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 3 with MethodCode

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

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

use of io.nuls.contract.vm.code.MethodCode in project nuls by nuls-io.

the class MethodArea method loadMethod.

public MethodCode loadMethod(String className, String methodName, String methodDesc) {
    String fullName;
    if (StringUtils.isNotEmpty(methodDesc)) {
        fullName = className + "." + methodName + methodDesc;
    } else {
        fullName = className + "." + methodName;
    }
    MethodCode methodCode = INIT_METHOD_CODES.get(fullName);
    if (methodCode != null) {
        return methodCode;
    }
    methodCode = methodCodes.get(fullName);
    if (methodCode != null) {
        return methodCode;
    }
    ClassCode classCode = loadClass(className);
    methodCode = classCode.getMethodCode(methodName, methodDesc);
    if (methodCode == null && classCode.superName != null) {
        methodCode = loadSuperMethod(classCode.superName, methodName, methodDesc);
    }
    if (methodCode == null) {
        for (String interfaceName : classCode.interfaces) {
            methodCode = loadMethod(interfaceName, methodName, methodDesc);
            if (methodCode != null) {
                break;
            }
        }
    }
    methodCodes.put(fullName, methodCode);
    return methodCode;
}
Also used : ClassCode(io.nuls.contract.vm.code.ClassCode) MethodCode(io.nuls.contract.vm.code.MethodCode)

Aggregations

MethodCode (io.nuls.contract.vm.code.MethodCode)15 ObjectRef (io.nuls.contract.vm.ObjectRef)7 Result (io.nuls.contract.vm.Result)7 ClassCode (io.nuls.contract.vm.code.ClassCode)7 MethodArgs (io.nuls.contract.vm.MethodArgs)4 MethodInsnNode (org.objectweb.asm.tree.MethodInsnNode)4 VM (io.nuls.contract.vm.VM)2 VariableType (io.nuls.contract.vm.code.VariableType)2 ErrorException (io.nuls.contract.vm.exception.ErrorException)2 AccountState (org.ethereum.core.AccountState)2 DataWord (org.ethereum.vm.DataWord)2 BlockHeaderDto (io.nuls.contract.entity.BlockHeaderDto)1 VMContext (io.nuls.contract.util.VMContext)1 OpCode (io.nuls.contract.vm.OpCode)1 VMFactory (io.nuls.contract.vm.VMFactory)1 ClassCodeLoader (io.nuls.contract.vm.code.ClassCodeLoader)1 ClassCodes (io.nuls.contract.vm.code.ClassCodes)1 NativeAddress (io.nuls.contract.vm.natives.io.nuls.contract.sdk.NativeAddress)1 io.nuls.contract.vm.program (io.nuls.contract.vm.program)1 Constants (io.nuls.contract.vm.util.Constants)1