[Python-checkins] r55011 - in python/branches/release25-maint: Lib/_strptime.py Lib/test/test_strptime.py Misc/NEWS

brett.cannon python-checkins at python.org
Sat Apr 28 01:17:50 CEST 2007


Author: brett.cannon
Date: Sat Apr 28 01:17:43 2007
New Revision: 55011

Modified:
   python/branches/release25-maint/Lib/_strptime.py
   python/branches/release25-maint/Lib/test/test_strptime.py
   python/branches/release25-maint/Misc/NEWS
Log:
Backport fix for r54646-7: properly clear locale cache in time.strptime when
the locale changes between calls.


Modified: python/branches/release25-maint/Lib/_strptime.py
==============================================================================
--- python/branches/release25-maint/Lib/_strptime.py	(original)
+++ python/branches/release25-maint/Lib/_strptime.py	Sat Apr 28 01:17:43 2007
@@ -299,17 +299,16 @@
     global _TimeRE_cache, _regex_cache
     _cache_lock.acquire()
     try:
-        time_re = _TimeRE_cache
-        locale_time = time_re.locale_time
-        if _getlang() != locale_time.lang:
+        if _getlang() != _TimeRE_cache.locale_time.lang:
             _TimeRE_cache = TimeRE()
-            _regex_cache = {}
+            _regex_cache.clear()
         if len(_regex_cache) > _CACHE_MAX_SIZE:
             _regex_cache.clear()
+        locale_time = _TimeRE_cache.locale_time
         format_regex = _regex_cache.get(format)
         if not format_regex:
             try:
-                format_regex = time_re.compile(format)
+                format_regex = _TimeRE_cache.compile(format)
             # KeyError raised when a bad format is found; can be specified as
             # \\, in which case it was a stray % but with a space after it
             except KeyError, err:

Modified: python/branches/release25-maint/Lib/test/test_strptime.py
==============================================================================
--- python/branches/release25-maint/Lib/test/test_strptime.py	(original)
+++ python/branches/release25-maint/Lib/test/test_strptime.py	Sat Apr 28 01:17:43 2007
@@ -505,6 +505,35 @@
         self.failIfEqual(locale_time_id,
                          id(_strptime._TimeRE_cache.locale_time))
 
+    def test_TimeRE_recreation(self):
+        # The TimeRE instance should be recreated upon changing the locale.
+        locale_info = locale.getlocale(locale.LC_TIME)
+        try:
+            locale.setlocale(locale.LC_TIME, ('en_US', 'UTF8'))
+        except locale.Error:
+            return
+        try:
+            _strptime.strptime('10', '%d')
+            # Get id of current cache object.
+            first_time_re_id = id(_strptime._TimeRE_cache)
+            try:
+                # Change the locale and force a recreation of the cache.
+                locale.setlocale(locale.LC_TIME, ('de_DE', 'UTF8'))
+                _strptime.strptime('10', '%d')
+                # Get the new cache object's id.
+                second_time_re_id = id(_strptime._TimeRE_cache)
+                # They should not be equal.
+                self.failIfEqual(first_time_re_id, second_time_re_id)
+            # Possible test locale is not supported while initial locale is.
+            # If this is the case just suppress the exception and fall-through
+            # to the reseting to the original locale.
+            except locale.Error:
+                pass
+        # Make sure we don't trample on the locale setting once we leave the
+        # test.
+        finally:
+            locale.setlocale(locale.LC_TIME, locale_info)
+
 
 def test_main():
     test_support.run_unittest(

Modified: python/branches/release25-maint/Misc/NEWS
==============================================================================
--- python/branches/release25-maint/Misc/NEWS	(original)
+++ python/branches/release25-maint/Misc/NEWS	Sat Apr 28 01:17:43 2007
@@ -12,6 +12,9 @@
 Library
 -------
 
+- Bug #1290505: Properly clear time.strptime's locale cache when the locale
+  changes between calls.  Backport of r54646 and r54647.
+
 - Bug #1706381: Specifying the SWIG option "-c++" in the setup.py file
   (as opposed to the command line) will now write file names ending in
   ".cpp" too.


More information about the Python-checkins mailing list