Clear out the regex cache when the TimeRE cache is invalidated by a locale
change. Fixes bug #1290505.
This commit is contained in:
parent
fb1ef85b0b
commit
a783d06f8c
|
@ -275,13 +275,14 @@ _regex_cache = {}
|
||||||
|
|
||||||
def strptime(data_string, format="%a %b %d %H:%M:%S %Y"):
|
def strptime(data_string, format="%a %b %d %H:%M:%S %Y"):
|
||||||
"""Return a time struct based on the input string and the format string."""
|
"""Return a time struct based on the input string and the format string."""
|
||||||
global _TimeRE_cache
|
global _TimeRE_cache, _regex_cache
|
||||||
_cache_lock.acquire()
|
_cache_lock.acquire()
|
||||||
try:
|
try:
|
||||||
time_re = _TimeRE_cache
|
time_re = _TimeRE_cache
|
||||||
locale_time = time_re.locale_time
|
locale_time = time_re.locale_time
|
||||||
if _getlang() != locale_time.lang:
|
if _getlang() != locale_time.lang:
|
||||||
_TimeRE_cache = TimeRE()
|
_TimeRE_cache = TimeRE()
|
||||||
|
_regex_cache = {}
|
||||||
if len(_regex_cache) > _CACHE_MAX_SIZE:
|
if len(_regex_cache) > _CACHE_MAX_SIZE:
|
||||||
_regex_cache.clear()
|
_regex_cache.clear()
|
||||||
format_regex = _regex_cache.get(format)
|
format_regex = _regex_cache.get(format)
|
||||||
|
|
|
@ -462,10 +462,12 @@ class CacheTests(unittest.TestCase):
|
||||||
# Make sure cache is recreated when current locale does not match what
|
# Make sure cache is recreated when current locale does not match what
|
||||||
# cached object was created with.
|
# cached object was created with.
|
||||||
_strptime.strptime("10", "%d")
|
_strptime.strptime("10", "%d")
|
||||||
|
_strptime.strptime("2005", "%Y")
|
||||||
_strptime._TimeRE_cache.locale_time.lang = "Ni"
|
_strptime._TimeRE_cache.locale_time.lang = "Ni"
|
||||||
original_time_re = id(_strptime._TimeRE_cache)
|
original_time_re = id(_strptime._TimeRE_cache)
|
||||||
_strptime.strptime("10", "%d")
|
_strptime.strptime("10", "%d")
|
||||||
self.failIfEqual(original_time_re, id(_strptime._TimeRE_cache))
|
self.failIfEqual(original_time_re, id(_strptime._TimeRE_cache))
|
||||||
|
self.failUnlessEqual(len(_strptime._regex_cache), 1)
|
||||||
|
|
||||||
def test_regex_cleanup(self):
|
def test_regex_cleanup(self):
|
||||||
# Make sure cached regexes are discarded when cache becomes "full".
|
# Make sure cached regexes are discarded when cache becomes "full".
|
||||||
|
|
|
@ -217,6 +217,8 @@ Extension Modules
|
||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
- Bug #1290505: Fix clearing the regex cache for time.strptime().
|
||||||
|
|
||||||
- Bug #1167128: Fix size of a symlink in a tarfile to be 0.
|
- Bug #1167128: Fix size of a symlink in a tarfile to be 0.
|
||||||
|
|
||||||
- Patch #810023: Fix off-by-one bug in urllib.urlretrieve reporthook
|
- Patch #810023: Fix off-by-one bug in urllib.urlretrieve reporthook
|
||||||
|
|
Loading…
Reference in New Issue