Ejemplo n.º 1
0
        public override void EmitStatement(EmitContext ec)
        {
            if (conditionalAccessReceiver)
            {
                ec.ConditionalAccess = new ConditionalAccessContext(type, ec.DefineLabel())
                {
                    Statement = true
                };
            }

            var call = new CallEmitter();

            call.InstanceExpression = InstanceExpr;
            call.EmitStatement(ec, method, arguments, loc);

            if (conditionalAccessReceiver)
            {
                ec.CloseConditionalAccess(null);
            }
        }
Ejemplo n.º 2
0
        public override void Emit(EmitContext ec)
        {
            if (conditionalAccessReceiver)
            {
                ec.ConditionalAccess = new ConditionalAccessContext(type, ec.DefineLabel());
            }

            //
            // Invocation on delegates call the virtual Invoke member
            // so we are always `instance' calls
            //
            var call = new CallEmitter();

            call.InstanceExpression = InstanceExpr;
            call.Emit(ec, method, arguments, loc);

            if (conditionalAccessReceiver)
            {
                ec.CloseConditionalAccess(type.IsNullableType && type != method.ReturnType ? type : null);
            }
        }
Ejemplo n.º 3
0
        public override void Emit(EmitContext ec)
        {
            if (conditional_access_receiver)
            {
                ec.ConditionalAccess = new ConditionalAccessContext(type, ec.DefineLabel());
            }

            if (method_group.InstanceExpression == null)
            {
                ec.EmitNull();
            }
            else
            {
                var ie = new InstanceEmitter(method_group.InstanceExpression, false);
                ie.Emit(ec, method_group.ConditionalAccess);
            }

            var delegate_method = method_group.BestCandidate;

            // Any delegate must be sealed
            if (!delegate_method.DeclaringType.IsDelegate && delegate_method.IsVirtual && !method_group.IsBase)
            {
                ec.Emit(OpCodes.Dup);
                ec.Emit(OpCodes.Ldvirtftn, delegate_method);
            }
            else
            {
                ec.Emit(OpCodes.Ldftn, delegate_method);
            }

            ec.Emit(OpCodes.Newobj, constructor_method);

            if (conditional_access_receiver)
            {
                ec.CloseConditionalAccess(null);
            }
        }
Ejemplo n.º 4
0
		public override void EmitStatement (EmitContext ec)
		{
			if (conditionalAccessReceiver) {
				ec.ConditionalAccess = new ConditionalAccessContext (type, ec.DefineLabel ()) {
					Statement = true
				};
			}

			var call = new CallEmitter ();
			call.InstanceExpression = InstanceExpr;
			call.EmitStatement (ec, method, arguments, loc);

			if (conditionalAccessReceiver)
				ec.CloseConditionalAccess (null);
		}
Ejemplo n.º 5
0
		public override void Emit (EmitContext ec)
		{
			if (conditionalAccessReceiver) {
				ec.ConditionalAccess = new ConditionalAccessContext (type, ec.DefineLabel ());
			}

			//
			// Invocation on delegates call the virtual Invoke member
			// so we are always `instance' calls
			//
			var call = new CallEmitter ();
			call.InstanceExpression = InstanceExpr;
			call.Emit (ec, method, arguments, loc);

			if (conditionalAccessReceiver)
				ec.CloseConditionalAccess (type.IsNullableType && type !=  method.ReturnType ? type : null);
		}
Ejemplo n.º 6
0
		public override void Emit (EmitContext ec)
		{
			if (conditional_access_receiver)
				ec.ConditionalAccess = new ConditionalAccessContext (type, ec.DefineLabel ());

			if (method_group.InstanceExpression == null) {
				ec.EmitNull ();
			} else {
				var ie = new InstanceEmitter (method_group.InstanceExpression, false);
				ie.Emit (ec, method_group.ConditionalAccess);
			}

			var delegate_method = method_group.BestCandidate;

			// Any delegate must be sealed
			if (!delegate_method.DeclaringType.IsDelegate && delegate_method.IsVirtual && !method_group.IsBase) {
				ec.Emit (OpCodes.Dup);
				ec.Emit (OpCodes.Ldvirtftn, delegate_method);
			} else {
				ec.Emit (OpCodes.Ldftn, delegate_method);
			}

			ec.Emit (OpCodes.Newobj, constructor_method);

			if (conditional_access_receiver)
				ec.CloseConditionalAccess (null);
		}