Author: Armin Rigo <[email protected]>
Branch: 
Changeset: r96551:0fd3a83a1891
Date: 2019-04-29 10:07 +0200
http://bitbucket.org/pypy/pypy/changeset/0fd3a83a1891/

Log:    Test and fix

diff --git a/pypy/module/_pypyjson/interp_decoder.py 
b/pypy/module/_pypyjson/interp_decoder.py
--- a/pypy/module/_pypyjson/interp_decoder.py
+++ b/pypy/module/_pypyjson/interp_decoder.py
@@ -365,9 +365,11 @@
         hexdigits = self.getslice(start, i)
         try:
             val = int(hexdigits, 16)
-            if sys.maxunicode > 65535 and 0xd800 <= val <= 0xdfff:
+            if sys.maxunicode > 65535 and 0xd800 <= val <= 0xdbff:
                 # surrogate pair
-                if self.ll_chars[i] == '\\' and self.ll_chars[i+1] == 'u':
+                if (self.ll_chars[i] == '\\' and self.ll_chars[i+1] == 'u' and
+                        self.ll_chars[i+2] in 'dD' and
+                        self.ll_chars[i+3] in 'cdefCDEF'):
                     val = self.decode_surrogate_pair(i, val)
                     i += 6
         except ValueError:
diff --git a/pypy/module/_pypyjson/test/test__pypyjson.py 
b/pypy/module/_pypyjson/test/test__pypyjson.py
--- a/pypy/module/_pypyjson/test/test__pypyjson.py
+++ b/pypy/module/_pypyjson/test/test__pypyjson.py
@@ -199,6 +199,17 @@
         res = _pypyjson.loads('"z\\ud834\\udd20x"')
         assert res == expected
 
+    def test_unicode_not_a_surrogate_pair(self):
+        import _pypyjson
+        res = _pypyjson.loads('"z\\ud800\\ud800x"')
+        assert list(res) == [u'z', u'\ud800', u'\ud800', u'x']
+        res = _pypyjson.loads('"z\\udbff\\uffffx"')
+        assert list(res) == [u'z', u'\udbff', u'\uffff', u'x']
+        res = _pypyjson.loads('"z\\ud800\\ud834\\udd20x"')
+        assert res == u'z\ud800\U0001d120x'
+        res = _pypyjson.loads('"z\\udc00\\udc00x"')
+        assert list(res) == [u'z', u'\udc00', u'\udc00', u'x']
+
     def test_surrogate_pair(self):
         import _pypyjson
         json = '{"a":"\\uD83D"}'
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to