Esempio n. 1
0
        public override T BindDelegate <T>(CallSite <T> site, object[] args)
        {
            if (args[1] is IFastInvokable ifi)
            {
                FastBindResult <T> res = ifi.MakeInvokeBinding(site, this, (CodeContext)args[0], ArrayUtils.ShiftLeft(args, 2));
                if (res.Target != null)
                {
                    if (res.ShouldCache)
                    {
                        CacheTarget(res.Target);
                    }

                    return(res.Target);
                }
            }

            if (args[1] is Types.PythonType)
            {
                PerfTrack.NoteEvent(PerfTrack.Categories.BindingSlow, "InvokeNoFast " + ((Types.PythonType)args[1]).Name);
            }
            else
            {
                PerfTrack.NoteEvent(PerfTrack.Categories.BindingSlow, "InvokeNoFast " + CompilerHelpers.GetType(args[1]));
            }

            var target = this.LightBind <T>(args, Context.Options.CompilationThreshold);

            CacheTarget(target);
            return(target);
        }
        public override T BindDelegate <T>(CallSite <T> site, object[] args)
        {
            IFastSettable fastSet = args[0] as IFastSettable;

            if (fastSet != null)
            {
                T res = fastSet.MakeSetBinding <T>(site, this);
                if (res != null)
                {
                    return(res);
                }
            }

            IPythonObject ipo = args[0] as IPythonObject;

            if (ipo != null && !(ipo is IProxyObject))
            {
                FastBindResult <T> res = UserTypeOps.MakeSetBinding <T>(Context.SharedContext, site, ipo, args[1], this);

                if (res.Target != null)
                {
                    PerfTrack.NoteEvent(PerfTrack.Categories.BindingFast, "IPythonObject");

                    if (res.ShouldCache)
                    {
                        CacheTarget(res.Target);
                    }
                    return(res.Target);
                }

                PerfTrack.NoteEvent(PerfTrack.Categories.BindingSlow, "IPythonObject Set");
            }

            return(base.BindDelegate(site, args));
        }
Esempio n. 3
0
        public override T BindDelegate <T>(CallSite <T> site, object[] args)
        {
            IFastInvokable ifi = args[1] as IFastInvokable;

            if (ifi != null)
            {
                FastBindResult <T> res = ifi.MakeInvokeBinding(site, this, (CodeContext)args[0], ArrayUtils.ShiftLeft(args, 2));
                if (res.Target != null)
                {
                    if (res.ShouldCache)
                    {
                        base.CacheTarget(res.Target);
                    }

                    return(res.Target);
                }
            }

            if (args[1] is Types.PythonType)
            {
                PerfTrack.NoteEvent(PerfTrack.Categories.BindingSlow, "InvokeNoFast " + ((Types.PythonType)args[1]).Name);
            }
            else
            {
                PerfTrack.NoteEvent(PerfTrack.Categories.BindingSlow, "InvokeNoFast " + CompilerHelpers.GetType(args[1]));
            }
            return(base.BindDelegate(site, args));
        }
Esempio n. 4
0
        public override T BindDelegate <T>(CallSite <T> site, object[] args)
        {
            Debug.Assert(args[1].GetType() == typeof(CodeContext));

            IFastGettable fastGet = args[0] as IFastGettable;

            if (fastGet != null)
            {
                T res = fastGet.MakeGetBinding <T>(site, this, (CodeContext)args[1], Name);
                if (res != null)
                {
                    PerfTrack.NoteEvent(PerfTrack.Categories.BindingFast, "IFastGettable");
                    return(res);
                }

                PerfTrack.NoteEvent(PerfTrack.Categories.BindingSlow, "IFastGettable");
                return(base.BindDelegate <T>(site, args));
            }

            IPythonObject pyObj = args[0] as IPythonObject;

            if (pyObj != null && !(args[0] is IProxyObject))
            {
                FastBindResult <T> res = UserTypeOps.MakeGetBinding <T>((CodeContext)args[1], site, pyObj, this);
                if (res.Target != null)
                {
                    PerfTrack.NoteEvent(PerfTrack.Categories.BindingFast, "IPythonObject");
                    if (res.ShouldCache)
                    {
                        CacheTarget(res.Target);
                    }
                    return(res.Target);
                }

                PerfTrack.NoteEvent(PerfTrack.Categories.BindingSlow, "IPythonObject Get");
                return(base.BindDelegate <T>(site, args));
            }

            if (args[0] != null)
            {
                if (args[0].GetType() == typeof(PythonModule))
                {
                    if (SupportsLightThrow)
                    {
                        return((T)(object)new Func <CallSite, object, CodeContext, object>(new PythonModuleDelegate(_name).LightThrowTarget));
                    }
                    else if (!IsNoThrow)
                    {
                        return((T)(object)new Func <CallSite, object, CodeContext, object>(new PythonModuleDelegate(_name).Target));
                    }
                    else
                    {
                        return((T)(object)new Func <CallSite, object, CodeContext, object>(new PythonModuleDelegate(_name).NoThrowTarget));
                    }
                }
                else if (args[0].GetType() == typeof(NamespaceTracker))
                {
                    switch (Name)
                    {
                    case "__str__":
                    case "__repr__":
                    case "__doc__":
                        // need to return the built in method descriptor for these...
                        break;

                    case "__file__":
                        return((T)(object)new Func <CallSite, object, CodeContext, object>(new NamespaceTrackerDelegate(_name).GetFile));

                    case "__dict__":
                        return((T)(object)new Func <CallSite, object, CodeContext, object>(new NamespaceTrackerDelegate(_name).GetDict));

                    case "__name__":
                        return((T)(object)new Func <CallSite, object, CodeContext, object>(new NamespaceTrackerDelegate(_name).GetName));

                    default:
                        if (IsNoThrow)
                        {
                            return((T)(object)new Func <CallSite, object, CodeContext, object>(new NamespaceTrackerDelegate(_name).NoThrowTarget));
                        }
                        else
                        {
                            return((T)(object)new Func <CallSite, object, CodeContext, object>(new NamespaceTrackerDelegate(_name).Target));
                        }
                    }
                }
            }

            if (args[0] != null &&
#if FEATURE_COM
                !Microsoft.Scripting.ComInterop.ComBinder.IsComObject(args[0]) &&
#endif
                !(args[0] is IDynamicMetaObjectProvider))
            {
                Type        selfType = typeof(T).GetMethod("Invoke").GetParameters()[1].ParameterType;
                CodeContext context  = (CodeContext)args[1];
                T           res      = null;
                if (selfType == typeof(object))
                {
                    res = (T)(object)MakeGetMemberTarget <object>(Name, args[0], context);
                }
                else if (selfType == typeof(List))
                {
                    res = (T)(object)MakeGetMemberTarget <List>(Name, args[0], context);
                }
                else if (selfType == typeof(string))
                {
                    res = (T)(object)MakeGetMemberTarget <string>(Name, args[0], context);
                }

                if (res != null)
                {
                    return((T)(object)res);
                }
                return(base.BindDelegate <T>(site, args));
            }

            PerfTrack.NoteEvent(PerfTrack.Categories.BindingSlow, "GetNoFast " + IsNoThrow + " " + CompilerHelpers.GetType(args[0]));
            return(this.LightBind <T>(args, Context.Options.CompilationThreshold));
        }