|
@@ -2,7 +2,7 @@
|
|
|
#
|
|
|
# AWL simulator - object reference manager
|
|
|
#
|
|
|
-# Copyright 2015 Michael Buesch <m@bues.ch>
|
|
|
+# Copyright 2015-2018 Michael Buesch <m@bues.ch>
|
|
|
#
|
|
|
# This program is free software; you can redistribute it and/or modify
|
|
|
# it under the terms of the GNU General Public License as published by
|
|
@@ -33,10 +33,18 @@ __all__ = [
|
|
|
|
|
|
|
|
|
class ObjRef(object):
|
|
|
- """An object reference."""
|
|
|
+ """Object reference.
|
|
|
+ This represents a reference from 'obj' to the ObjRefManager 'manager'.
|
|
|
+ """
|
|
|
+
|
|
|
+ __slots__ = (
|
|
|
+ "__name",
|
|
|
+ "__obj",
|
|
|
+ "__manager",
|
|
|
+ )
|
|
|
|
|
|
@classmethod
|
|
|
- def make(cls, name,
|
|
|
+ def make(cls, name=None,
|
|
|
manager=None, ref=None, inheritRef=False,
|
|
|
obj=None):
|
|
|
"""Make a new ObjRef instance.
|
|
@@ -47,19 +55,24 @@ class ObjRef(object):
|
|
|
If True and ref is not None, the ref is inherited.
|
|
|
obj -> The object that is associated with this ref.
|
|
|
"""
|
|
|
+ if name is None:
|
|
|
+ # Default name
|
|
|
+ name = lambda _self: ("ObjRef(manager=(%s), obj=(%s))" %
|
|
|
+ (str(_self.manager), str(_self.obj)))
|
|
|
+
|
|
|
if manager is not None and ref is not None:
|
|
|
raise RuntimeError
|
|
|
- if manager is None and ref is None:
|
|
|
- return None
|
|
|
|
|
|
if manager is not None:
|
|
|
return cls(name, manager, obj)
|
|
|
- if ref is not None:
|
|
|
+ elif ref is not None:
|
|
|
oldRef = ref
|
|
|
newRef = cls(name, oldRef.__manager, obj)
|
|
|
if inheritRef and oldRef.alive:
|
|
|
oldRef.destroy()
|
|
|
return newRef
|
|
|
+ else:
|
|
|
+ return None
|
|
|
|
|
|
def __init__(self, name, manager, obj = None):
|
|
|
"""Contruct object reference.
|
|
@@ -78,10 +91,12 @@ class ObjRef(object):
|
|
|
This removes the reference from the manager.
|
|
|
"""
|
|
|
if self.alive:
|
|
|
- self.__manager.refDestroyed(self)
|
|
|
- self.__name = None
|
|
|
- self.__obj = None
|
|
|
- self.__manager = None
|
|
|
+ try:
|
|
|
+ self.__manager.refDestroyed(self)
|
|
|
+ finally:
|
|
|
+ self.__name = None
|
|
|
+ self.__obj = None
|
|
|
+ self.__manager = None
|
|
|
|
|
|
@property
|
|
|
def name(self):
|
|
@@ -118,9 +133,16 @@ class ObjRefManager(object):
|
|
|
The manager belongs to the object that actually is referenced.
|
|
|
"""
|
|
|
|
|
|
+ __slots__ = (
|
|
|
+ "__name",
|
|
|
+ "__oneDestroyedCallback",
|
|
|
+ "__allDestroyedCallback",
|
|
|
+ "__refs",
|
|
|
+ )
|
|
|
+
|
|
|
def __init__(self, name,
|
|
|
- oneDestroyedCallback = None,
|
|
|
- allDestroyedCallback = None):
|
|
|
+ oneDestroyedCallback=None,
|
|
|
+ allDestroyedCallback=None):
|
|
|
"""Contruct reference manager.
|
|
|
name: Informational name string or callable returing a string.
|
|
|
oneDestroyedCallback: Optional callback. Called, if one ref was destroyed.
|
|
@@ -147,9 +169,17 @@ class ObjRefManager(object):
|
|
|
|
|
|
@property
|
|
|
def refs(self):
|
|
|
- """Get a set of all references to this object.
|
|
|
+ """Get a set of all references (ObjRef()s) to this object.
|
|
|
+ """
|
|
|
+ return frozenset(self.__refs)
|
|
|
+
|
|
|
+ def getRefForObj(self, obj):
|
|
|
+ """Get the ObjRef() that is managed by this manager for 'obj'.
|
|
|
"""
|
|
|
- return set(self.__refs)
|
|
|
+ for ref in self.__refs:
|
|
|
+ if ref.obj is obj:
|
|
|
+ return ref
|
|
|
+ return None
|
|
|
|
|
|
def _addRef(self, objRef):
|
|
|
self.__refs.add(objRef)
|