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;