X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fmcs%2Fanonymous.cs;h=3ce9b0c9f199189c703238261602f52d1acb5e33;hb=098e88f3a87205d92516a1fe912b6f84164d0a59;hp=80481ed2091f6ba2cf1deb7c25e4c5514ce9e529;hpb=ba3384aa88a389c308d8258e4ae66caaa2856221;p=mono.git diff --git a/mcs/mcs/anonymous.cs b/mcs/mcs/anonymous.cs index 80481ed2091..3ce9b0c9f19 100644 --- a/mcs/mcs/anonymous.cs +++ b/mcs/mcs/anonymous.cs @@ -839,6 +839,11 @@ namespace Mono.CSharp { { GetFieldExpression (ec).EmitAssign (ec, source, leave_copy, false); } + + public void EmitAssignFromStack (EmitContext ec) + { + GetFieldExpression (ec).EmitAssignFromStack (ec); + } } public class HoistedParameter : HoistedVariable @@ -1595,6 +1600,15 @@ namespace Mono.CSharp { if (res && errors != ec.Report.Errors) return null; + if (block.IsAsync && block.Original.ParametersBlock.HasCapturedThis && ec.CurrentAnonymousMethod != null && ec.CurrentAnonymousMethod.block.IsAsync) { + // + // We'll do ldftn to load the fabricated m_X method but + // because we are inside struct the method can be hoisted + // anywhere in the parent scope + // + ec.CurrentBlock.ParametersBlock.HasReferenceToStoreyForInstanceLambdas = true; + } + return res ? this : null; } @@ -1643,9 +1657,10 @@ namespace Mono.CSharp { fc.TryFinally = prev_tf; } - public override void MarkReachable (Reachability rc) + public override Reachability MarkReachable (Reachability rc) { block.MarkReachable (rc); + return rc; } public void SetHasThisAccess () @@ -1798,6 +1813,8 @@ namespace Mono.CSharp { parent = storey = sm; } } + } else if (src_block.ParametersBlock.HasReferenceToStoreyForInstanceLambdas) { + src_block.ParametersBlock.StateMachine.AddParentStoreyReference (ec, storey); } modifiers = storey != null ? Modifiers.INTERNAL : Modifiers.PRIVATE;