Merged revisions 82654 via svnmerge from

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.
........
This commit is contained in:
Mark Dickinson 2010-07-08 21:18:21 +00:00
parent 0390f504ac
commit 921d30d261
2 changed files with 35 additions and 13 deletions

View File

@ -3809,20 +3809,38 @@ class Context(object):
Emin=None, Emax=None, Emin=None, Emax=None,
capitals=None, _clamp=0, capitals=None, _clamp=0,
_ignored_flags=None): _ignored_flags=None):
if flags is None: # Set defaults; for everything except flags and _ignored_flags,
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: if _ignored_flags is None:
_ignored_flags = [] self._ignored_flags = []
if not isinstance(flags, dict): else:
flags = dict([(s, int(s in flags)) for s in _signals]) self._ignored_flags = _ignored_flags
if traps is not None and not isinstance(traps, dict):
traps = dict([(s, int(s in traps)) for s in _signals]) if traps is None:
for name, val in locals().items(): self.traps = dc.traps.copy()
if val is None: elif not isinstance(traps, dict):
setattr(self, name, _copy.copy(getattr(DefaultContext, name))) self.traps = dict((s, int(s in traps)) for s in _signals)
else: else:
setattr(self, name, val) self.traps = traps
del self.self
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): def __repr__(self):
"""Show the current context.""" """Show the current context."""

View File

@ -75,6 +75,10 @@ C-API
Library 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 - Fix extreme speed issue in Decimal.pow when the base is an exact
power of 10 and the exponent is tiny (for example, power of 10 and the exponent is tiny (for example,
Decimal(10) ** Decimal('1e-999999999')). Decimal(10) ** Decimal('1e-999999999')).