[Python-checkins] CVS: python/dist/src/Objects funcobject.c,2.39,2.40

Barry Warsaw bwarsaw@users.sourceforge.net
2001年8月14日 11:24:00 -0700


Update of /cvsroot/python/python/dist/src/Objects
In directory usw-pr-cvs1:/tmp/cvs-serv30602
Modified Files:
	funcobject.c 
Log Message:
func_getattro(), func_setattro(): Implement the new semantics for
 setting and deleting a function's __dict__ attribute. Deleting
 it, or setting it to a non-dictionary result in a TypeError. Note
 that getting it the first time magically initializes it to an
 empty dict so that func.__dict__ will always appear to be a
 dictionary (never None).
 Closes SF bug #446645.
Index: funcobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/funcobject.c,v
retrieving revision 2.39
retrieving revision 2.40
diff -C2 -d -r2.39 -r2.40
*** funcobject.c	2001年08月02日 04:15:00	2.39
--- funcobject.c	2001年08月14日 18:23:58	2.40
***************
*** 152,156 ****
 		return NULL;
 	}
! 
 	return PyObject_GenericGetAttr(op, name);
 }
--- 152,167 ----
 		return NULL;
 	}
! 	/* If func_dict is being accessed but no attribute has been set
! 	 * yet, then initialize it to the empty dictionary.
! 	 */
! 	if ((!strcmp(sname, "func_dict") || !strcmp(sname, "__dict__"))
! 	 && ((PyFunctionObject*)op)->func_dict == NULL)
! 	{
! 		PyFunctionObject* funcop = (PyFunctionObject*)op;
! 		
! 		funcop->func_dict = PyDict_New();
! 		if (funcop->func_dict == NULL)
! 			return NULL;
! 	}
 	return PyObject_GenericGetAttr(op, name);
 }
***************
*** 191,207 ****
 	}
 	else if (!strcmp(sname, "func_dict") || !strcmp(sname, "__dict__")) {
! 		/* legal to del f.func_dict. Can only set func_dict to
! 		 * NULL or a dictionary.
 		 */
! 		if (value == Py_None)
! 			value = NULL;
! 		if (value != NULL && !PyDict_Check(value)) {
 			PyErr_SetString(
 				PyExc_TypeError,
! 				"func_dict must be set to a dict object");
 			return -1;
 		}
 	}
- 
 	return PyObject_GenericSetAttr(op, name, value);
 }
--- 202,221 ----
 	}
 	else if (!strcmp(sname, "func_dict") || !strcmp(sname, "__dict__")) {
! 		/* It is illegal to del f.func_dict. Can only set
! 		 * func_dict to a dictionary.
 		 */
! 		if (value == NULL) {
 			PyErr_SetString(
 				PyExc_TypeError,
! 				"function's dictionary may not be deleted");
 			return -1;
 		}
+ 		if (!PyDict_Check(value)) {
+ 			PyErr_SetString(
+ 				PyExc_TypeError,
+ 				"setting function's dictionary to a non-dict");
+ 			return -1;
+ 		}
 	}
 	return PyObject_GenericSetAttr(op, name, value);
 }

AltStyle によって変換されたページ (->オリジナル) /