+ site.AddDelegate (d);
+ del_type = new TypeExpression (d.CurrentType, loc);
+ if (targs_for_instance != null) {
+ del_type_instance_access = null;
+ } else {
+ del_type_instance_access = del_type;
+ }
+ } else {
+ d = null;
+ }
+
+ var site_type_decl = new GenericTypeExpr (module.PredefinedTypes.CallSiteGeneric.TypeSpec, new TypeArguments (del_type), loc);
+ var field = site_container.CreateCallSiteField (site_type_decl, loc);
+ if (field == null)
+ return;
+
+ if (del_type_instance_access == null) {
+ var dt = d.CurrentType.DeclaringType.MakeGenericType (module, context_mvars.Types);
+ del_type_instance_access = new TypeExpression (MemberCache.GetMember (dt, d.CurrentType), loc);
+ }
+
+ var instanceAccessExprType = new GenericTypeExpr (module.PredefinedTypes.CallSiteGeneric.TypeSpec,
+ new TypeArguments (del_type_instance_access), loc);
+
+ if (instanceAccessExprType.ResolveAsType (ec.MemberContext) == null)
+ return;
+
+ bool inflate_using_mvar = context_mvars != null && ec.IsAnonymousStoreyMutateRequired;
+
+ TypeSpec gt;
+ if (inflate_using_mvar || context_mvars == null) {
+ gt = site_container.CurrentType;
+ } else {
+ gt = site_container.CurrentType.MakeGenericType (module, context_mvars.Types);
+ }
+
+ // When site container already exists the inflated version has to be
+ // updated manually to contain newly created field
+ if (gt is InflatedTypeSpec && site_container.Fields.Count > 1) {
+ var tparams = gt.MemberDefinition.TypeParametersCount > 0 ? gt.MemberDefinition.TypeParameters : TypeParameterSpec.EmptyTypes;
+ var inflator = new TypeParameterInflator (module, gt, tparams, gt.TypeArguments);
+ gt.MemberCache.AddMember (field.InflateMember (inflator));
+ }
+
+ FieldExpr site_field_expr = new FieldExpr (MemberCache.GetMember (gt, field), loc);
+
+ BlockContext bc = new BlockContext (ec.MemberContext, null, ec.BuiltinTypes.Void);
+ 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 (instanceAccessExprType, "Create"), args)));
+
+ 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) {
+ int arg_pos = 1;
+ foreach (Argument a in arguments) {
+ if (a is NamedArgument) {
+ // Name is not valid in this context
+ args.Add (new Argument (a.Expr, a.ArgType));
+ } else {
+ args.Add (a);
+ }
+
+ if (inflate_using_mvar && a.Type != targs[arg_pos].Type)
+ a.Expr.Type = targs[arg_pos].Type;
+
+ ++arg_pos;
+ }