Пример #1
0
        public EmitLabel DefineLabel()
        {
            var label = new EmitLabel();

            labels.Add(label);
            return(label);
        }
Пример #2
0
        public EmitInstruction Emit(IEmitOpCodeLabel opCode, EmitLabel label)
        {
            var instruction = new EmitInstruction(opCode, label);

            AddInstruction(instruction);
            return(instruction);
        }
Пример #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);
            }
        }
Пример #4
0
 internal void AddLabel(EmitLabel label)
 {
     if (labels == null)
     {
         labels = new List <EmitLabel>();
     }
     labels.Add(label);
 }
Пример #5
0
 public EmitLabel DefineLabel()
 {
     var label = new EmitLabel();
     labels.Add(label);
     return label;
 }
Пример #6
0
 public void MarkLabel(EmitLabel label)
 {
     pendingLabels.Add(label);
 }
Пример #7
0
 public EmitInstruction Emit(IEmitOpCodeLabelArray opCode, EmitLabel[] labels)
 {
     var instruction = new EmitInstruction(opCode, labels);
     AddInstruction(instruction);
     return instruction;
 }
Пример #8
0
 public EmitInstruction Emit(IEmitOpCodeLabel opCode, EmitLabel label)
 {
     var instruction = new EmitInstruction(opCode, label);
     AddInstruction(instruction);
     return instruction;
 }
Пример #9
0
 public void MarkLabel(EmitLabel label)
 {
     pendingLabels.Add(label);
 }
Пример #10
0
 internal void AddLabel(EmitLabel label)
 {
     if (labels == null)
         labels = new List<EmitLabel>();
     labels.Add(label);
 }