added "magic" number to the _sre module, to avoid weird errors caused
by compiler/engine mismatches
diff --git a/Lib/sre_compile.py b/Lib/sre_compile.py
index adab767..c2996fc 100644
--- a/Lib/sre_compile.py
+++ b/Lib/sre_compile.py
@@ -12,6 +12,8 @@
 
 from sre_constants import *
 
+assert _sre.MAGIC == MAGIC, "SRE module mismatch"
+
 MAXCODE = 65535
 
 def _compile(code, pattern, flags):
diff --git a/Lib/sre_constants.py b/Lib/sre_constants.py
index a5e4bb8..b429a33 100644
--- a/Lib/sre_constants.py
+++ b/Lib/sre_constants.py
@@ -9,8 +9,15 @@
 # See the sre.py file for information on usage and redistribution.
 #
 
+# update when constants are added or removed
+
+MAGIC = 20010115
+
+# max code word in this release
+
 MAXREPEAT = 65535
 
+# SRE standard exception (access as sre.error)
 # should this really be here?
 
 class error(Exception):
@@ -211,6 +218,8 @@
 
 """)
 
+    f.write("#define SRE_MAGIC %d\n" % MAGIC)
+
     dump(f, OPCODES, "SRE_OP")
     dump(f, ATCODES, "SRE")
     dump(f, CHCODES, "SRE")
diff --git a/Modules/_sre.c b/Modules/_sre.c
index b040d87..efb704b 100644
--- a/Modules/_sre.c
+++ b/Modules/_sre.c
@@ -2355,11 +2355,19 @@
 #endif
 init_sre(void)
 {
+    PyObject* m;
+    PyObject* d;
+
     /* Patch object types */
     Pattern_Type.ob_type = Match_Type.ob_type =
         Scanner_Type.ob_type = &PyType_Type;
 
-    Py_InitModule("_" MODULE, _functions);
+    m = Py_InitModule("_" MODULE, _functions);
+    d = PyModule_GetDict(m);
+
+    PyDict_SetItemString(
+        d, "MAGIC", (PyObject*) PyInt_FromLong(SRE_MAGIC)
+        );
 }
 
 #endif /* !defined(SRE_RECURSIVE) */
diff --git a/Modules/sre_constants.h b/Modules/sre_constants.h
index 6cad089..c6850ad 100644
--- a/Modules/sre_constants.h
+++ b/Modules/sre_constants.h
@@ -11,6 +11,7 @@
  * See the _sre.c file for information on usage and redistribution.
  */
 
+#define SRE_MAGIC 20010115
 #define SRE_OP_FAILURE 0
 #define SRE_OP_SUCCESS 1
 #define SRE_OP_ANY 2