Beispiel #1
0
 protected internal override Expression Eval(Context scope)
 {
     return(Expression.Call(
                typeof(RuntimeHelpers).GetMethod("GetItem"),
                Expression.Convert(_target.Eval(scope), typeof(object)),
                Expression.Convert(_index.Eval(scope), typeof(object))
                ));
 }
Beispiel #2
0
        protected internal override Expression Eval(Context scope)
        {
            if (_type == MemberType.MethodCall)
            {
                return(_expr.Eval(scope));
            }

            return(Expression.Dynamic(
                       scope.GetRuntime().GetGetMemberBinder(_name),
                       typeof(object),
                       _expr.Eval(scope)
                       ));
        }
        protected internal override Expression Eval(Context context)
        {
            var fun  = _methodName.Eval(context);
            var args = new List <Expression> {
                fun
            };

            args.AddRange(_argumentList.Select(a => a.Eval(context)));

            if (_methodName.IsMember)
            {
                return(Expression.Dynamic(
                           // Dotted exprs must be simple invoke members, a.b.(c ...)
                           context.GetRuntime().GetInvokeMemberBinder(
                               new InvokeMemberBinderKey(
                                   _methodName.Name,
                                   new CallInfo(_argumentList.ToArray().Length))),
                           typeof(object),
                           args
                           ));
            }

            return(Expression.Dynamic(
                       context.GetRuntime()
                       .GetInvokeBinder(new CallInfo(_argumentList.ToArray().Length)),
                       typeof(object),
                       args
                       ));
        }
        private Expression MakeBody(Context context)
        {
            Expression  body        = _body.Eval(context);
            LabelTarget returnLabel = context.GetReturnLabel();

            if (context.Variables.Count > 0)
            {
                if (returnLabel != null)
                {
                    return(Expression.Block(
                               context.Variables.Select(name => name.Value).ToArray(),
                               body,
                               Expression.Label(context.GetReturnLabel(), Expression.Constant(null))
                               ));
                }
                return(Expression.Block(
                           context.Variables.Select(name => name.Value).ToArray(),
                           body));
            }


            if (returnLabel != null)
            {
                return(Expression.Block(
                           body,
                           Expression.Label(context.GetReturnLabel(), Expression.Constant(null))
                           ));
            }
            return(body);
        }
Beispiel #5
0
        protected internal override Expression Eval(Context scope)
        {
            var variable = scope.GetOrMakeLocal(_name);

            if (_value != null)
            {
                return(Expression.Assign(variable, Expression.Convert(_value.Eval(scope), variable.Type)));
            }

            return(VoidInstance);
        }
Beispiel #6
0
        protected internal override Expression Eval(Context scope)
        {
            var loopscope = new Context(scope, "loop")
            {
                IsLoop    = true,
                LoopBreak = Expression.Label(typeof(object), "loop break")
            };

            return(Expression.Loop(Expression.Block(typeof(object), _body.Eval(loopscope)),
                                   loopscope.LoopBreak));
        }
Beispiel #7
0
        protected internal override Expression Eval(Context scope)
        {
            var left  = _left.Eval(scope);
            var right = _right.Eval(scope);

            ConvertIfNecessary(ref left, ref right);

            return(Expression.Dynamic(
                       scope.GetRuntime().GetBinaryOperationBinder(_binaryOperator),
                       typeof(object),
                       left,
                       right
                       ));
        }
Beispiel #8
0
        protected internal override Expression Eval(Context scope)
        {
            var args = new List <Expression> {
                _target.Eval(scope)
            };

            args.AddRange(_arguments.Select(a => a.Eval(scope)));

            return(Expression.Dynamic(
                       scope.GetRuntime().GetCreateInstanceBinder(
                           new CallInfo(_arguments.Length)),
                       typeof(object),
                       args
                       ));
        }
Beispiel #9
0
        protected internal override Expression Eval(Context scope)
        {
            Expression result;

            result = _elseStatement != null?_elseStatement.Eval(scope) : Expression.Constant(false);

            int index = _tests.Count;

            while (index-- > 0)
            {
                IfStatementTest st = _tests[index];

                result = Expression.Condition(WrapBooleanTest(st.Test.Eval(scope)),
                                              Expression.Convert(st.Body.Eval(scope), typeof(object)),
                                              Expression.Convert(result, typeof(object)));
            }

            return(result);
        }
        protected internal override Expression Eval(Context scope)
        {
            Expression expression = _expression.Eval(scope);

            return(expression);
        }
 protected internal override Expression Eval(Context scope)
 {
     return(_expression.Eval(scope));
 }
Beispiel #12
0
        protected internal override Expression Eval(Context scope)
        {
            scope.ReturnLabel = Expression.Label(typeof(object));

            if (_returnExpression != null)
            {
                var ret = Expression.Return(scope.ReturnLabel, RuntimeHelpers.EnsureObjectResult(_returnExpression.Eval(scope)), typeof(object));
                return(ret);
            }
            return(Expression.Return(scope.ReturnLabel, Expression.Constant(true)));
        }
Beispiel #13
0
 protected internal override Expression Eval(Context scope)
 {
     return(_left.SetVariable(scope, _right.Eval(scope)));
 }