Ejemplo n.º 1
0
        /// <summary>
        /// Helper for falling back - if we have a base object fallback to it first (which can
        /// then fallback to the calling site), otherwise fallback to the calling site.
        /// </summary>
        private DynamicMetaObject /*!*/ Fallback(DynamicMetaObjectBinder /*!*/ action, DynamicMetaObject codeContext)
        {
            if (_baseMetaObject != null)
            {
                IPythonGetable ipyget = _baseMetaObject as IPythonGetable;
                if (ipyget != null)
                {
                    PythonGetMemberBinder gmb = action as PythonGetMemberBinder;
                    if (gmb != null)
                    {
                        return(ipyget.GetMember(gmb, codeContext));
                    }
                }

                GetMemberBinder gma = action as GetMemberBinder;
                if (gma != null)
                {
                    return(_baseMetaObject.BindGetMember(gma));
                }

                return(_baseMetaObject.BindGetMember(
                           PythonContext.GetPythonContext(action).CompatGetMember(
                               GetGetMemberName(action),
                               false
                               )
                           ));
            }

            return(GetMemberFallback(this, action, codeContext));
        }
Ejemplo n.º 2
0
            public override DynamicMetaObject /*!*/ FallbackGetMember(DynamicMetaObject /*!*/ target, DynamicMetaObject errorSuggestion)
            {
#if !SILVERLIGHT
                DynamicMetaObject result;
                if (Microsoft.Scripting.ComInterop.ComBinder.TryBindGetMember(this, target, out result))
                {
                    return(result);
                }
#endif

                var metaBuilder = new MetaObjectBuilder(target);
                var callArgs    = new CallArguments(_context, target, DynamicMetaObject.EmptyMetaObjects, _CallInfo);

                // See InvokeMember binder for explanation.
                bool tryAlternateBinding = _unmangled != null && errorSuggestion == null;

                if (!RubyCallAction.BuildAccess(metaBuilder, _originalName ?? Name, callArgs, errorSuggestion == null && !tryAlternateBinding, true))
                {
                    Debug.Assert(errorSuggestion != null || tryAlternateBinding);
                    if (tryAlternateBinding)
                    {
                        metaBuilder.SetMetaResult(target.BindGetMember(_unmangled), true);
                    }
                    else
                    {
                        // method wasn't found so we didn't do any operation with arguments that would require restrictions converted to conditions:
                        metaBuilder.SetMetaResult(errorSuggestion, false);
                    }
                }

                return(metaBuilder.CreateMetaObject(this));
            }
Ejemplo n.º 3
0
        /// <summary>
        /// Performs the binding of the dynamic get member operation.
        /// </summary>
        /// <param name="target">The target of the dynamic get member operation.</param>
        /// <param name="args">An array of arguments of the dynamic get member operation.</param>
        /// <returns>The <see cref="DynamicMetaObject"/> representing the result of the binding.</returns>
        public sealed override DynamicMetaObject Bind(DynamicMetaObject target, params DynamicMetaObject[] args)
        {
            ContractUtils.RequiresNotNull(target, "target");
            ContractUtils.Requires(args == null || args.Length == 0, "args");

            return(target.BindGetMember(this));
        }
Ejemplo n.º 4
0
        public static bool TryBindGetMember(GetMemberBinder binder, DynamicMetaObject instance, out DynamicMetaObject result, bool delayInvocation) {
            ContractUtils.RequiresNotNull(binder, "binder");
            ContractUtils.RequiresNotNull(instance, "instance");

            if (TryGetMetaObject(ref instance)) {
                //
                // Demand Full Trust to proceed with the binding.
                //

                new PermissionSet(PermissionState.Unrestricted).Demand();

                var comGetMember = new ComGetMemberBinder(binder, delayInvocation);
                result = instance.BindGetMember(comGetMember);
                if (result.Expression.Type.IsValueType) {
                    result = new DynamicMetaObject(
                        Expression.Convert(result.Expression, typeof(object)),
                        result.Restrictions
                    );
                }
                return true;
            } else {
                result = null;
                return false;
            }
        }
Ejemplo n.º 5
0
        private static object GetMember(this DynamicMetaObject target, string name)
        {
            var bindResult = target.BindGetMember(new DynamicGetMemberBinder(name));
            var block      = Expression.Block(Expression.Label(CallSiteBinder.UpdateLabel), bindResult.Expression);

            return(Invoke(block));
        }
