GetReturnLabel() public method

public GetReturnLabel ( ) : LabelTarget
return System.Linq.Expressions.LabelTarget
示例#1
0
        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))));
        }
示例#2
0
        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));
        }
示例#3
0
 public LabelTarget GetReturnLabel()
 {
     if (returnLabel != null)
     {
         return(returnLabel);
     }
     if (parent == null)
     {
         return(null);
     }
     return(parent.GetReturnLabel());
 }
示例#4
0
        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);
        }