From 7815c5e91e22a7f6dfb6b64357d25982f91ea46e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Walter=20D=C3=B6rwald?= Date: Mon, 11 Jun 2007 14:55:19 +0000 Subject: [PATCH] Check unicode identifier directly instead of converting it to an 8bit string first. --- Lib/test/test_descr.py | 7 +++++++ Objects/typeobject.c | 8 ++++---- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py index f20f676aa24..fca00615853 100644 --- a/Lib/test/test_descr.py +++ b/Lib/test/test_descr.py @@ -1083,6 +1083,13 @@ def slots(): pass else: raise TestFailed, "['foo\\0bar'] slots not caught" + try: + class C(object): + __slots__ = ["foo\u1234bar"] + except TypeError: + pass + else: + raise TestFailed, "['foo\\u1234bar'] slots not caught" try: class C(object): __slots__ = ["1"] diff --git a/Objects/typeobject.c b/Objects/typeobject.c index bc5fad1c137..b826eb4be0f 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -1561,7 +1561,7 @@ static PyGetSetDef subtype_getsets_weakref_only[] = { static int valid_identifier(PyObject *s) { - unsigned char *p; + Py_UNICODE *p; Py_ssize_t i, n; if (!PyUnicode_Check(s)) { @@ -1570,14 +1570,14 @@ valid_identifier(PyObject *s) s->ob_type->tp_name); return 0; } - p = (unsigned char *) PyUnicode_AsString(s); - n = strlen((char*)p)/*XXX PyString_GET_SIZE(s)*/; + p = PyUnicode_AS_UNICODE(s); + n = PyUnicode_GET_SIZE(s); /* We must reject an empty name. As a hack, we bump the length to 1 so that the loop will balk on the trailing \0. */ if (n == 0) n = 1; for (i = 0; i < n; i++, p++) { - if (!(i == 0 ? isalpha(*p) : isalnum(*p)) && *p != '_') { + if (i > 255 || (!(i == 0 ? isalpha(*p) : isalnum(*p)) && *p != '_')) { PyErr_SetString(PyExc_TypeError, "__slots__ must be identifiers"); return 0;