public override DynamicMetaObject FallbackSetIndex(DynamicMetaObject target, DynamicMetaObject[] packedIndexes, DynamicMetaObject value, DynamicMetaObject errorSuggestion)
        {
            if (IDOUtils.NeedsDeferral(target, packedIndexes, value))
            {
                Array.Resize <DynamicMetaObject>(ref packedIndexes, packedIndexes.Length + 1);
                packedIndexes[packedIndexes.Length - 1] = value;
                return(this.Defer(target, packedIndexes));
            }
            string[]     argNames  = null;
            Expression[] args      = null;
            object[]     argValues = null;
            IDOUtils.UnpackArguments(packedIndexes, this.CallInfo, ref args, ref argNames, ref argValues);
            object[] array = new object[argValues.Length + 1];
            argValues.CopyTo(array, 0);
            array[argValues.Length] = value.Value;
            if ((errorSuggestion != null) && !NewLateBinding.CanIndexSetComplex(target.Value, array, argNames, this._optimisticSet, this._rValueBase))
            {
                return(errorSuggestion);
            }
            Expression expression2 = IDOUtils.ConvertToObject(value.Expression);

            Expression[] expressionArray2 = new Expression[args.Length + 1];
            args.CopyTo(expressionArray2, 0);
            expressionArray2[args.Length] = expression2;
            return(new DynamicMetaObject(Expression.Block(Expression.Call(typeof(NewLateBinding).GetMethod("FallbackIndexSetComplex"), target.Expression, Expression.NewArrayInit(typeof(object), expressionArray2), Expression.Constant(argNames, typeof(string[])), Expression.Constant(this._optimisticSet), Expression.Constant(this._rValueBase)), expression2), IDOUtils.CreateRestrictions(target, packedIndexes, value)));
        }
Example #2
0
        public static object LateGet(object Instance, Type Type, string MemberName, object[] Arguments, string[] ArgumentNames, Type[] TypeArguments, bool[] CopyBack)
        {
            Symbols.Container container;
            if (Arguments == null)
            {
                Arguments = Symbols.NoArguments;
            }
            if (ArgumentNames == null)
            {
                ArgumentNames = Symbols.NoArgumentNames;
            }
            if (TypeArguments == null)
            {
                TypeArguments = Symbols.NoTypeArguments;
            }
            if (Type != null)
            {
                container = new Symbols.Container(Type);
            }
            else
            {
                container = new Symbols.Container(Instance);
            }
            if (container.IsCOMObject)
            {
                return(LateBinding.LateGet(Instance, Type, MemberName, Arguments, ArgumentNames, CopyBack));
            }
            IDynamicMetaObjectProvider instance = IDOUtils.TryCastToIDMOP(Instance);

            if ((instance != null) && (TypeArguments == Symbols.NoTypeArguments))
            {
                return(IDOBinder.IDOGet(instance, MemberName, Arguments, ArgumentNames, CopyBack));
            }
            return(ObjectLateGet(Instance, Type, MemberName, Arguments, ArgumentNames, TypeArguments, CopyBack));
        }
        public static object CallByName(object Instance, string MethodName, CallType UseCallType, params object[] Arguments)
        {
            switch (UseCallType)
            {
            case CallType.Method:
                return(NewLateBinding.LateCall(Instance, null, MethodName, Arguments, null, null, null, false));

            case CallType.Get:
                return(NewLateBinding.LateGet(Instance, null, MethodName, Arguments, null, null, null));

            case CallType.Let:
            case CallType.Set:
            {
                IDynamicMetaObjectProvider instance = IDOUtils.TryCastToIDMOP(Instance);
                if (instance == null)
                {
                    NewLateBinding.LateSet(Instance, null, MethodName, Arguments, null, null, false, false, UseCallType);
                    break;
                }
                IDOBinder.IDOSet(instance, MethodName, null, Arguments);
                break;
            }

            default:
                throw new ArgumentException(Utils.GetResourceString("Argument_InvalidValue1", new string[] { "CallType" }));
            }
            return(null);
        }
