Search in sources :

Example 6 with ClassCode

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

the class VMFactory method initVM.

private static VM initVM() {
    VM vm = new VM();
    Map<String, ClassCode> classCodes = new LinkedHashMap<>(1024);
    for (String className : CLINIT_CLASSES) {
        ClassCode classCode = ClassCodeLoader.loadFromResource(className);
        classCodes.put(classCode.name, classCode);
    }
    vm.methodArea.loadClassCodes(classCodes);
    return vm;
}
Also used : ClassCode(io.nuls.contract.vm.code.ClassCode) LinkedHashMap(java.util.LinkedHashMap)

Example 7 with ClassCode

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

Example 8 with ClassCode

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

the class ProgramExecutorImpl method getEventConstructor.

private static Set<ProgramMethod> getEventConstructor(Map<String, ClassCode> classCodes) {
    Map<String, MethodCode> methodCodes = new LinkedHashMap<>();
    getEventClassCodes(classCodes).forEach(classCode -> {
        for (MethodCode methodCode : classCode.methods) {
            if (methodCode.isConstructor) {
                methodCodes.put(methodCode.fullName, methodCode);
            }
        }
    });
    return methodCodes.values().stream().filter(methodCode -> methodCode.isConstructor).map(methodCode -> {
        ProgramMethod method = new ProgramMethod();
        method.setName(methodCode.classCode.simpleName);
        method.setDesc(methodCode.normalDesc);
        method.setArgs(methodCode.args);
        method.setReturnArg(methodCode.returnArg);
        method.setView(methodCode.hasViewAnnotation());
        method.setPayable(methodCode.hasPayableAnnotation());
        method.setEvent(true);
        return method;
    }).collect(Collectors.toSet());
}
Also used : StateSource(org.ethereum.db.StateSource) java.util(java.util) VMFactory(io.nuls.contract.vm.VMFactory) Hex(org.spongycastle.util.encoders.Hex) LoggerFactory(org.slf4j.LoggerFactory) ByteArrayWrapper(org.ethereum.db.ByteArrayWrapper) StringUtils(org.apache.commons.lang3.StringUtils) VM(io.nuls.contract.vm.VM) Block(org.ethereum.core.Block) DefaultConfig(org.ethereum.config.DefaultConfig) SystemProperties(org.ethereum.config.SystemProperties) FastByteComparisons(org.ethereum.util.FastByteComparisons) BigInteger(java.math.BigInteger) MethodCode(io.nuls.contract.vm.code.MethodCode) ErrorException(io.nuls.contract.vm.exception.ErrorException) NativeAddress(io.nuls.contract.vm.natives.io.nuls.contract.sdk.NativeAddress) io.nuls.contract.vm.program(io.nuls.contract.vm.program) Logger(org.slf4j.Logger) DataWord(org.ethereum.vm.DataWord) Result(io.nuls.contract.vm.Result) DBService(io.nuls.db.service.DBService) Repository(org.ethereum.core.Repository) Collectors(java.util.stream.Collectors) VMContext(io.nuls.contract.util.VMContext) ObjectRef(io.nuls.contract.vm.ObjectRef) Source(org.ethereum.datasource.Source) Constants(io.nuls.contract.vm.util.Constants) AccountState(org.ethereum.core.AccountState) ClassCode(io.nuls.contract.vm.code.ClassCode) ClassCodeLoader(io.nuls.contract.vm.code.ClassCodeLoader) CommonConfig(org.ethereum.config.CommonConfig) LevelDbDataSource(org.ethereum.datasource.leveldb.LevelDbDataSource) ClassCodes(io.nuls.contract.vm.code.ClassCodes) RepositoryRoot(org.ethereum.db.RepositoryRoot) BlockHeaderDto(io.nuls.contract.entity.BlockHeaderDto) MethodCode(io.nuls.contract.vm.code.MethodCode)

Example 9 with ClassCode

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

the class ProgramExecutorImpl method getProgramMethodCodes.

public static List<MethodCode> getProgramMethodCodes(Map<String, ClassCode> classCodes) {
    Map<String, MethodCode> methodCodes = new LinkedHashMap<>();
    ClassCode contractClassCode = getContractClassCode(classCodes);
    if (contractClassCode != null) {
        contractMethods(methodCodes, classCodes, contractClassCode, false);
    }
    return methodCodes.values().stream().collect(Collectors.toList());
}
Also used : ClassCode(io.nuls.contract.vm.code.ClassCode) MethodCode(io.nuls.contract.vm.code.MethodCode)

Example 10 with ClassCode

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

the class LoadJarTest method test.

@Test
public void test() {
    InputStream in = null;
    try {
        // in = new FileInputStream(LoadJarTest.class.getResource("/contract.jar").getFile());
        in = new FileInputStream(LoadJarTest.class.getResource("/nrc20.jar").getFile());
        byte[] contractCode = IOUtils.toByteArray(in);
        Map<String, ClassCode> codeMap = ClassCodeLoader.loadJarCache(contractCode);
        // for(String key : codeMap.keySet()) {
        // System.out.println("key: " + key);
        // }
        // io/nuls/vote/contract/event/AddItemEvent
        // io/nuls/vote/contract/func/BaseVote
        // io/nuls/vote/contract/VoteContract
        // io/nuls/contract/token/SimpleToken
        // ClassCode classCode = codeMap.get("io/nuls/vote/contract/event/AddItemEvent");
        // ClassCode classCode = codeMap.get("io/nuls/vote/contract/func/BaseVote");
        // ClassCode classCode = codeMap.get("io/nuls/vote/contract/VoteContract");
        ClassCode classCode = codeMap.get("io/nuls/contract/token/SimpleToken");
        List<MethodCode> methods = classCode.methods;
        for (MethodCode methodCode : methods) {
            System.out.println("Method Name: " + methodCode.fullName);
            InsnList instructions = methodCode.instructions;
            ListIterator<AbstractInsnNode> iterator = instructions.iterator();
            AbstractInsnNode node;
            while (iterator.hasNext()) {
                node = iterator.next();
                String desc = getDesc(node);
                int opcode = node.getOpcode();
                OpCode opCode = OpCode.valueOf(opcode);
                if (opCode != null) {
                    System.out.println(OpCode.valueOf(opcode) + " " + desc);
                }
            }
            System.out.println();
            System.out.println();
            System.out.println("////////////////////////////////////////////////////////////////////////");
            System.out.println("////////////////////////////////////////////////////////////////////////");
            System.out.println("////////////////////////////////////////////////////////////////////////");
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (in != null) {
            try {
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
Also used : FileInputStream(java.io.FileInputStream) InputStream(java.io.InputStream) IOException(java.io.IOException) FileInputStream(java.io.FileInputStream) IOException(java.io.IOException) ClassCode(io.nuls.contract.vm.code.ClassCode) OpCode(io.nuls.contract.vm.OpCode) MethodCode(io.nuls.contract.vm.code.MethodCode) Test(org.junit.Test)

Aggregations

ClassCode (io.nuls.contract.vm.code.ClassCode)19 MethodCode (io.nuls.contract.vm.code.MethodCode)7 ObjectRef (io.nuls.contract.vm.ObjectRef)6 Result (io.nuls.contract.vm.Result)6 VariableType (io.nuls.contract.vm.code.VariableType)4 VM (io.nuls.contract.vm.VM)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 FieldCode (io.nuls.contract.vm.code.FieldCode)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 DBService (io.nuls.db.service.DBService)1