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