Func <object, object, bool> GetSortFunc(Runtime.TjsContext context, object func) { if (context != null) { if (_sortFuncInvokeSite == null) { System.Threading.Interlocked.CompareExchange( ref _sortFuncInvokeSite, CallSite <Func <CallSite, object, object, object, object> > .Create(context.CreateInvokeBinder(new CallSignature(3))), null ); } return((x, y) => context.Convert <bool>(_sortFuncInvokeSite.Target(_sortFuncInvokeSite, func, x, y))); } else { var deleg = func as Delegate; if (deleg != null) { if (context != null) { return((x, y) => context.Convert <bool>(deleg.DynamicInvoke(x, y))); } else { return((x, y) => (bool)Runtime.Binding.TjsBinder.ConvertInternal(deleg.DynamicInvoke(x, y), typeof(bool))); } } return(null); } }
public System.Linq.Expressions.Expression TransformRead(Runtime.TjsContext context) { return(System.Linq.Expressions.Expression.New((System.Reflection.ConstructorInfo)Utils.GetMember(() => new KeyValuePair <string, object>(null, null)), Runtime.Binding.Binders.Convert(context, Key.TransformRead(), typeof(string)), Runtime.Binding.Binders.Convert(context, Value.TransformRead(), typeof(object)) )); }
internal static System.Linq.Expressions.Expression TransformSimpleOperation(Runtime.TjsContext context, System.Linq.Expressions.Expression left, System.Linq.Expressions.Expression right, BinaryOperator binary) { if (binary == BinaryOperator.Assign) { return(right); } else if (binary == BinaryOperator.AndAlso || binary == BinaryOperator.AndAlsoAssign) { var v = System.Linq.Expressions.Expression.Variable(typeof(object)); return(System.Linq.Expressions.Expression.Block(new[] { v }, System.Linq.Expressions.Expression.Assign(v, left), System.Linq.Expressions.Expression.Condition(Binders.Convert(context, v, typeof(bool)), right, v) )); } else if (binary == BinaryOperator.OrElse || binary == BinaryOperator.OrElseAssign) { var v = System.Linq.Expressions.Expression.Variable(typeof(object)); return(System.Linq.Expressions.Expression.Block(new[] { v }, System.Linq.Expressions.Expression.Assign(v, left), System.Linq.Expressions.Expression.Condition(Binders.Convert(context, v, typeof(bool)), v, right) )); } else { return(DoBinaryOperation(context, left, right, binary)); } }
static System.Linq.Expressions.Expression DoUnaryOperation(Runtime.TjsContext context, UnaryOperator operation, params System.Linq.Expressions.Expression[] args) { var res = DistributeOperation(operation); if (res.IsStandardOperation) { return(System.Linq.Expressions.Expression.Dynamic(context.CreateUnaryOperationBinder(res.ExpressionType), typeof(object), args)); } else { return(System.Linq.Expressions.Expression.Dynamic(context.CreateOperationBinder(res.OperationKind), typeof(object), args)); } }
static System.Linq.Expressions.Expression DoBinaryOperation(Runtime.TjsContext context, System.Linq.Expressions.Expression left, System.Linq.Expressions.Expression right, BinaryOperator operation) { var res = DistributeOperation(operation); if (res.IsStandardOperation) { return(System.Linq.Expressions.Expression.Dynamic(context.CreateBinaryOperationBinder(res.ExpressionType), typeof(object), left, right)); } else { return(System.Linq.Expressions.Expression.Dynamic(context.CreateOperationBinder(res.OperationKind), typeof(object), left, right)); } }