use of io.nuls.contract.vm.code.MethodCode in project nuls by nuls-io.
the class Heap method runNewObjectWithArgs.
public ObjectRef runNewObjectWithArgs(VariableType variableType, String methodDesc, Object... args) {
ClassCode classCode = this.vm.methodArea.loadClass(variableType.getType());
ObjectRef objectRef = newObject(classCode);
MethodCode methodCode = this.vm.methodArea.loadMethod(objectRef.getVariableType().getType(), Constants.CONSTRUCTOR_NAME, methodDesc);
if (methodCode == null) {
throw new RuntimeException(String.format("can't new %s", variableType.getType()));
}
Object[] runArgs = new Object[args.length + 1];
runArgs[0] = objectRef;
for (int i = 1; i < runArgs.length; i++) {
runArgs[i] = args[i - 1];
}
this.vm.run(methodCode, runArgs, false);
return objectRef;
}
use of io.nuls.contract.vm.code.MethodCode in project nuls by nuls-io.
the class NativeAbstractStringBuilder method append.
/**
* override
*
* @see AbstractStringBuilder#append(float)
* @see AbstractStringBuilder#append(double)
*/
private static Result append(MethodCode methodCode, MethodArgs methodArgs, Frame frame) {
ObjectRef objectRef = methodArgs.objectRef;
Object a = methodArgs.invokeArgs[0];
ObjectRef ref = frame.heap.newString(a.toString());
MethodCode append = frame.methodArea.loadMethod(TYPE, "append", "(Ljava/lang/String;)Ljava/lang/AbstractStringBuilder;");
frame.vm.run(append, new Object[] { objectRef, ref }, false);
Result result = NativeMethod.result(methodCode, objectRef, frame);
return result;
}
use of io.nuls.contract.vm.code.MethodCode in project nuls by nuls-io.
the class Invokestatic method invokestatic.
public static void invokestatic(Frame frame) {
MethodInsnNode methodInsnNode = frame.methodInsnNode();
String className = methodInsnNode.owner;
String methodName = methodInsnNode.name;
String methodDesc = methodInsnNode.desc;
MethodCode methodCode = frame.methodArea.loadMethod(className, methodName, methodDesc);
MethodArgs methodArgs = new MethodArgs(methodCode.argsVariableType, frame.operandStack, true);
// Log.opcode(frame.getCurrentOpCode(), className, methodName, methodDesc);
Result result = NativeMethod.run(methodCode, methodArgs, frame);
if (result != null) {
return;
}
frame.vm.run(methodCode, methodArgs.frameArgs, true);
}
use of io.nuls.contract.vm.code.MethodCode in project nuls by nuls-io.
the class Invokespecial method invokespecial.
public static void invokespecial(Frame frame) {
MethodInsnNode methodInsnNode = frame.methodInsnNode();
String className = methodInsnNode.owner;
String methodName = methodInsnNode.name;
String methodDesc = methodInsnNode.desc;
MethodCode methodCode = frame.methodArea.loadMethod(className, methodName, methodDesc);
MethodArgs methodArgs = new MethodArgs(methodCode.argsVariableType, frame.operandStack, false);
ObjectRef objectRef = methodArgs.objectRef;
if (objectRef == null) {
frame.throwNullPointerException();
return;
}
if (Constants.OBJECT_CLASS_NAME.equals(className) && Constants.CONSTRUCTOR_NAME.equals(methodName)) {
return;
}
Result result = NativeMethod.run(methodCode, methodArgs, frame);
if (result != null) {
return;
}
frame.vm.run(methodCode, methodArgs.frameArgs, true);
}
use of io.nuls.contract.vm.code.MethodCode 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;
}
Aggregations