Search in sources :

Example 1 with OpCode

use of io.nuls.contract.vm.OpCode in project nuls by nuls-io.

the class ProgramChecker method checkOpCode.

public static void checkOpCode(MethodCode methodCode) {
    ListIterator<AbstractInsnNode> listIterator = methodCode.instructions.iterator();
    while (listIterator.hasNext()) {
        AbstractInsnNode abstractInsnNode = listIterator.next();
        if (abstractInsnNode != null && abstractInsnNode.getOpcode() > 0) {
            OpCode opCode = OpCode.valueOf(abstractInsnNode.getOpcode());
            boolean nonsupport = false;
            if (opCode == null) {
                nonsupport = true;
            } else {
                switch(opCode) {
                    case JSR:
                    case RET:
                    case INVOKEDYNAMIC:
                    case MONITORENTER:
                    case MONITOREXIT:
                        nonsupport = true;
                        break;
                    default:
                        break;
                }
            }
            if (nonsupport) {
                int line = getLine(abstractInsnNode);
                throw new RuntimeException(String.format("nonsupport opcode: class(%s), line(%d)", methodCode.className, line));
            }
        }
    }
}
Also used : OpCode(io.nuls.contract.vm.OpCode)

Example 2 with OpCode

use of io.nuls.contract.vm.OpCode in project nuls by nuls-io.

the class LoadJarTest method getDesc.

private String getDesc(AbstractInsnNode node) {
    if (node == null) {
        return EMPTY;
    }
    String result;
    switch(node.getType()) {
        case AbstractInsnNode.FIELD_INSN:
            FieldInsnNode field = (FieldInsnNode) node;
            result = field.name + ":" + field.desc;
            break;
        case AbstractInsnNode.LDC_INSN:
            LdcInsnNode ldc = (LdcInsnNode) node;
            Object value = ldc.cst;
            if (value instanceof Type) {
                Type type = (Type) value;
                result = type.getDescriptor();
            } else {
                result = ldc.cst.toString();
            }
            break;
        case AbstractInsnNode.METHOD_INSN:
            MethodInsnNode method = (MethodInsnNode) node;
            result = method.itf + " " + method.owner + "." + method.name + ":" + method.desc;
            break;
        case AbstractInsnNode.TYPE_INSN:
            TypeInsnNode type = (TypeInsnNode) node;
            result = type.desc;
            break;
        case AbstractInsnNode.VAR_INSN:
            VarInsnNode var = (VarInsnNode) node;
            result = String.valueOf(var.var);
            break;
        case AbstractInsnNode.JUMP_INSN:
            JumpInsnNode jump = (JumpInsnNode) node;
            LabelNode label = jump.label;
            AbstractInsnNode next = label.getNext();
            while (true) {
                if (next == null) {
                    result = EMPTY;
                    break;
                }
                int opcode = next.getOpcode();
                if (opcode != -1) {
                    OpCode opCode = OpCode.valueOf(opcode);
                    result = opCode.toString();
                    result += " " + getDesc(next);
                    break;
                }
                next = next.getNext();
            }
            break;
        case AbstractInsnNode.INT_INSN:
            IntInsnNode intInsnNode = (IntInsnNode) node;
            int operand = intInsnNode.operand;
            result = String.valueOf(operand);
            break;
        case AbstractInsnNode.IINC_INSN:
            IincInsnNode iinc = (IincInsnNode) node;
            result = iinc.var + "," + iinc.incr;
            break;
        // break;
        default:
            result = EMPTY;
    }
    return result;
}
Also used : Type(org.objectweb.asm.Type) OpCode(io.nuls.contract.vm.OpCode)

Example 3 with OpCode

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

OpCode (io.nuls.contract.vm.OpCode)3 ClassCode (io.nuls.contract.vm.code.ClassCode)1 MethodCode (io.nuls.contract.vm.code.MethodCode)1 FileInputStream (java.io.FileInputStream)1 IOException (java.io.IOException)1 InputStream (java.io.InputStream)1 Test (org.junit.Test)1 Type (org.objectweb.asm.Type)1