示例#1
0
        internal override void Emit(EmitContext ec)
        {
            var ig           = ec.ig;
            var false_target = ig.DefineLabel();
            var end_target   = ig.DefineLabel();

            test.Emit(ec);
            ig.Emit(OpCodes.Brfalse, false_target);

            if_true.Emit(ec);
            ig.Emit(OpCodes.Br, end_target);

            ig.MarkLabel(false_target);
            if_false.Emit(ec);

            ig.MarkLabel(end_target);
        }
示例#2
0
 internal void EmitBody(EmitContext ec)
 {
     body.Emit(ec);
     EmitPopIfNeeded(ec);
     ec.ig.Emit(OpCodes.Ret);
 }
示例#3
0
		void EmitNullEquality (EmitContext ec, Expression e)
		{
			var ig = ec.ig;

			if (IsLiftedToNull) {
				e.Emit (ec);
				if (e.Type != typeof (void))
					ig.Emit (OpCodes.Pop);

				ec.EmitNullableNew (typeof (bool?));
				return;
			}

			var se = ec.EmitStored (e);
			ec.EmitNullableHasValue (se);
			if (NodeType == ExpressionType.Equal) {
				ig.Emit (OpCodes.Ldc_I4_0);
				ig.Emit (OpCodes.Ceq);
			}		
		}
示例#4
0
 public void Emit(Expression expression)
 {
     expression.Emit(this);
 }
示例#5
0
 void EmitFieldAssignment(EmitContext ec, FieldInfo field, LocalBuilder local)
 {
     ec.EmitLoadSubject(local);
     expression.Emit(ec);
     ec.ig.Emit(OpCodes.Stfld, field);
 }
示例#6
0
 void EmitArrayAccess(EmitContext ec)
 {
     left.Emit(ec);
     right.Emit(ec);
     ec.ig.Emit(OpCodes.Ldelem, this.Type);
 }
示例#7
0
 public void EmitLoadEnum(Expression expression)
 {
     expression.Emit(this);
     ig.Emit(OpCodes.Box, expression.Type);
 }
示例#8
0
 void EmitArrayLength(EmitContext ec)
 {
     operand.Emit(ec);
     ec.ig.Emit(OpCodes.Ldlen);
 }