Example #4
0
 public static object LateGetInvokeDefault(object Instance, object[] Arguments, string[] ArgumentNames, bool ReportErrors)
 {
     if ((IDOUtils.TryCastToIDMOP(Instance) == null) && ((Arguments == null) || (Arguments.Length <= 0)))
     {
         return(Instance);
     }
     return(InternalLateInvokeDefault(Instance, Arguments, ArgumentNames, ReportErrors, IDOBinder.GetCopyBack()));
 }
Example #5
0
        private static object InternalLateInvokeDefault(object Instance, object[] Arguments, string[] ArgumentNames, bool ReportErrors, bool[] CopyBack)
        {
            IDynamicMetaObjectProvider instance = IDOUtils.TryCastToIDMOP(Instance);

            if (instance != null)
            {
                return(IDOBinder.IDOInvokeDefault(instance, Arguments, ArgumentNames, ReportErrors, CopyBack));
            }
            return(ObjectLateInvokeDefault(Instance, Arguments, ArgumentNames, ReportErrors, CopyBack));
        }
Example #6
0
 public override DynamicMetaObject FallbackUnaryOperation(DynamicMetaObject target, DynamicMetaObject errorSuggestion)
 {
     if (IDOUtils.NeedsDeferral(target, null, null))
     {
         return(this.Defer(target, new DynamicMetaObject[0]));
     }
     if ((errorSuggestion != null) && (Operators.GetCallableUserDefinedOperator(this._Op, new object[] { target.Value }) == null))
     {
         return(errorSuggestion);
     }
     return(new DynamicMetaObject(Expression.Call(typeof(Operators).GetMethod("FallbackInvokeUserDefinedOperator"), Expression.Constant(this._Op, typeof(object)), Expression.NewArrayInit(typeof(object), new Expression[] { IDOUtils.ConvertToObject(target.Expression) })), IDOUtils.CreateRestrictions(target, null, null)));
 }
        internal static void IDOIndexSet(IDynamicMetaObjectProvider Instance, object[] Arguments, string[] ArgumentNames)
        {
            SaveCopyBack back = new SaveCopyBack(null);

            using (back)
            {
                object[] packedArgs = null;
                CallInfo callInfo   = null;
                IDOUtils.PackArguments(1, ArgumentNames, Arguments, ref packedArgs, ref callInfo);
                IDOUtils.CreateFuncCallSiteAndInvoke(new VBIndexSetBinder(callInfo), Instance, packedArgs);
            }
        }
 public override DynamicMetaObject FallbackConvert(DynamicMetaObject target, DynamicMetaObject errorSuggestion)
 {
     if (IDOUtils.NeedsDeferral(target, null, null))
     {
         return(this.Defer(target, new DynamicMetaObject[0]));
     }
     if ((errorSuggestion != null) && !Conversions.CanUserDefinedConvert(target.Value, this.Type))
     {
         return(errorSuggestion);
     }
     return(new DynamicMetaObject(Expression.Convert(Expression.Call(typeof(Conversions).GetMethod("FallbackUserDefinedConversion"), target.Expression, Expression.Constant(this.Type, typeof(Type))), this.ReturnType), IDOUtils.CreateRestrictions(target, null, null)));
 }
Example #9
0
        public static void LateSetComplex(object Instance, Type Type, string MemberName, object[] Arguments, string[] ArgumentNames, Type[] TypeArguments, bool OptimisticSet, bool RValueBase)
        {
            IDynamicMetaObjectProvider instance = IDOUtils.TryCastToIDMOP(Instance);

            if ((instance != null) && (TypeArguments == null))
            {
                IDOBinder.IDOSetComplex(instance, MemberName, Arguments, ArgumentNames, OptimisticSet, RValueBase);
            }
            else
            {
                ObjectLateSetComplex(Instance, Type, MemberName, Arguments, ArgumentNames, TypeArguments, OptimisticSet, RValueBase);
            }
        }
