]> granicus.if.org Git - python/commitdiff
Merged revisions 82654 via svnmerge from
authorMark Dickinson <dickinsm@gmail.com>
Thu, 8 Jul 2010 21:18:21 +0000 (21:18 +0000)
committerMark Dickinson <dickinsm@gmail.com>
Thu, 8 Jul 2010 21:18:21 +0000 (21:18 +0000)
svn+ssh://pythondev@svn.python.org/python/branches/py3k

........
  r82654 | mark.dickinson | 2010-07-08 22:15:36 +0100 (Thu, 08 Jul 2010) | 3 lines

  Issue #9136: Profiling Decimal gave 'dictionary changed size during iteration'.
  Remove the use of locals() that caused this error.
........

Lib/decimal.py
Misc/NEWS

index 958b2f9a72bf512cd91544e9d1def95baf0c4c2c..c61b549c483d8a6031e1f82491ae85a35a2a5c31 100644 (file)
@@ -3809,20 +3809,38 @@ class Context(object):
                  Emin=None, Emax=None,
                  capitals=None, _clamp=0,
                  _ignored_flags=None):
-        if flags is None:
-            flags = []
+        # Set defaults; for everything except flags and _ignored_flags,
+        # inherit from DefaultContext.
+        try:
+            dc = DefaultContext
+        except NameError:
+            pass
+
+        self.prec = prec if prec is not None else dc.prec
+        self.rounding = rounding if rounding is not None else dc.rounding
+        self.Emin = Emin if Emin is not None else dc.Emin
+        self.Emax = Emax if Emax is not None else dc.Emax
+        self.capitals = capitals if capitals is not None else dc.capitals
+        self._clamp = _clamp if _clamp is not None else dc._clamp
+
         if _ignored_flags is None:
-            _ignored_flags = []
-        if not isinstance(flags, dict):
-            flags = dict([(s, int(s in flags)) for s in _signals])
-        if traps is not None and not isinstance(traps, dict):
-            traps = dict([(s, int(s in traps)) for s in _signals])
-        for name, val in locals().items():
-            if val is None:
-                setattr(self, name, _copy.copy(getattr(DefaultContext, name)))
-            else:
-                setattr(self, name, val)
-        del self.self
+            self._ignored_flags = []
+        else:
+            self._ignored_flags = _ignored_flags
+
+        if traps is None:
+            self.traps = dc.traps.copy()
+        elif not isinstance(traps, dict):
+            self.traps = dict((s, int(s in traps)) for s in _signals)
+        else:
+            self.traps = traps
+
+        if flags is None:
+            self.flags = dict.fromkeys(_signals, 0)
+        elif not isinstance(flags, dict):
+            self.flags = dict((s, int(s in flags)) for s in _signals)
+        else:
+            self.flags = flags
 
     def __repr__(self):
         """Show the current context."""
index a236f60b27b057c9629b45538a5b0a28e76c2c69..f35860229bbb8859bc3e8a32ce99edb7a1f09745 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -75,6 +75,10 @@ C-API
 Library
 -------
 
+- Issue #9136: Fix 'dictionary changed size during iteration'
+  RuntimeError produced when profiling the decimal module.  This was
+  due to a dangerous iteration over 'locals()' in Context.__init__.
+
 - Fix extreme speed issue in Decimal.pow when the base is an exact
   power of 10 and the exponent is tiny (for example,
   Decimal(10) ** Decimal('1e-999999999')).