Expr ILastStatementVisitor <Expr> .Visit(LastStatement.Return lastStatement) { var returnLabel = scope.GetReturnLabel(); if (returnLabel == null) { return(Expr.Empty()); } var returnValues = lastStatement.Values .Select(expr => Expr.Convert(expr.Visit(this), typeof(object))).ToArray(); if (returnValues.Length == 0) { return(Expr.Return(returnLabel)); } if (returnValues.Length == 1) { return(Expr.Return(returnLabel, returnValues[0])); } return(Expr.Return( returnLabel, Expr.New(MemberInfos.NewVarargs, Expr.NewArrayInit(typeof(object), returnValues)))); }
public Expression <Func <dynamic> > Compile(Block block) { scope = Scope.CreateRoot(); var blockExpr = Visit(block); var expr = Expr.Block(blockExpr, Expr.Label(scope.GetReturnLabel(), Expr.Constant(null))); return(Expr.Lambda <Func <dynamic> >(expr)); }
public LabelTarget GetReturnLabel() { if (returnLabel != null) { return(returnLabel); } if (parent == null) { return(null); } return(parent.GetReturnLabel()); }
Expr Visit(string name, FunctionBody function) { var parentScope = scope; scope = Scope.CreateFunctionChild(scope); var parameters = function.Parameters.Select(p => scope.AddLocal(p)).ToList(); if (function.Varargs) { parameters.Add(scope.AddLocal(Constant.VARARGS, typeof(Varargs))); } var bodyExpr = Expr.Block(Visit(function.Body), Expr.Label(scope.GetReturnLabel(), Expr.Constant(null))); var lambdaExpr = Expr.Lambda(bodyExpr, Constant.FUNCTION_PREFIX + name, parameters); scope = parentScope; return(lambdaExpr); }