Ejemplo n.º 1
0
        public EmitLabel DefineLabel()
        {
            var label = new EmitLabel();

            labels.Add(label);
            return(label);
        }
Ejemplo n.º 2
0
        public EmitInstruction Emit(IEmitOpCodeLabel opCode, EmitLabel label)
        {
            var instruction = new EmitInstruction(opCode, label);

            AddInstruction(instruction);
            return(instruction);
        }
Ejemplo n.º 3
0
        public override void Compile(EmitCompilerContext context, EmitIl il)
        {
            Condition.Compile(context, il);
            var ifNotTrue = il.DefineLabel();

            il.Emit(EmitOpCodes.Brfalse, ifNotTrue);
            Statement.Compile(context, il);
            var statementReturned = il.Instructions.Last().OpCode == EmitOpCodes.Ret;

            if (Else != null)
            {
                EmitLabel end = null;
                if (!statementReturned)
                {
                    end = il.DefineLabel();
                    il.Emit(EmitOpCodes.Br, end);
                }
                il.MarkLabel(ifNotTrue);
                Else.Compile(context, il);
                if (!statementReturned)
                {
                    il.MarkLabel(end);
                    il.Emit(EmitOpCodes.Nop);
                }
            }
            else
            {
                il.MarkLabel(ifNotTrue);
            }
        }
Ejemplo n.º 4
0
 internal void AddLabel(EmitLabel label)
 {
     if (labels == null)
     {
         labels = new List <EmitLabel>();
     }
     labels.Add(label);
 }
Ejemplo n.º 5
0
 public EmitLabel DefineLabel()
 {
     var label = new EmitLabel();
     labels.Add(label);
     return label;
 }
Ejemplo n.º 6
0
 public void MarkLabel(EmitLabel label)
 {
     pendingLabels.Add(label);
 }
Ejemplo n.º 7
0
 public EmitInstruction Emit(IEmitOpCodeLabelArray opCode, EmitLabel[] labels)
 {
     var instruction = new EmitInstruction(opCode, labels);
     AddInstruction(instruction);
     return instruction;
 }
Ejemplo n.º 8
0
 public EmitInstruction Emit(IEmitOpCodeLabel opCode, EmitLabel label)
 {
     var instruction = new EmitInstruction(opCode, label);
     AddInstruction(instruction);
     return instruction;
 }
Ejemplo n.º 9
0
 public void MarkLabel(EmitLabel label)
 {
     pendingLabels.Add(label);
 }
Ejemplo n.º 10
0
 internal void AddLabel(EmitLabel label)
 {
     if (labels == null)
         labels = new List<EmitLabel>();
     labels.Add(label);
 }