X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fmcs%2Flambda.cs;h=7868c6a2c9d49b576a63cc69b088fd6e9c722a2d;hb=a4a84a1325565b912b1fe4d19d40cfd0affa1a3a;hp=e8ad15f5934d41ae89a1661f512a357d59888548;hpb=00b7eadc033532b6ee610e38129f21eb7c3769d7;p=mono.git diff --git a/mcs/mcs/lambda.cs b/mcs/mcs/lambda.cs index e8ad15f5934..7868c6a2c9d 100644 --- a/mcs/mcs/lambda.cs +++ b/mcs/mcs/lambda.cs @@ -7,6 +7,7 @@ // Dual licensed under the terms of the MIT X11 or GNU GPL // // Copyright 2007-2008 Novell, Inc +// Copyright 2011 Xamarin Inc // #if STATIC @@ -33,7 +34,7 @@ namespace Mono.CSharp { if (ec.IsInProbingMode) return this; - BlockContext bc = new BlockContext (ec.MemberContext, ec.ConstructorBlock, TypeManager.void_type) { + BlockContext bc = new BlockContext (ec.MemberContext, ec.ConstructorBlock, ec.BuiltinTypes.Void) { CurrentAnonymousMethod = ec.CurrentAnonymousMethod }; @@ -64,7 +65,7 @@ namespace Mono.CSharp { AParametersCollection d_params = Delegate.GetParameters (delegateType); if (HasExplicitParameters) { - if (!VerifyExplicitParameters (ec, delegateType, d_params)) + if (!VerifyExplicitParameters (ec, tic, delegateType, d_params)) return null; return Parameters; @@ -74,13 +75,13 @@ namespace Mono.CSharp { // If L has an implicitly typed parameter list we make implicit parameters explicit // Set each parameter of L is given the type of the corresponding parameter in D // - if (!VerifyParameterCompatibility (ec, delegateType, d_params, ec.IsInProbingMode)) + if (!VerifyParameterCompatibility (ec, tic, delegateType, d_params, ec.IsInProbingMode)) return null; TypeSpec [] ptypes = new TypeSpec [Parameters.Count]; for (int i = 0; i < d_params.Count; i++) { // D has no ref or out parameters - if ((d_params.FixedParameters [i].ModFlags & Parameter.Modifier.ISBYREF) != 0) + if ((d_params.FixedParameters[i].ModFlags & Parameter.Modifier.RefOutMask) != 0) return null; TypeSpec d_param = d_params.Types [i]; @@ -123,6 +124,11 @@ namespace Mono.CSharp { { return "lambda expression"; } + + public override object Accept (StructuralVisitor visitor) + { + return visitor.Visit (this); + } } class LambdaMethod : AnonymousMethodBody @@ -176,7 +182,7 @@ namespace Mono.CSharp { ExpressionStatement statement; public ContextualReturn (Expression expr) - : base (expr, expr.Location) + : base (expr, expr.StartLocation) { } @@ -185,15 +191,19 @@ namespace Mono.CSharp { return Expr.CreateExpressionTree (ec); } - public override void Emit (EmitContext ec) + protected override void DoEmit (EmitContext ec) { if (statement != null) { statement.EmitStatement (ec); - ec.Emit (OpCodes.Ret); + if (unwind_protect) + ec.Emit (OpCodes.Leave, ec.CreateReturnLabel ()); + else { + ec.Emit (OpCodes.Ret); + } return; } - base.Emit (ec); + base.DoEmit (ec); } protected override bool DoResolve (BlockContext ec)