Ejemplo n.º 6
0
        public override DynamicMetaObject FallbackGetIndex(DynamicMetaObject target, DynamicMetaObject[] indexes, DynamicMetaObject errorSuggestion)
        {
            var result = _context.Binder.GetIndex(new TjsOverloadResolverFactory(_context.Binder), ArrayUtils.Insert(target, indexes));

            if (result != null)
            {
                if (result.Expression.Type.IsValueType)
                {
                    return(new DynamicMetaObject(Expression.Convert(result.Expression, typeof(object)), result.Restrictions));
                }
                else
                {
                    return(result);
                }
            }
            if (indexes[0].LimitType == typeof(string))
            {
                result = target.BindGetMember(new TjsGetMemberBinder(_context, (string)indexes[0].Value, false, DirectAccess));
                return(new DynamicMetaObject(result.Expression, result.Restrictions.Merge(
                                                 BindingRestrictions.GetInstanceRestriction(indexes[0].Expression, indexes[0].Value)
                                                 ).Merge(
                                                 BindingRestrictions.GetTypeRestriction(indexes[0].Expression, indexes[0].LimitType)
                                                 )));
            }
            return(errorSuggestion ?? new DynamicMetaObject(
                       Expression.Throw(Expression.Constant(new MissingMemberException(indexes[0].Value.ToString())), typeof(object)),
                       BindingRestrictions.Combine(ArrayUtils.Insert(target, indexes)).Merge(BindingRestrictions.GetTypeRestriction(indexes[0].Expression, indexes[0].LimitType))
                       ));
        }
Ejemplo n.º 7
0
        public static object GetProperty(this object obj, string member)
        {
            if (obj == null)
            {
                throw new ArgumentNullException("o");
            }
            if (member == null)
            {
                throw new ArgumentNullException("member");
            }
            Type scope = obj.GetType();
            IDynamicMetaObjectProvider provider = obj as IDynamicMetaObjectProvider;

            if (provider != null)
            {
                ParameterExpression param  = Expression.Parameter(typeof(object));
                DynamicMetaObject   mobj   = provider.GetMetaObject(param);
                GetMemberBinder     binder = (GetMemberBinder)Microsoft.CSharp.RuntimeBinder.Binder.GetMember(0, member, scope, new CSharpArgumentInfo[] { CSharpArgumentInfo.Create(0, null) });
                DynamicMetaObject   ret    = mobj.BindGetMember(binder);
                BlockExpression     final  = Expression.Block(
                    Expression.Label(CallSiteBinder.UpdateLabel),
                    ret.Expression
                    );
                LambdaExpression lambda = Expression.Lambda(final, param);
                Delegate         del    = lambda.Compile();
                return(del.DynamicInvoke(obj));
            }
            else
            {
                return(obj.GetType().GetProperty(member, BindingFlags.Public | BindingFlags.Instance).GetValue(obj, null));
            }
        }
Ejemplo n.º 8
0
        public static bool TryBindGetMember(GetMemberBinder binder, DynamicMetaObject instance, out DynamicMetaObject result, bool delayInvocation)
        {
            ContractUtils.RequiresNotNull(binder, "binder");
            ContractUtils.RequiresNotNull(instance, "instance");

            if (TryGetMetaObject(ref instance))
            {
                //
                // Demand Full Trust to proceed with the binding.
                //

                new PermissionSet(PermissionState.Unrestricted).Demand();

                var comGetMember = new ComGetMemberBinder(binder, delayInvocation);
                result = instance.BindGetMember(comGetMember);
                if (result.Expression.Type.IsValueType)
                {
                    result = new DynamicMetaObject(
                        Expression.Convert(result.Expression, typeof(object)),
                        result.Restrictions
                        );
                }
                return(true);
            }
            else
            {
                result = null;
                return(false);
            }
        }
Ejemplo n.º 9
0
        public override DynamicMetaObject BindGetMember(GetMemberBinder binder)
        {
            var retval = innerMetaObject.BindGetMember(binder);

            // get from any parent object non-dynamic member before trying wrapped object
            var newretval = binder.FallbackGetMember(this, retval);

            return(newretval);
        }
