From fc252265dc91dc3e29c11c1a9c8f3c67dd0c157b Mon Sep 17 00:00:00 2001 From: Brett Cannon Date: Thu, 15 Sep 2005 02:42:05 +0000 Subject: Clear the regex cache when the locale changes. Backport of fix for bug #1290505. --- Lib/_strptime.py | 3 ++- Lib/test/test_strptime.py | 2 ++ Misc/NEWS | 3 +++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/Lib/_strptime.py b/Lib/_strptime.py index f8dbdd5..3bd5a8f 100644 --- a/Lib/_strptime.py +++ b/Lib/_strptime.py @@ -272,13 +272,14 @@ _regex_cache = {} 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.""" - global _TimeRE_cache + global _TimeRE_cache, _regex_cache _cache_lock.acquire() try: time_re = _TimeRE_cache locale_time = time_re.locale_time if _getlang() != locale_time.lang: _TimeRE_cache = TimeRE() + _regex_cache = {} if len(_regex_cache) > _CACHE_MAX_SIZE: _regex_cache.clear() format_regex = _regex_cache.get(format) diff --git a/Lib/test/test_strptime.py b/Lib/test/test_strptime.py index 785497a..f9763aa 100644 --- a/Lib/test/test_strptime.py +++ b/Lib/test/test_strptime.py @@ -462,10 +462,12 @@ class CacheTests(unittest.TestCase): # Make sure cache is recreated when current locale does not match what # cached object was created with. _strptime.strptime("10", "%d") + _strptime.strptime("2005", "%Y") _strptime._TimeRE_cache.locale_time.lang = "Ni" original_time_re = id(_strptime._TimeRE_cache) _strptime.strptime("10", "%d") self.failIfEqual(original_time_re, id(_strptime._TimeRE_cache)) + self.failUnlessEqual(len(_strptime._regex_cache), 1) def test_regex_cleanup(self): # Make sure cached regexes are discarded when cache becomes "full". diff --git a/Misc/NEWS b/Misc/NEWS index cbc6dc1..793c4c3 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -92,6 +92,9 @@ Extension Modules 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 format. -- cgit v0.12