Search in sources :

Example 16 with VariableType

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

the class NativeClass method isPrimitive.

/**
 * native
 *
 * @see Class#isPrimitive()
 */
private static Result isPrimitive(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());
    }
    boolean b = variableType.isPrimitive();
    Result result = NativeMethod.result(methodCode, b, 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 17 with VariableType

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

the class NativeUtils method toJson.

private static Object toJson(FieldCode fieldCode, Object value, Frame frame) {
    VariableType variableType = fieldCode.variableType;
    if (value == null) {
        return null;
    } else if (variableType.isPrimitive()) {
        return variableType.getPrimitiveValue(value);
    } else if (variableType.isArray()) {
        ObjectRef ref = (ObjectRef) value;
        if (variableType.isPrimitiveType() && variableType.getDimensions() == 1) {
            return frame.heap.getObject(ref);
        } else {
            int length = ref.getDimensions()[0];
            Object[] array = new Object[length];
            for (int i = 0; i < length; i++) {
                Object item = frame.heap.getArray(ref, i);
                if (item != null) {
                    ObjectRef itemRef = (ObjectRef) item;
                    item = frame.heap.runToString(itemRef);
                }
                array[i] = item;
            }
            return array;
        }
    } else {
        ObjectRef ref = (ObjectRef) value;
        return frame.heap.runToString(ref);
    }
}
Also used : VariableType(io.nuls.contract.vm.code.VariableType)

Example 18 with VariableType

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

the class Anewarray method anewarray.

public static void anewarray(Frame frame) {
    TypeInsnNode typeInsnNode = frame.typeInsnNode();
    String className = typeInsnNode.desc;
    int length = frame.operandStack.popInt();
    if (length < 0) {
        frame.throwNegativeArraySizeException();
        return;
    } else {
        ObjectRef arrayRef;
        if (className.contains(Constants.ARRAY_START)) {
            VariableType type = VariableType.valueOf(className);
            int[] dimensions = new int[type.getDimensions() + 1];
            dimensions[0] = length;
            VariableType variableType = VariableType.valueOf(Constants.ARRAY_START + className);
            arrayRef = frame.heap.newArray(variableType, dimensions);
        } else {
            VariableType variableType = VariableType.valueOf(Constants.ARRAY_PREFIX + className + Constants.ARRAY_SUFFIX);
            arrayRef = frame.heap.newArray(variableType, length);
        }
        frame.operandStack.pushRef(arrayRef);
    // Log.opcode(frame.getCurrentOpCode(), arrayRef);
    }
}
Also used : VariableType(io.nuls.contract.vm.code.VariableType) TypeInsnNode(org.objectweb.asm.tree.TypeInsnNode) ObjectRef(io.nuls.contract.vm.ObjectRef)

Example 19 with VariableType

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

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

the class NativeArray method newArray.

/**
 * native
 *
 * @see Array#newArray(Class, int)
 */
private static Result newArray(MethodCode methodCode, MethodArgs methodArgs, Frame frame) {
    ObjectRef componentType = (ObjectRef) methodArgs.invokeArgs[0];
    int length = (int) methodArgs.invokeArgs[1];
    VariableType variableType = VariableType.valueOf("[" + componentType.getRef());
    ObjectRef array = frame.heap.newArray(variableType, length);
    Result result = NativeMethod.result(methodCode, array, frame);
    return result;
}
Also used : VariableType(io.nuls.contract.vm.code.VariableType) ObjectRef(io.nuls.contract.vm.ObjectRef) 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