diff --git a/Include/modsupport.h b/Include/modsupport.h index fb196df62dc..f81248c7fac 100644 --- a/Include/modsupport.h +++ b/Include/modsupport.h @@ -51,9 +51,22 @@ extern object *mkvalue(); extern int vgetargs PROTO((object *, char *, va_list)); extern object *vmkvalue PROTO((char *, va_list)); -extern object *initmodule PROTO((char *, struct methodlist *)); -extern object *initmodule3 PROTO((char *, struct methodlist *, - char *, object *)); +#define PYTHON_API_VERSION 1001 +/* The API version is maintained (independently from the Python version) + so we can detect mismatches between the interpreter and dynamically + loaded modules. + + Please add a line or two to the top of this log for each API + version change: + + 9-Jan-1995 GvR Initial version (incompatible with older API) +*/ + +extern object *initmodule4 PROTO((char *, struct methodlist *, + char *, object *, int)); +#define initmodule(name, methods) \ + initmodule4(name, methods, (char *)NULL, (object *)NULL, \ + PYTHON_API_VERSION) /* The following are obsolete -- use getargs directly! */ #define getnoarg(v) getargs(v, "") diff --git a/Python/modsupport.c b/Python/modsupport.c index 9c5dbf93c75..93676848df1 100644 --- a/Python/modsupport.c +++ b/Python/modsupport.c @@ -33,20 +33,32 @@ typedef extended va_double; typedef double va_double; #endif -/* initmodule3() has two additional parameters: - - doc is the documentation string; - - passthrough is passed as self to functions defined in the module. +/* initmodule4() parameters: + - name is the module name + - methods is the list of top-level functions + - doc is the documentation string + - passthrough is passed as self to functions defined in the module + - api_version is the value of PYTHON_API_VERSION at the time the + module was compiled */ +static char api_version_warning[] = +"WARNING: Python C API version mismatch for module %s:\n\ + This Python has API version %d, module %s has version %s.\n"; + object * -initmodule3(name, methods, doc, passthrough) +initmodule4(name, methods, doc, passthrough, module_api_version) char *name; struct methodlist *methods; char *doc; object *passthrough; + int module_api_version; { object *m, *d, *v; struct methodlist *ml; + if (module_api_version != PYTHON_API_VERSION) + fprintf(stderr, api_version_warning, + name, PYTHON_API_VERSION, name, module_api_version); if ((m = add_module(name)) == NULL) { fprintf(stderr, "initializing module: %s\n", name); fatal("can't create a module"); @@ -69,16 +81,6 @@ initmodule3(name, methods, doc, passthrough) return m; } -/* The standard initmodule() passes NULL for 'self' */ - -object * -initmodule(name, methods) - char *name; - struct methodlist *methods; -{ - return initmodule3(name, methods, (char *)NULL, (object *)NULL); -} - /* Helper for mkvalue() to scan the length of a format */