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