public LambdaMethod (TypeContainer host, Parameters parameters,
ToplevelBlock block, Type return_type, Type delegate_type,
Location loc)
- : base (host, parameters, block,
- return_type, delegate_type, loc)
+ : base (host, parameters, block, return_type, delegate_type, loc)
{
}
public override Expression CreateExpressionTree (EmitContext ec)
{
- return Block.CreateExpressionTree (ec);
+ //
+ // Remove IL method implementation when expression tree is requested
+ //
+ method.Parent.PartialContainer.RemoveMethod (method);
+
+ Expression args = parameters.CreateExpressionTree (ec, loc);
+ Expression expr = Block.CreateExpressionTree (ec);
+ if (expr == null)
+ return null;
+
+ ArrayList arguments = new ArrayList (2);
+ arguments.Add (new Argument (expr));
+ arguments.Add (new Argument (args));
+ return CreateExpressionFactoryCall ("Lambda",
+ new TypeArguments (loc, new TypeExpression (type, loc)),
+ arguments);
}
}
public override void Emit (EmitContext ec)
{
- if (ec.ReturnType == TypeManager.void_type)
+ if (ec.ReturnType == TypeManager.void_type) {
((ExpressionStatement) Expr).EmitStatement (ec);
- else
- base.Emit (ec);
+ ec.ig.Emit (OpCodes.Ret);
+ return;
+ }
+
+ base.Emit (ec);
}
protected override bool DoResolve (EmitContext ec)
if (Expr == null)
return false;
- if (Expr is ExpressionStatement) {
- if (Expr is Invocation)
- return TypeManager.IsEqual (Expr.Type, TypeManager.void_type);
+ if (Expr is ExpressionStatement)
return true;
- }
Expr.Error_InvalidExpressionStatement ();
return false;