[Python-checkins] cpython (merge 3.2 -> 3.3): #17368: merge with 3.2.

ezio.melotti python-checkins at python.org
Wed Mar 13 00:55:26 CET 2013


http://hg.python.org/cpython/rev/dd2fad6b47c0
changeset:   82635:dd2fad6b47c0
branch:      3.3
parent:      82629:4012d4b41b2b
parent:      82634:40c36d873f41
user:        Ezio Melotti <ezio.melotti at gmail.com>
date:        Wed Mar 13 01:53:38 2013 +0200
summary:
  #17368: merge with 3.2.

files:
  Lib/json/decoder.py                |   2 +-
  Lib/test/json_tests/test_decode.py |  14 ++++++++++----
  Misc/NEWS                          |   4 ++++
  3 files changed, 15 insertions(+), 5 deletions(-)


diff --git a/Lib/json/decoder.py b/Lib/json/decoder.py
--- a/Lib/json/decoder.py
+++ b/Lib/json/decoder.py
@@ -166,7 +166,7 @@
         if nextchar == '}':
             if object_pairs_hook is not None:
                 result = object_pairs_hook(pairs)
-                return result, end
+                return result, end + 1
             pairs = {}
             if object_hook is not None:
                 pairs = object_hook(pairs)
diff --git a/Lib/test/json_tests/test_decode.py b/Lib/test/json_tests/test_decode.py
--- a/Lib/test/json_tests/test_decode.py
+++ b/Lib/test/json_tests/test_decode.py
@@ -25,16 +25,22 @@
         p = [("xkd", 1), ("kcw", 2), ("art", 3), ("hxm", 4),
              ("qrt", 5), ("pad", 6), ("hoy", 7)]
         self.assertEqual(self.loads(s), eval(s))
-        self.assertEqual(self.loads(s, object_pairs_hook = lambda x: x), p)
+        self.assertEqual(self.loads(s, object_pairs_hook=lambda x: x), p)
         self.assertEqual(self.json.load(StringIO(s),
                                         object_pairs_hook=lambda x: x), p)
-        od = self.loads(s, object_pairs_hook = OrderedDict)
+        od = self.loads(s, object_pairs_hook=OrderedDict)
         self.assertEqual(od, OrderedDict(p))
         self.assertEqual(type(od), OrderedDict)
         # the object_pairs_hook takes priority over the object_hook
-        self.assertEqual(self.loads(s, object_pairs_hook = OrderedDict,
-                                    object_hook = lambda x: None),
+        self.assertEqual(self.loads(s, object_pairs_hook=OrderedDict,
+                                    object_hook=lambda x: None),
                          OrderedDict(p))
+        # check that empty objects literals work (see #17368)
+        self.assertEqual(self.loads('{}', object_pairs_hook=OrderedDict),
+                         OrderedDict())
+        self.assertEqual(self.loads('{"empty": {}}',
+                                    object_pairs_hook=OrderedDict),
+                         OrderedDict([('empty', OrderedDict())]))
 
     def test_decoder_optimizations(self):
         # Several optimizations were made that skip over calls to
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -193,6 +193,10 @@
 Library
 -------
 
+- Issue #17368: Fix an off-by-one error in the Python JSON decoder that caused
+  a failure while decoding empty object literals when object_pairs_hook was
+  specified.
+
 - Issue #14645: The email generator classes now produce output using the
   specified linesep throughout.  Previously if the prolog, epilog, or
   body were stored with a different linesep, that linesep was used.  This

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list