Ejemplo n.º 10
0
        public static PropertyInfo GetPropertyInfoInternal(this object o, string member)
        {
            try
            {
                if (o == null)
                {
                    throw new ArgumentNullException("o");
                }
                if (member == null)
                {
                    throw new ArgumentNullException("member");
                }
                Type scope = o.GetType();
                IDynamicMetaObjectProvider provider = o as IDynamicMetaObjectProvider;
                if (provider != null)
                {
                    var odictionary = (IDictionary <string, object>)o;
                    if (!odictionary.Any(x => x.Key.Equals(member, StringComparison.OrdinalIgnoreCase)))
                    {
                        return(null);
                    }
                    var odynamic = odictionary.FirstOrDefault(x => x.Key.Equals(member, StringComparison.OrdinalIgnoreCase));
                    member = odynamic.Key;
                    //if (!odynamic.ContainsKey(member)) return null;
                    //if (odynamic.Any(x => x.Key.ToLower() == member.ToLower())) return null;



                    ParameterExpression param  = Expression.Parameter(typeof(object));
                    DynamicMetaObject   mobj   = provider.GetMetaObject(param);
                    GetMemberBinder     binder = (GetMemberBinder)Microsoft.CSharp.RuntimeBinder.Binder.GetMember(0, member, scope, new[] { CSharpArgumentInfo.Create(0, null) });
                    DynamicMetaObject   ret    = mobj.BindGetMember(binder);
                    BlockExpression     final  = Expression.Block(
                        Expression.Label(CallSiteBinder.UpdateLabel),
                        ret.Expression
                        );
                    LambdaExpression lambda = Expression.Lambda(final, param);
                    Delegate         del    = lambda.Compile();
                    return(null);
                    //return del.DynamicInvoke(o);
                }
                else
                {
                    var oProperty = o.GetType().GetProperty(member, BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase);
                    if (oProperty != null)
                    {
                        //return oProperty.GetValue(o, null);
                        return(oProperty);
                    }
                    return(null);
                }
            }
            catch (Exception)
            {
                return(null);
            }
        }
            public static void TestMetaObject(DynamicMetaObject target, string name, bool isValid = true)
            {
                string expectedMethodSignature = "System.Json.JsonValue GetValue(System.String)";

                GetMemberBinder binder = new TestGetMemberBinder(name);

                DynamicMetaObject result = target.BindGetMember(binder);

                Assert.IsNotNull(result);

                MethodCallExpression expression = result.Expression as MethodCallExpression;

                Assert.IsNotNull(expression);
                Assert.AreEqual <string>(expectedMethodSignature, expression.Method.ToString());
            }
        private static object ReadDynamicValue(IDynamicMetaObjectProvider obj, Type scope,
                                               DynamicMetaObject metaObject, ParameterExpression param, string propertyName)
        {
            GetMemberBinder binder = (GetMemberBinder)Microsoft.CSharp.RuntimeBinder.Binder.GetMember(0, propertyName, scope,
                                                                                                      new[] { CSharpArgumentInfo.Create(0, null) });
            DynamicMetaObject ret   = metaObject.BindGetMember(binder);
            BlockExpression   final = Expression.Block(
                Expression.Label(CallSiteBinder.UpdateLabel),
                ret.Expression
                );
            LambdaExpression lambda = Expression.Lambda(final, param);
            Delegate         del    = lambda.Compile();
            object           result = del.DynamicInvoke(obj);

            return(result);
        }
        public override DynamicMetaObject Bind(DynamicMetaObject target, DynamicMetaObject[] args)
        {
            switch (_accessKind & MemberAccessKind.AccessMask)
            {
            case MemberAccessKind.Get:
                return(target.BindGetMember(new GetMemberBinderImpl(_context, _name, _ignoreCase, (_accessKind & MemberAccessKind.Direct) != 0, args[0])));

            case MemberAccessKind.Set:
                return(target.BindSetMember(
                           new SetMemberBinderImpl(
                               _context, _name, _ignoreCase,
                               (_accessKind & MemberAccessKind.Creatable) != 0,
                               (_accessKind & MemberAccessKind.Direct) != 0,
                               args[0]
                               ), args[1]
                           ));

            default:
                return(TjsDeleteMemberBinder.Bind(target, new DeleteMemberBinderImpl(_context, _name, _ignoreCase, args[0])));
            }
        }
Ejemplo n.º 14
0
 /// <summary>
 /// Tries to perform binding of the dynamic get member operation.
 /// </summary>
 /// <param name="binder">An instance of the <see cref="GetMemberBinder"/> that represents the details of the dynamic operation.</param>
 /// <param name="instance">The target of the dynamic operation. </param>
 /// <param name="result">The new <see cref="DynamicMetaObject"/> representing the result of the binding.</param>
 /// <param name="delayInvocation">true if member evaluation may be delayed.</param>
 /// <returns>true if operation was bound successfully; otherwise, false.</returns>
 public static bool TryBindGetMember(GetMemberBinder binder, DynamicMetaObject instance, out DynamicMetaObject result, bool delayInvocation)
 {
     if (TryGetMetaObject(ref instance))
     {
         var comGetMember = new ComGetMemberBinder(binder, delayInvocation);
         result = instance.BindGetMember(comGetMember);
         if (result.Expression.Type.IsValueType)
         {
             result = new DynamicMetaObject(
                 Expression.Convert(result.Expression, typeof(object)),
                 result.Restrictions
                 );
         }
         return(true);
     }
     else
     {
         result = null;
         return(false);
     }
 }
