mirror of https://github.com/python/cpython
Check unicode identifier directly instead of converting
it to an 8bit string first.
This commit is contained in:
parent
4dbd01b435
commit
7815c5e91e
|
@ -1083,6 +1083,13 @@ def slots():
|
||||||
pass
|
pass
|
||||||
else:
|
else:
|
||||||
raise TestFailed, "['foo\\0bar'] slots not caught"
|
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:
|
try:
|
||||||
class C(object):
|
class C(object):
|
||||||
__slots__ = ["1"]
|
__slots__ = ["1"]
|
||||||
|
|
|
@ -1561,7 +1561,7 @@ static PyGetSetDef subtype_getsets_weakref_only[] = {
|
||||||
static int
|
static int
|
||||||
valid_identifier(PyObject *s)
|
valid_identifier(PyObject *s)
|
||||||
{
|
{
|
||||||
unsigned char *p;
|
Py_UNICODE *p;
|
||||||
Py_ssize_t i, n;
|
Py_ssize_t i, n;
|
||||||
|
|
||||||
if (!PyUnicode_Check(s)) {
|
if (!PyUnicode_Check(s)) {
|
||||||
|
@ -1570,14 +1570,14 @@ valid_identifier(PyObject *s)
|
||||||
s->ob_type->tp_name);
|
s->ob_type->tp_name);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
p = (unsigned char *) PyUnicode_AsString(s);
|
p = PyUnicode_AS_UNICODE(s);
|
||||||
n = strlen((char*)p)/*XXX PyString_GET_SIZE(s)*/;
|
n = PyUnicode_GET_SIZE(s);
|
||||||
/* We must reject an empty name. As a hack, we bump the
|
/* 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. */
|
length to 1 so that the loop will balk on the trailing \0. */
|
||||||
if (n == 0)
|
if (n == 0)
|
||||||
n = 1;
|
n = 1;
|
||||||
for (i = 0; i < n; i++, p++) {
|
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,
|
PyErr_SetString(PyExc_TypeError,
|
||||||
"__slots__ must be identifiers");
|
"__slots__ must be identifiers");
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in New Issue