Exemple #1
0
        /**
         * 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);
        }