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); }
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); }