コード例 #1
0
        private static Expression CompileObjectAssignment(Obj variable, Base value, Scope scope)
        {
            var tempName = scope.FreeVariableName("ref");

            var expressions1 = new List<Base>
            {
                new Assign {Variable = NewValue(tempName), Value = value}
            };

            var propNames = CompileToNames(variable);

            var assignments = propNames.Select(prop => new Assign {Variable = NewValue(prop), Value = NewValue(tempName, prop)});

            expressions1.AddRange(assignments);
            var expressions = expressions1.Select(expr => Compile(expr, scope));

            return Expression.Block(expressions);
        }
コード例 #2
0
        public static Expression CompileChain(Op op, Scope scope)
        {
            //for a chain we need to convert the second param of the first to a local. then we can do two comparisons and merge them with &&
            var first = op.First as Op;

            var refName = scope.FreeVariableName("ref");

            first.Second = first.Second.Cache(refName);

            var fst = Compile(first, scope);
            var scd = Compile(new Op {First = first.Second, Second = op.Second, Operator = op.Operator}, scope);

            return Expression.Dynamic(
                scope.GetRuntime().BinaryOperationBinders.Get(ExpressionType.And),
                typeof (object),
                fst, scd);
        }