/// <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); } }
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())); }
/// <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); }