Mercurial > cpython-lru_cache-weakref
diff Python/structmember.c @ 21187:ef6f692c76e2 legacy-trunk
Fix SF bug #486144: Uninitialized __slot__ vrbl is None.
There's now a new structmember code, T_OBJECT_EX, which is used for
all __slot__ variables (except __weakref__, which has special behavior
anyway). This new code raises AttributeError when the variable is
NULL rather than converting NULL to None.
| author | Guido van Rossum <guido@python.org> |
|---|---|
| date | Tue, 04 Dec 2001 16:23:42 +0000 |
| parents | bff6c2d76f33 |
| children | 86fdf8fe7f17 |
line wrap: on
line diff
--- a/Python/structmember.c Tue Dec 04 15:54:53 2001 +0000 +++ b/Python/structmember.c Tue Dec 04 16:23:42 2001 +0000 @@ -129,6 +129,12 @@ v = Py_None; Py_INCREF(v); break; + case T_OBJECT_EX: + v = *(PyObject **)addr; + if (v == NULL) + PyErr_SetString(PyExc_AttributeError, l->name); + Py_XINCREF(v); + break; default: PyErr_SetString(PyExc_SystemError, "bad memberdescr type"); v = NULL; @@ -175,7 +181,7 @@ PyErr_SetString(PyExc_RuntimeError, "restricted attribute"); return -1; } - if (v == NULL && l->type != T_OBJECT) { + if (v == NULL && l->type != T_OBJECT_EX && l->type != T_OBJECT) { PyErr_SetString(PyExc_TypeError, "can't delete numeric/char attribute"); return -1; @@ -246,6 +252,7 @@ } break; case T_OBJECT: + case T_OBJECT_EX: Py_XINCREF(v); oldv = *(PyObject **)addr; *(PyObject **)addr = v;
