Exemple #1
0
        private static void AddFinalizer(CodeContext /*!*/ context, PythonType dt, object newObject)
        {
            // check if object has finalizer...
            if (dt.TryResolveSlot(context, "__del__", out _))
            {
                IWeakReferenceable iwr = context.LanguageContext.ConvertToWeakReferenceable(newObject);
                Debug.Assert(iwr != null);

                InstanceFinalizer nif = new InstanceFinalizer(context, newObject);
                iwr.SetFinalizer(new WeakRefTracker(iwr, nif, nif));
            }
        }
        private static void AddFinalizer(CodeContext/*!*/ context, PythonType dt, object newObject) {
            // check if object has finalizer...
            PythonTypeSlot dummy;
            if (dt.TryResolveSlot(context, "__del__", out dummy)) {
                IWeakReferenceable iwr = newObject as IWeakReferenceable;
                Debug.Assert(iwr != null);

                InstanceFinalizer nif = new InstanceFinalizer(context, newObject);
                iwr.SetFinalizer(new WeakRefTracker(nif, nif));
            }
        }
        public object Call(ICallerContext context, object[] args, string[] names)
        {
            object newObject = CreateInstance(context, args, names);
            if (newObject == null) return newObject;

            DynamicType newObjectType = Ops.GetDynamicType(newObject);
            if (ShouldInvokeInit(newObjectType, args.Length)) {
                object init;
                if (newObjectType.TryLookupBoundSlot(context, newObject, SymbolTable.Init, out init)) {
                    if (names != null) Ops.CallWithContext(context, init, args, names);
                    else Ops.CallWithContext(context, init, args);
                }

                if (HasFinalizer) {
                    IWeakReferenceable iwr = newObject as IWeakReferenceable;
                    Debug.Assert(iwr != null);

                    InstanceFinalizer nif = new InstanceFinalizer(newObject);
                    iwr.SetFinalizer(new WeakRefTracker(nif, nif));
                }
            }

            return newObject;
        }
 private void AddFinalizer()
 {
     InstanceFinalizer oif = new InstanceFinalizer(this);
     weakRef = new WeakRefTracker(oif, oif);
 }