Ejemplo n.º 15
0
        /// <summary>
        /// Gets a property of the dynamic object.
        /// </summary>
        /// <param name="source">Source object.</param>
        /// <param name="member">Member to retrieve.</param>
        /// <returns>The requested property value.</returns>
        /// <exception cref="ArgumentNullException">If source or member are null.</exception>
        public static object GetProperty(this object source, string member)
        {
            if (source == null)
            {
                throw new ArgumentNullException("source");
            }
            if (member == null)
            {
                throw new ArgumentNullException("member");
            }

            Type scope    = source.GetType();
            var  provider = source as IDynamicMetaObjectProvider;

            if (provider != null)
            {
                var      objectType = typeof(object);
                var      cacheKey   = objectType.FullName + member;
                Delegate del;

                if (!_delegateCache.TryGetValue(cacheKey, out del))
                {
                    ParameterExpression param = Expression.Parameter(typeof(object));
                    DynamicMetaObject   mobj  = provider.GetMetaObject(param);
                    var binder               = (GetMemberBinder)Binder.GetMember(0, member, scope, new[] { CSharpArgumentInfo.Create(0, null) });
                    DynamicMetaObject ret    = mobj.BindGetMember(binder);
                    BlockExpression   final  = Expression.Block(Expression.Label(CallSiteBinder.UpdateLabel), ret.Expression);
                    LambdaExpression  lambda = Expression.Lambda(final, param);
                    del = lambda.Compile();
                    _delegateCache.TryAdd(cacheKey, del);
                }

                return(del.DynamicInvoke(source));
            }
            return(source.GetType().GetProperty(member, BindingFlags.Public | BindingFlags.Instance).GetValue(source, null));
        }
Ejemplo n.º 16
0
            // Forward all dynamic operations or some of them as needed //

            public override DynamicMetaObject BindGetMember(GetMemberBinder binder)
            {
                return(AddRestrictions(_metaForwardee.BindGetMember(binder)));
            }
Ejemplo n.º 17
0
 public override DynamicMetaObject BindGetMember(GetMemberBinder binder)
 {
     return(binder.FallbackGetMember(_baseMetaObject,
                                     AddTypeRestrictions(_metaObject.BindGetMember(binder))));
 }
Ejemplo n.º 18
0
 public override DynamicMetaObject BindGetMember(GetMemberBinder binder)
 {
     return(scriptItem.PostProcessBindResult(metaDynamic.BindGetMember(binder)));
 }
Ejemplo n.º 19
0
 public override DynamicMetaObject BindGetMember(GetMemberBinder binder) => _innerMetaObject.BindGetMember(binder);
        /// <summary>
        /// Performs the binding of the dynamic get member operation.
        /// </summary>
        /// <param name="target">The target of the dynamic get member operation.</param>
        /// <param name="args">An array of arguments of the dynamic get member operation.</param>
        /// <returns>The <see cref="DynamicMetaObject"/> representing the result of the binding.</returns>
        public sealed override DynamicMetaObject Bind(DynamicMetaObject target, params DynamicMetaObject[] args) {
            ContractUtils.RequiresNotNull(target, "target");
            ContractUtils.Requires(args == null || args.Length == 0, "args");

            return target.BindGetMember(this);
        }
Ejemplo n.º 21
0
 public override DynamicMetaObject BindGetMember(GetMemberBinder binder)
 {
     return(_innerMetaObject.BindGetMember(binder));
 }
 public override DynamicMetaObject FallbackGetMember(DynamicMetaObject target, DynamicMetaObject errorSuggestion)
 {
     return(base.FallbackGetMember(target, _fallback.BindGetMember(Context.CreateGetMemberBinder(Name, IgnoreCase, DirectAccess))));
 }
            public static void TestBindParams(DynamicMetaObject target)
            {
                GetMemberBinder binder = new TestGetMemberBinder("AnyProperty");

                ExceptionTestHelper.ExpectException <ArgumentNullException>(() => { var result = target.BindGetMember(null); });
            }