Example #10
0
        public static void LateIndexSetComplex(object Instance, object[] Arguments, string[] ArgumentNames, bool OptimisticSet, bool RValueBase)
        {
            IDynamicMetaObjectProvider instance = IDOUtils.TryCastToIDMOP(Instance);

            if (instance != null)
            {
                IDOBinder.IDOIndexSetComplex(instance, Arguments, ArgumentNames, OptimisticSet, RValueBase);
            }
            else
            {
                ObjectLateIndexSetComplex(Instance, Arguments, ArgumentNames, OptimisticSet, RValueBase);
            }
        }
Example #11
0
        public static void LateSet(object Instance, Type Type, string MemberName, object[] Arguments, string[] ArgumentNames, Type[] TypeArguments)
        {
            IDynamicMetaObjectProvider instance = IDOUtils.TryCastToIDMOP(Instance);

            if ((instance != null) && (TypeArguments == null))
            {
                IDOBinder.IDOSet(instance, MemberName, ArgumentNames, Arguments);
            }
            else
            {
                ObjectLateSet(Instance, Type, MemberName, Arguments, ArgumentNames, TypeArguments);
            }
        }
Example #12
0
        public static void LateIndexSet(object Instance, object[] Arguments, string[] ArgumentNames)
        {
            IDynamicMetaObjectProvider instance = IDOUtils.TryCastToIDMOP(Instance);

            if (instance != null)
            {
                IDOBinder.IDOIndexSet(instance, Arguments, ArgumentNames);
            }
            else
            {
                ObjectLateIndexSet(Instance, Arguments, ArgumentNames);
            }
        }
        public override DynamicMetaObject FallbackSetMember(DynamicMetaObject target, DynamicMetaObject value, DynamicMetaObject errorSuggestion)
        {
            if (IDOUtils.NeedsDeferral(target, null, value))
            {
                return(this.Defer(target, new DynamicMetaObject[] { value }));
            }
            if ((errorSuggestion != null) && !NewLateBinding.CanBindSet(target.Value, this.Name, value.Value, this._optimisticSet, this._rValueBase))
            {
                return(errorSuggestion);
            }
            Expression expression2 = IDOUtils.ConvertToObject(value.Expression);

            Expression[] initializers = new Expression[] { expression2 };
            return(new DynamicMetaObject(Expression.Block(Expression.Call(typeof(NewLateBinding).GetMethod("FallbackSetComplex"), target.Expression, Expression.Constant(this.Name), Expression.NewArrayInit(typeof(object), initializers), Expression.Constant(this._optimisticSet), Expression.Constant(this._rValueBase)), expression2), IDOUtils.CreateRestrictions(target, null, value)));
        }
