api version checking
This commit is contained in:
parent
6da5bfad0f
commit
970a0a20b8
|
@ -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, "")
|
||||
|
|
|
@ -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 */
|
||||
|
||||
|
|
Loading…
Reference in New Issue