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