Author: Matti Picus <matti.pi...@gmail.com> Branch: unicode-utf8-py3 Changeset: r95308:720cb17cdc85 Date: 2018-11-12 20:29 -0800 http://bitbucket.org/pypy/pypy/changeset/720cb17cdc85/
Log: test, fix for surrogates in type name diff --git a/pypy/objspace/std/test/test_typeobject.py b/pypy/objspace/std/test/test_typeobject.py --- a/pypy/objspace/std/test/test_typeobject.py +++ b/pypy/objspace/std/test/test_typeobject.py @@ -942,12 +942,15 @@ assert Abc.__name__ == 'Def' raises(TypeError, "Abc.__name__ = 42") raises(TypeError, "Abc.__name__ = b'A'") - try: - Abc.__name__ = 'G\x00hi' - except ValueError as e: - assert str(e) == "type name must not contain null characters" - else: - assert False + for v, err in [('G\x00hi', "type name must not contain null characters"), + ('A\udcdcB', "surrogates not allowed")]: + try: + Abc.__name__ = v + except ValueError as e: + assert err in str(e) + else: + assert False + assert Abc.__name__ == 'Def' def test_qualname(self): A = type('A', (), {'__qualname__': 'B.C'}) diff --git a/pypy/objspace/std/typeobject.py b/pypy/objspace/std/typeobject.py --- a/pypy/objspace/std/typeobject.py +++ b/pypy/objspace/std/typeobject.py @@ -14,7 +14,7 @@ from rpython.rlib.objectmodel import current_object_addr_as_int, compute_hash from rpython.rlib.objectmodel import we_are_translated, not_rpython from rpython.rlib.rarithmetic import intmask, r_uint -from rpython.rlib.rutf8 import CheckError, check_utf8 +from rpython.rlib.rutf8 import CheckError, check_utf8, surrogate_in_utf8 class MutableCell(W_Root): def unwrap_cell(self, space): @@ -801,9 +801,12 @@ return space.call_function(newfunc, w_winner, w_name, w_bases, w_dict) w_typetype = w_winner - name = space.text_w(w_name) # NB. CPython forbids surrogates here + name = space.text_w(w_name) if '\x00' in name: raise oefmt(space.w_ValueError, "type name must not contain null characters") + if surrogate_in_utf8(name) >= 0: + raise oefmt(space.w_ValueError, "can't encode character %c in position " + "%i, surrogates not allowed", name[pos], pos) dict_w = {} dictkeys_w = space.listview(w_dict) for w_key in dictkeys_w: @@ -868,6 +871,10 @@ name = space.text_w(w_value) if '\x00' in name: raise oefmt(space.w_ValueError, "type name must not contain null characters") + pos = surrogate_in_utf8(name) + if pos >= 0: + raise oefmt(space.w_ValueError, "can't encode character %s in position " + "%d, surrogates not allowed", name[pos], pos) w_type.name = name def descr_get__qualname__(space, w_type): _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit