? autom4te.cache ? build-debug ? build-not ? foo ? Objects/listobject.c-mine ? Python/compile.c-mine Index: Doc/ref/ref3.tex =================================================================== RCS file: /cvsroot/python/python/dist/src/Doc/ref/ref3.tex,v retrieving revision 1.120 diff -c -r1.120 ref3.tex *** Doc/ref/ref3.tex 29 Jun 2004 04:14:02 -0000 1.120 --- Doc/ref/ref3.tex 6 Aug 2004 16:04:54 -0000 *************** *** 449,460 **** \member{func_closure} is \code{None} or a tuple of cells that contain bindings for the function's free variables. ! Of these, \member{func_code}, \member{func_defaults}, ! \member{func_doc}/\member{__doc__}, and ! \member{func_dict}/\member{__dict__} may be writable; the ! others can never be changed. Additional information about a ! function's definition can be retrieved from its code object; see the ! description of internal types below. \withsubitem{(function attribute)}{ \ttindex{func_doc} --- 449,461 ---- \member{func_closure} is \code{None} or a tuple of cells that contain bindings for the function's free variables. ! Of these, \member{func_code}, \member{func_defaults}, ! \member{func_doc}/\member{__doc__}, ! \member{func_name}/\member{__name__}, and ! \member{func_dict}/\member{__dict__} may be writable; the others can ! never be changed. Additional information about a function's ! definition can be retrieved from its code object; see the description ! of internal types below. \withsubitem{(function attribute)}{ \ttindex{func_doc} Index: Lib/test/test_funcattrs.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_funcattrs.py,v retrieving revision 1.13 diff -c -r1.13 test_funcattrs.py *** Lib/test/test_funcattrs.py 31 Jan 2003 18:33:17 -0000 1.13 --- Lib/test/test_funcattrs.py 6 Aug 2004 16:04:54 -0000 *************** *** 268,275 **** def f(): pass verify(f.__name__ == "f") verify(f.func_name == "f") ! cantset(f, "func_name", "f") ! cantset(f, "__name__", "f") def test_func_code(): def f(): pass --- 268,282 ---- def f(): pass verify(f.__name__ == "f") verify(f.func_name == "f") ! f.__name__ = "g" ! verify(f.__name__ == "g") ! verify(f.func_name == "g") ! f.func_name = "h" ! verify(f.__name__ == "h") ! verify(f.func_name == "h") ! cantset(f, "func_globals", 1) ! cantset(f, "__name__", 1) ! def test_func_code(): def f(): pass Index: Objects/funcobject.c =================================================================== RCS file: /cvsroot/python/python/dist/src/Objects/funcobject.c,v retrieving revision 2.65 diff -c -r2.65 funcobject.c *** Objects/funcobject.c 8 Jul 2004 01:48:59 -0000 2.65 --- Objects/funcobject.c 6 Aug 2004 16:04:54 -0000 *************** *** 163,170 **** {"__doc__", T_OBJECT, OFF(func_doc), WRITE_RESTRICTED}, {"func_globals", T_OBJECT, OFF(func_globals), RESTRICTED|READONLY}, - {"func_name", T_OBJECT, OFF(func_name), READONLY}, - {"__name__", T_OBJECT, OFF(func_name), READONLY}, {"__module__", T_OBJECT, OFF(func_module), WRITE_RESTRICTED}, {NULL} /* Sentinel */ }; --- 163,168 ---- *************** *** 250,255 **** --- 248,283 ---- } static PyObject * + func_get_name(PyFunctionObject *op) + { + if (restricted()) + return NULL; + Py_INCREF(op->func_name); + return op->func_name; + } + + static int + func_set_name(PyFunctionObject *op, PyObject *value) + { + PyObject *tmp; + + if (restricted()) + return -1; + /* Not legal to del f.func_name or to set it to anything + * other than a string object. */ + if (value == NULL || !PyString_Check(value)) { + PyErr_SetString(PyExc_TypeError, + "func_name must be set to a string object"); + return -1; + } + tmp = op->func_name; + Py_INCREF(value); + op->func_name = value; + Py_DECREF(tmp); + return 0; + } + + static PyObject * func_get_defaults(PyFunctionObject *op) { if (restricted()) *************** *** 291,296 **** --- 319,326 ---- (setter)func_set_defaults}, {"func_dict", (getter)func_get_dict, (setter)func_set_dict}, {"__dict__", (getter)func_get_dict, (setter)func_set_dict}, + {"func_name", (getter)func_get_name, (setter)func_set_name}, + {"__name__", (getter)func_get_name, (setter)func_set_name}, {NULL} /* Sentinel */ };