Mono.CSharp.DynamicExpressionStatement.EmitCall C# (CSharp) Method

EmitCall() protected method

protected EmitCall ( EmitContext ec, Mono.CSharp.Expression binder, Arguments arguments, bool isStatement ) : void
ec EmitContext
binder Mono.CSharp.Expression
arguments Arguments
isStatement bool
return void
		protected void EmitCall (EmitContext ec, Expression binder, Arguments arguments, bool isStatement)
		{
			int dyn_args_count = arguments == null ? 0 : arguments.Count;
			TypeExpr site_type = CreateSiteType (ec, arguments, dyn_args_count, isStatement);
			var field = CreateSiteField (ec, site_type);
			if (field == null)
				return;

			FieldExpr site_field_expr = new FieldExpr (field, loc);

			SymbolWriter.OpenCompilerGeneratedBlock (ec);

			Arguments args = new Arguments (1);
			args.Add (new Argument (binder));
			StatementExpression s = new StatementExpression (new SimpleAssign (site_field_expr, new Invocation (new MemberAccess (site_type, "Create"), args)));
			
			BlockContext bc = new BlockContext (ec.MemberContext, null, TypeManager.void_type);		
			if (s.Resolve (bc)) {
				Statement init = new If (new Binary (Binary.Operator.Equality, site_field_expr, new NullLiteral (loc), loc), s, loc);
				init.Emit (ec);
			}

			args = new Arguments (1 + dyn_args_count);
			args.Add (new Argument (site_field_expr));
			if (arguments != null) {
				foreach (Argument a in arguments) {
					if (a is NamedArgument) {
						// Name is not valid in this context
						args.Add (new Argument (a.Expr, a.ArgType));
						continue;
					}

					args.Add (a);
				}
			}

			Expression target = new DelegateInvocation (new MemberAccess (site_field_expr, "Target", loc).Resolve (bc), args, loc).Resolve (bc);
			if (target != null)
				target.Emit (ec);

			SymbolWriter.CloseCompilerGeneratedBlock (ec);
		}