예제 #1
0
        /// <summary>
        /// Emits a XIL-S instruction and assigns an index to it.
        /// </summary>
        /// <param name="xilsi">instruction to emit</param>
        protected virtual void Emit(XILSInstr xilsi)
        {
            xilsi.Index = NextOutputInstructionIndex;
            if (CurInstr != null)
            {
                xilsi.CILRef = CurInstr.CILRef;
            }
            int numOperands = xilsi.OperandTypes.Length;

            for (int i = numOperands - 1; i >= 0; i--)
            {
                TypeDescriptor t = _typeStack.Pop();
                if (!t.Equals(xilsi.OperandTypes[i]))
                {
                    throw new ArgumentException("Incompatible operand types");
                }
            }
            foreach (TypeDescriptor result in xilsi.ResultTypes)
            {
                _typeStack.Push(result);
            }
            OutInstructions.Add(xilsi);
            if (xilsi.Name == InstructionCodes.BranchIfFalse ||
                xilsi.Name == InstructionCodes.BranchIfTrue ||
                xilsi.Name == InstructionCodes.Goto)
            {
                _curBB.Clear();
            }
            else
            {
                _curBB.Add(xilsi);
            }
        }
예제 #2
0
 public virtual XIL3Function Rewrite(XIL3Function func)
 {
     InInstructions = func.Instructions;
     _orgSlotTypes  = func.SlotTypes;
     Rewrite();
     return(new XIL3Function(func.Name, func.Arguments, func.Locals,
                             OutInstructions.ToArray(),
                             OutSlotTypes.ToArray()));
 }
예제 #3
0
 /// <summary>
 /// Emits an instruction and assigns an index to it
 /// </summary>
 /// <param name="i">instruction to emit</param>
 protected void Emit(XIL3Instr i)
 {
     i.Index  = NextOutputInstructionIndex;
     i.CILRef = CurInstr.CILRef;
     OutInstructions.Add(i);
 }