/** * int write(int fd,ByteBuffer src) */ public static void write(StackFrame frame) { int fd = (int)frame.getLocalVariables()[1]; Heap.HeapReference byteBufRef = (Heap.HeapReference) frame.getLocalVariables()[2]; if (fd != 2){ throw new ToyVMException("Can only handle stdout(2), have " + fd, frame); } // need to get the actual byte array StackFrame frame2 = new StackFrame(frame); ClassFile byteBufferClass = byteBufRef.type; string getterType = "()[B"; string getterName = "array"; MethodInfo method = byteBufferClass.getMethod(getterName,getterType); if (method == null){ foreach (MethodInfo m in byteBufferClass.getMethods()){ if (log.IsDebugEnabled) log.DebugFormat(m.ToString()); } throw new ToyVMException("Unable to find " + getterName + getterType,frame); } frame2.setMethod(byteBufferClass,method); frame2.getLocalVariables()[0] = byteBufRef; byteBufferClass.execute(getterName,getterType,frame2); Heap.HeapReference byteArrRef = (Heap.HeapReference) frame.popOperand(); byte[] bytes = (byte[]) byteArrRef.obj; for (int i = 0; i < bytes.Length; i++){ Console.Write((char)bytes[i]); } frame.getPrev().pushOperand(bytes.Length); }