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

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


http://hg.python.org/cpython/rev/885ffda21849
changeset:   82636:885ffda21849
parent:      82632:e1e5423815a4
parent:      82635:dd2fad6b47c0
user:        Ezio Melotti <ezio.melotti at gmail.com>
date:        Wed Mar 13 01:55:07 2013 +0200
summary:
  #17368: merge with 3.3.

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
@@ -158,7 +158,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
@@ -277,6 +277,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 #17385: Fix quadratic behavior in threading.Condition.  The FIFO
   queue now uses a deque instead of a list.
 

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


More information about the Python-checkins mailing list