summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRaymond Hettinger <python@rcn.com>2010-04-03 03:14:28 (GMT)
committerRaymond Hettinger <python@rcn.com>2010-04-03 03:14:28 (GMT)
commit6b96ecb0ab8d06b7c11d1b82baebc47452a7b13e (patch)
tree7a05a7e8769a176b25d3858cb2f86bf3c3c8907f
parent93232660bb96b8ab10de393850007b49b0cc595c (diff)
downloadcpython-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.py10
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