api version checking

This commit is contained in:
Guido van Rossum 1995-01-09 17:47:20 +00:00
parent 6da5bfad0f
commit 970a0a20b8
2 changed files with 32 additions and 17 deletions

View File

@ -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, "")

View File

@ -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 */