use of io.nuls.contract.vm.code.VariableType in project nuls by nuls-io.
the class NativeClass method isPrimitive.
/**
* native
*
* @see Class#isPrimitive()
*/
private static Result isPrimitive(MethodCode methodCode, MethodArgs methodArgs, Frame frame) {
ObjectRef objectRef = methodArgs.objectRef;
VariableType variableType;
if (objectRef.getVariableType().isArray()) {
variableType = objectRef.getVariableType();
} else {
variableType = VariableType.valueOf(objectRef.getRef());
}
boolean b = variableType.isPrimitive();
Result result = NativeMethod.result(methodCode, b, frame);
return result;
}
use of io.nuls.contract.vm.code.VariableType in project nuls by nuls-io.
the class NativeUtils method toJson.
private static Object toJson(FieldCode fieldCode, Object value, Frame frame) {
VariableType variableType = fieldCode.variableType;
if (value == null) {
return null;
} else if (variableType.isPrimitive()) {
return variableType.getPrimitiveValue(value);
} else if (variableType.isArray()) {
ObjectRef ref = (ObjectRef) value;
if (variableType.isPrimitiveType() && variableType.getDimensions() == 1) {
return frame.heap.getObject(ref);
} else {
int length = ref.getDimensions()[0];
Object[] array = new Object[length];
for (int i = 0; i < length; i++) {
Object item = frame.heap.getArray(ref, i);
if (item != null) {
ObjectRef itemRef = (ObjectRef) item;
item = frame.heap.runToString(itemRef);
}
array[i] = item;
}
return array;
}
} else {
ObjectRef ref = (ObjectRef) value;
return frame.heap.runToString(ref);
}
}
use of io.nuls.contract.vm.code.VariableType in project nuls by nuls-io.
the class Anewarray method anewarray.
public static void anewarray(Frame frame) {
TypeInsnNode typeInsnNode = frame.typeInsnNode();
String className = typeInsnNode.desc;
int length = frame.operandStack.popInt();
if (length < 0) {
frame.throwNegativeArraySizeException();
return;
} else {
ObjectRef arrayRef;
if (className.contains(Constants.ARRAY_START)) {
VariableType type = VariableType.valueOf(className);
int[] dimensions = new int[type.getDimensions() + 1];
dimensions[0] = length;
VariableType variableType = VariableType.valueOf(Constants.ARRAY_START + className);
arrayRef = frame.heap.newArray(variableType, dimensions);
} else {
VariableType variableType = VariableType.valueOf(Constants.ARRAY_PREFIX + className + Constants.ARRAY_SUFFIX);
arrayRef = frame.heap.newArray(variableType, length);
}
frame.operandStack.pushRef(arrayRef);
// Log.opcode(frame.getCurrentOpCode(), arrayRef);
}
}
use of io.nuls.contract.vm.code.VariableType in project nuls by nuls-io.
the class Invokeinterface method invokeinterface.
public static void invokeinterface(Frame frame) {
MethodInsnNode methodInsnNode = frame.methodInsnNode();
String interfaceName = methodInsnNode.owner;
String interfaceMethodName = methodInsnNode.name;
String interfaceMethodDesc = methodInsnNode.desc;
List<VariableType> variableTypes = VariableType.parseArgs(interfaceMethodDesc);
MethodArgs methodArgs = new MethodArgs(variableTypes, frame.operandStack, false);
ObjectRef objectRef = methodArgs.objectRef;
if (objectRef == null) {
frame.throwNullPointerException();
return;
}
String className = objectRef.getVariableType().getType();
MethodCode methodCode = frame.methodArea.loadMethod(className, interfaceMethodName, interfaceMethodDesc);
// Log.opcode(frame.getCurrentOpCode(), className, interfaceMethodName, interfaceMethodDesc);
frame.vm.run(methodCode, methodArgs.frameArgs, true);
}
use of io.nuls.contract.vm.code.VariableType in project nuls by nuls-io.
the class NativeArray method newArray.
/**
* native
*
* @see Array#newArray(Class, int)
*/
private static Result newArray(MethodCode methodCode, MethodArgs methodArgs, Frame frame) {
ObjectRef componentType = (ObjectRef) methodArgs.invokeArgs[0];
int length = (int) methodArgs.invokeArgs[1];
VariableType variableType = VariableType.valueOf("[" + componentType.getRef());
ObjectRef array = frame.heap.newArray(variableType, length);
Result result = NativeMethod.result(methodCode, array, frame);
return result;
}
Aggregations