X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fmcs%2Fexpression.cs;h=aadf818066d2ad89b3d82a2b8488256753e09d9c;hb=65efedb894bbee9fed3a24a975586ee51e0016f2;hp=bfba44fbb8c656079254fc346737ea8a4af5fd3e;hpb=372145ed24d6fbbcdab2ff50f0d75a7bbf73e31f;p=mono.git diff --git a/mcs/mcs/expression.cs b/mcs/mcs/expression.cs index bfba44fbb8c..aadf818066d 100644 --- a/mcs/mcs/expression.cs +++ b/mcs/mcs/expression.cs @@ -7023,6 +7023,16 @@ namespace Mono.CSharp } } + bool statement_resolve; + public override ExpressionStatement ResolveStatement (BlockContext bc) + { + statement_resolve = true; + var es = base.ResolveStatement (bc); + statement_resolve = false; + + return es; + } + protected override Expression DoResolve (ResolveContext rc) { ResolveConditionalAccessReceiver (rc); @@ -7111,7 +7121,7 @@ namespace Mono.CSharp var method = mg.BestCandidate; type = mg.BestCandidateReturnType; - if (conditional_access_receiver) + if (conditional_access_receiver && !statement_resolve) type = LiftMemberType (ec, type); if (arguments == null && method.DeclaringType.BuiltinType == BuiltinTypeSpec.Type.Object && method.Name == Destructor.MetadataName) { @@ -7173,7 +7183,7 @@ namespace Mono.CSharp args.Insert (0, new Argument (inst.Resolve (ec), mod)); } } else { // is SimpleName - if (ec.IsStatic) { + if (ec.IsStatic || ec.HasAny (ResolveContext.Options.FieldInitializerScope | ResolveContext.Options.BaseInitializer)) { args.Insert (0, new Argument (new TypeOf (ec.CurrentType, loc).Resolve (ec), Argument.AType.DynamicTypeName)); } else { args.Insert (0, new Argument (new This (loc).Resolve (ec))); @@ -7862,6 +7872,8 @@ namespace Mono.CSharp { } + public bool NoEmptyInterpolation { get; set; } + public ComposedTypeSpecifier Rank { get { return this.rank; @@ -8398,11 +8410,32 @@ namespace Mono.CSharp public override void Emit (EmitContext ec) { + if (!NoEmptyInterpolation && EmitOptimizedEmpty (ec)) + return; + var await_field = EmitToFieldSource (ec); if (await_field != null) await_field.Emit (ec); } + bool EmitOptimizedEmpty (EmitContext ec) + { + if (arguments.Count != 1 || dimensions != 1) + return false; + + var c = arguments [0] as Constant; + if (c == null || !c.IsZeroInteger) + return false; + + var m = ec.Module.PredefinedMembers.ArrayEmpty.Get (); + if (m == null || ec.CurrentType.MemberDefinition.DeclaringAssembly == m.DeclaringType.MemberDefinition.DeclaringAssembly) + return false; + + m = m.MakeGenericMethod (ec.MemberContext, array_element_type); + ec.Emit (OpCodes.Call, m); + return true; + } + protected sealed override FieldExpr EmitToFieldSource (EmitContext ec) { if (first_emit != null) {