Provide __module__ attributes for functions defined in C and Python.

__module__ is the string name of the module the function was defined
in, just like __module__ of classes.  In some cases, particularly for
C functions, the __module__ may be None.

Change PyCFunction_New() from a function to a macro, but keep an
unused copy of the function around so that we don't change the binary
API.

Change pickle's save_global() to use whichmodule() if __module__ is
None, but add the __module__ logic to whichmodule() since it might be
used outside of pickle.
This commit is contained in:
Jeremy Hylton 2003-01-31 18:33:18 +00:00
parent 8f24cdc0d5
commit 4f0dcc9a9a
8 changed files with 114 additions and 18 deletions

View file

@ -126,22 +126,27 @@ Exception\n\
static int
populate_methods(PyObject *klass, PyObject *dict, PyMethodDef *methods)
{
PyObject *module;
int status = -1;
if (!methods)
return 0;
module = PyString_FromString("exceptions");
if (!module)
return 0;
while (methods->ml_name) {
/* get a wrapper for the built-in function */
PyObject *func = PyCFunction_New(methods, NULL);
PyObject *func = PyCFunction_NewEx(methods, NULL, module);
PyObject *meth;
int status;
if (!func)
return -1;
goto status;
/* turn the function into an unbound method */
if (!(meth = PyMethod_New(func, NULL, klass))) {
Py_DECREF(func);
return -1;
goto status;
}
/* add method to dictionary */
@ -151,11 +156,14 @@ populate_methods(PyObject *klass, PyObject *dict, PyMethodDef *methods)
/* stop now if an error occurred, otherwise do the next method */
if (status)
return status;
goto status;
methods++;
}
return 0;
status = 0;
status:
Py_DECREF(module);
return status;
}