示例#1
0
 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);
     }
 }
示例#2
0
 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))
                                                   ));
 }
示例#3
0
 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));
     }
 }
示例#4
0
        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));
            }
        }
示例#5
0
        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));
            }
        }