Use a metaclass to cache Atom instances transparently. This should improve
authorZac Medico <zmedico@gentoo.org>
Fri, 20 Jun 2008 16:18:46 +0000 (16:18 -0000)
committerZac Medico <zmedico@gentoo.org>
Fri, 20 Jun 2008 16:18:46 +0000 (16:18 -0000)
performance and conserve memory in cases when the same atom is more than
once.

svn path=/main/trunk/; revision=10741

pym/portage/dep.py

index 03f428495ae47af51604f7faa3e5584c18cbdfdb..a1908276be998d8ae3c59bbfcd8db453f0079f3b 100644 (file)
@@ -392,6 +392,15 @@ class _use_dep(object):
                tokens.extend(self.conditional_disabled.difference(use))
                return _use_dep(tokens)
 
+class _AtomCache(type):
+       atoms = {}
+       def __call__(cls, s):
+               instance = cls.atoms.get(s)
+               if instance is None:
+                       instance = super(_AtomCache, cls).__call__(s)
+                       cls.atoms[s] = instance
+               return instance
+
 class Atom(object):
 
        """
@@ -399,6 +408,8 @@ class Atom(object):
        class emulates most of the str methods that are useful with atoms.
        """
 
+       __metaclass__ = _AtomCache
+
        _str_methods = ("endswith", "find", "index", "lstrip", "replace",
                "startswith", "strip", "rindex", "rfind", "rstrip", "__getitem__",
                "__len__", "__repr__", "__str__")