Exemplo n.º 1
0
            public static object __new__(CodeContext context, PythonType cls, object @object)
            {
                IWeakReferenceable iwr = ConvertToWeakReferenceable(context.LanguageContext, @object);

                if (cls == DynamicHelpers.GetPythonTypeFromType(typeof(@ref)))
                {
                    WeakRefTracker wrt = iwr.GetWeakRef();
                    if (wrt != null)
                    {
                        for (int i = 0; i < wrt.HandlerCount; i++)
                        {
                            if (wrt.GetHandlerCallback(i) == null && wrt.GetWeakRef(i) is @ref)
                            {
                                return(wrt.GetWeakRef(i));
                            }
                        }
                    }

                    return(new @ref(context, @object));
                }
                else
                {
                    return(cls.CreateInstance(context, @object));
                }
            }
Exemplo n.º 2
0
            public static object MakeNew(PythonType cls, object @object)
            {
                IWeakReferenceable iwr = @object as IWeakReferenceable;

                if (iwr == null)
                {
                    throw Ops.TypeError("cannot create weak reference to '{0}' object", Ops.GetDynamicType(@object).__name__);
                }

                if (cls == Ops.GetDynamicTypeFromType(typeof(PythonWeakReference)))
                {
                    WeakRefTracker wrt = iwr.GetWeakRef();
                    if (wrt != null)
                    {
                        for (int i = 0; i < wrt.HandlerCount; i++)
                        {
                            if (wrt.GetHandlerCallback(i) == null && wrt.GetWeakRef(i) is PythonWeakReference)
                            {
                                return(wrt.GetWeakRef(i));
                            }
                        }
                    }

                    return(new PythonWeakReference(@object));
                }
                else
                {
                    return(cls.ctor.Call(cls, @object));
                }
            }
        internal override bool TryGetValue(CodeContext context, object instance, PythonType owner, out object value)
        {
            if (instance == null)
            {
                value = this;
                return(true);
            }

            IWeakReferenceable reference;

            if (context.GetPythonContext().TryConvertToWeakReferenceable(instance, out reference))
            {
                WeakRefTracker tracker = reference.GetWeakRef();
                if (tracker == null || tracker.HandlerCount == 0)
                {
                    value = null;
                }
                else
                {
                    value = tracker.GetHandlerCallback(0);
                }
                return(true);
            }

            value = null;
            return(false);
        }
Exemplo n.º 4
0
            internal static object MakeNew(object @object, object callback)
            {
                IWeakReferenceable iwr = @object as IWeakReferenceable;

                if (iwr == null)
                {
                    throw Ops.TypeError("cannot create weak reference to '{0}' object", Ops.GetDynamicType(@object).__name__);
                }

                if (callback == null)
                {
                    WeakRefTracker wrt = iwr.GetWeakRef();
                    if (wrt != null)
                    {
                        for (int i = 0; i < wrt.HandlerCount; i++)
                        {
                            if (wrt.GetHandlerCallback(i) == null &&
                                wrt.GetWeakRef(i) is PythonCallableWeakRefProxy)
                            {
                                return(wrt.GetWeakRef(i));
                            }
                        }
                    }
                }

                return(new PythonCallableWeakRefProxy(@object, callback));
            }
Exemplo n.º 5
0
            internal static object MakeNew(CodeContext /*!*/ context, object @object, object callback)
            {
                IWeakReferenceable iwr = ConvertToWeakReferenceable(context.LanguageContext, @object);

                if (callback == null)
                {
                    WeakRefTracker wrt = iwr.GetWeakRef();
                    if (wrt != null)
                    {
                        for (int i = 0; i < wrt.HandlerCount; i++)
                        {
                            if (wrt.GetHandlerCallback(i) == null && wrt.GetWeakRef(i) is weakproxy)
                            {
                                return(wrt.GetWeakRef(i));
                            }
                        }
                    }
                }

                return(new weakproxy(context, @object, callback));
            }