diff options
author | Raymond Hettinger <python@rcn.com> | 2010-04-03 03:14:28 (GMT) |
---|---|---|
committer | Raymond Hettinger <python@rcn.com> | 2010-04-03 03:14:28 (GMT) |
commit | 6b96ecb0ab8d06b7c11d1b82baebc47452a7b13e (patch) | |
tree | 7a05a7e8769a176b25d3858cb2f86bf3c3c8907f | |
parent | 93232660bb96b8ab10de393850007b49b0cc595c (diff) | |
download | cpython-6b96ecb0ab8d06b7c11d1b82baebc47452a7b13e.zip cpython-6b96ecb0ab8d06b7c11d1b82baebc47452a7b13e.tar.gz cpython-6b96ecb0ab8d06b7c11d1b82baebc47452a7b13e.tar.bz2 |
Improve clear() method. Keeps key/value refcnts >= 1 until final dict.clear() so that decrefs to zero won't trigger arbitrary code . Also runs a bit faster.
-rw-r--r-- | Lib/collections.py | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/Lib/collections.py b/Lib/collections.py index 1f1f510..79f6696 100644 --- a/Lib/collections.py +++ b/Lib/collections.py @@ -107,8 +107,14 @@ class OrderedDict(dict, MutableMapping): def clear(self): 'od.clear() -> None. Remove all items from od.' - for k in dict.keys(self): - del self[k] + try: + for node in self.__map.itervalues(): + del node[:] + self.__root[:] = [self.__root, self.__root, None] + self.__map.clear() + except AttributeError: + pass + dict.clear(self) setdefault = MutableMapping.setdefault update = MutableMapping.update |