diff options
Diffstat (limited to 'Python')
| -rw-r--r-- | Python/structmember.c | 20 | 
1 files changed, 15 insertions, 5 deletions
diff --git a/Python/structmember.c b/Python/structmember.c index d230590..9f87c07 100644 --- a/Python/structmember.c +++ b/Python/structmember.c @@ -170,6 +170,8 @@ PyMember_SetOne(char *addr, PyMemberDef *l, PyObject *v)  {  	PyObject *oldv; +	addr += l->offset; +  	if ((l->flags & READONLY) || l->type == T_STRING)  	{  		PyErr_SetString(PyExc_TypeError, "readonly attribute"); @@ -179,12 +181,20 @@ PyMember_SetOne(char *addr, PyMemberDef *l, PyObject *v)  		PyErr_SetString(PyExc_RuntimeError, "restricted attribute");  		return -1;  	} -	if (v == NULL && l->type != T_OBJECT_EX && l->type != T_OBJECT) { -		PyErr_SetString(PyExc_TypeError, -				"can't delete numeric/char attribute"); -		return -1; +	if (v == NULL) { +		if (l->type == T_OBJECT_EX) { +			/* Check if the attribute is set. */ +			if (*(PyObject **)addr == NULL) { +				PyErr_SetString(PyExc_AttributeError, l->name); +				return -1; +			} +		} +		else if (l->type != T_OBJECT) { +			PyErr_SetString(PyExc_TypeError, +					"can't delete numeric/char attribute"); +			return -1; +		}  	} -	addr += l->offset;  	switch (l->type) {  	case T_BOOL:{  		if (!PyBool_Check(v)) {  | 
