Search in sources :

Example 1 with VariableType

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

the class Heap method getArray.

public Object getArray(ObjectRef arrayRef, int index) {
    int chunkNum = index / 1024;
    int chunkIndex = index % 1024;
    Object arrayChunk = getArrayChunk(arrayRef, chunkNum, false);
    Object value = Array.get(arrayChunk, chunkIndex);
    if (value == null && arrayRef.getDimensions().length > 1) {
        int[] dimensions = new int[arrayRef.getDimensions().length - 1];
        System.arraycopy(arrayRef.getDimensions(), 1, dimensions, 0, arrayRef.getDimensions().length - 1);
        VariableType variableType = VariableType.valueOf(arrayRef.getVariableType().getDesc().substring(1));
        value = newArray(variableType, dimensions);
        putArray(arrayRef, index, value);
    }
    return value;
}
Also used : VariableType(io.nuls.contract.vm.code.VariableType)

Example 2 with VariableType

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

the class NativeClass method getInterfaces.

/**
 * override
 *
 * @see Class#getInterfaces()
 */
private static Result getInterfaces(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());
    }
    ObjectRef array;
    if (!variableType.isPrimitiveType()) {
        ClassCode classCode = frame.methodArea.loadClass(variableType.getType());
        List<String> interfaces = classCode.interfaces;
        int length = interfaces.size();
        array = frame.heap.newArray(VariableType.valueOf("[Ljava/lang/Class;"), length);
        for (int i = 0; i < length; i++) {
            String interfaceName = interfaces.get(i);
            VariableType interfaceType = VariableType.valueOf(interfaceName);
            ObjectRef ref = frame.heap.getClassRef(interfaceType.getDesc());
            frame.heap.putArray(array, i, ref);
        }
    } else {
        array = frame.heap.newArray(VariableType.valueOf("[Ljava/lang/Class;"), 0);
    }
    Result result = NativeMethod.result(methodCode, array, frame);
    return result;
}
Also used : ClassCode(io.nuls.contract.vm.code.ClassCode) VariableType(io.nuls.contract.vm.code.VariableType) ObjectRef(io.nuls.contract.vm.ObjectRef) Result(io.nuls.contract.vm.Result)

Example 3 with VariableType

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

the class NativeClass method isInterface.

/**
 * native
 *
 * @see Class#isInterface()
 */
private static Result isInterface(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 = false;
    if (!variableType.isArray() && !variableType.isPrimitiveType()) {
        ClassCode classCode = frame.methodArea.loadClass(variableType.getType());
        b = classCode.isInterface;
    }
    Result result = NativeMethod.result(methodCode, b, frame);
    return result;
}
Also used : ClassCode(io.nuls.contract.vm.code.ClassCode) VariableType(io.nuls.contract.vm.code.VariableType) ObjectRef(io.nuls.contract.vm.ObjectRef) Result(io.nuls.contract.vm.Result)

Example 4 with VariableType

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

the class NativeClass method getGenericSignature0.

/**
 * native
 *
 * @see Class#getGenericSignature0()
 */
private static Result getGenericSignature0(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());
    }
    ObjectRef ref = null;
    if (!variableType.isPrimitiveType()) {
        ClassCode classCode = frame.methodArea.loadClass(variableType.getType());
        String signature = classCode.signature;
        ref = frame.heap.newString(signature);
    }
    Result result = NativeMethod.result(methodCode, ref, frame);
    return result;
}
Also used : ClassCode(io.nuls.contract.vm.code.ClassCode) VariableType(io.nuls.contract.vm.code.VariableType) ObjectRef(io.nuls.contract.vm.ObjectRef) Result(io.nuls.contract.vm.Result)

Example 5 with VariableType

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

the class NativeClass method getComponentType.

/**
 * native
 *
 * @see Class#getComponentType()
 */
private static Result getComponentType(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());
    }
    ObjectRef classRef = null;
    if (variableType.isArray()) {
        classRef = frame.heap.getClassRef(variableType.getComponentType().getDesc());
    }
    Result result = NativeMethod.result(methodCode, classRef, 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