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));
}
}
}
}
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;
}
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();
}
}
}
}
Aggregations