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