]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
api version checking
authorGuido van Rossum <guido@python.org>
Mon, 9 Jan 1995 17:47:20 +0000 (17:47 +0000)
committerGuido van Rossum <guido@python.org>
Mon, 9 Jan 1995 17:47:20 +0000 (17:47 +0000)
Include/modsupport.h
Python/modsupport.c

index fb196df62dce305284d0ddab6f00b784089e4a76..f81248c7fac3e9f2d66fbffa30e24fee0e650fe2 100644 (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, "")
index 9c5dbf93c7506a25805140b931dc7c6c5da60fc9..93676848df105612899df5619731e90f630a0927 100644 (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 */