Example #14
0
        public override DynamicMetaObject FallbackInvoke(DynamicMetaObject target, DynamicMetaObject[] packedArgs, DynamicMetaObject errorSuggestion)
        {
            if (IDOUtils.NeedsDeferral(target, packedArgs, null))
            {
                return(this.Defer(target, packedArgs));
            }
            Expression[] args      = null;
            string[]     argNames  = null;
            object[]     argValues = null;
            IDOUtils.UnpackArguments(packedArgs, this.CallInfo, ref args, ref argNames, ref argValues);
            if ((errorSuggestion != null) && !NewLateBinding.CanBindInvokeDefault(target.Value, argValues, argNames, this._lateCall))
            {
                return(errorSuggestion);
            }
            ParameterExpression left       = Expression.Variable(typeof(object), "result");
            ParameterExpression expression = Expression.Variable(typeof(object[]), "array");
            Expression          right      = Expression.Call(typeof(NewLateBinding).GetMethod(this._lateCall ? "LateCallInvokeDefault" : "LateGetInvokeDefault"), target.Expression, Expression.Assign(expression, Expression.NewArrayInit(typeof(object), args)), Expression.Constant(argNames, typeof(string[])), Expression.Constant(this._lateCall));

            return(new DynamicMetaObject(Expression.Block(new ParameterExpression[] { left, expression }, new Expression[] { Expression.Assign(left, right), IDOUtils.GetWriteBack(args, expression), left }), IDOUtils.CreateRestrictions(target, packedArgs, null)));
        }
        internal static object IDOGet(IDynamicMetaObjectProvider Instance, string MemberName, object[] Arguments, string[] ArgumentNames, bool[] CopyBack)
        {
            object       obj2;
            SaveCopyBack back = new SaveCopyBack(CopyBack);

            using (back)
            {
                object[] packedArgs = null;
                CallInfo callInfo   = null;
                IDOUtils.PackArguments(0, ArgumentNames, Arguments, ref packedArgs, ref callInfo);
                try
                {
                    return(IDOUtils.CreateRefCallSiteAndInvoke(new VBGetBinder(MemberName, callInfo), Instance, packedArgs));
                }
                finally
                {
                    IDOUtils.CopyBackArguments(callInfo, packedArgs, Arguments);
                }
            }
            return(obj2);
        }
        internal static object InvokeUserDefinedOperator(Symbols.UserDefinedOperator Op, object[] Arguments)
        {
            CallSiteBinder binder;
            ExpressionType?nullable = IDOUtils.LinqOperator(Op);

            if (!nullable.HasValue)
            {
                return(Operators.InvokeObjectUserDefinedOperator(Op, Arguments));
            }
            ExpressionType linqOp = (ExpressionType)nullable;

            if (Arguments.Length == 1)
            {
                binder = new VBUnaryOperatorBinder(Op, linqOp);
            }
            else
            {
                binder = new VBBinaryOperatorBinder(Op, linqOp);
            }
            object instance = Arguments[0];

            object[] arguments = (Arguments.Length == 1) ? Symbols.NoArguments : new object[] { Arguments[1] };
            return(IDOUtils.CreateFuncCallSiteAndInvoke(binder, instance, arguments));
        }
        internal static void IDOSetComplex(IDynamicMetaObjectProvider Instance, string MemberName, object[] Arguments, string[] ArgumentNames, bool OptimisticSet, bool RValueBase)
        {
            SaveCopyBack back = new SaveCopyBack(null);

            using (back)
            {
                if (Arguments.Length == 1)
                {
                    IDOUtils.CreateFuncCallSiteAndInvoke(new VBSetComplexBinder(MemberName, OptimisticSet, RValueBase), Instance, Arguments);
                }
                else
                {
                    object instance = IDOUtils.CreateFuncCallSiteAndInvoke(new VBGetMemberBinder(MemberName), Instance, Symbols.NoArguments);
                    if (instance == missingMemberSentinel)
                    {
                        NewLateBinding.ObjectLateSetComplex(Instance, null, MemberName, Arguments, ArgumentNames, Symbols.NoTypeArguments, OptimisticSet, RValueBase);
                    }
                    else
                    {
                        NewLateBinding.LateIndexSetComplex(instance, Arguments, ArgumentNames, OptimisticSet, RValueBase);
                    }
                }
            }
        }
Example #18
0
 public override DynamicMetaObject FallbackGetMember(DynamicMetaObject target, DynamicMetaObject errorSuggestion)
 {
     if (errorSuggestion != null)
     {
         return(errorSuggestion);
     }
     return(new DynamicMetaObject(Expression.Constant(IDOBinder.missingMemberSentinel), IDOUtils.CreateRestrictions(target, null, null)));
 }
 internal static object UserDefinedConversion(IDynamicMetaObjectProvider Expression, Type TargetType)
 {
     return(IDOUtils.CreateConvertCallSiteAndInvoke(new VBConversionBinder(TargetType), Expression));
 }