Kaydet (Commit) fc252265 authored tarafından Brett Cannon's avatar Brett Cannon

Clear the regex cache when the locale changes.

Backport of fix for bug #1290505.
üst bedda76d
...@@ -272,13 +272,14 @@ _regex_cache = {} ...@@ -272,13 +272,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): ...@@ -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".
......
...@@ -92,6 +92,9 @@ Extension Modules ...@@ -92,6 +92,9 @@ Extension Modules
Library Library
------- -------
- Bug #1290505: time.strptime() was not invalidating its regex cache when the
locale changed.
- Fix a misuse of str.find() in detection of use of %U or %W in datetime - Fix a misuse of str.find() in detection of use of %U or %W in datetime
format. format.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment