Merge part of the trunk changes into the p3yk branch. This merges from 43030
(branch-creation time) up to 43067. 43068 and 43069 contain a little
swapping action between re.py and sre.py, and this mightily confuses svn
merge, so later changes are going in separately.

This merge should break no additional tests.

The last-merged revision is going in a 'last_merge' property on '.' (the
branch directory.) Arbitrarily chosen, really; if there's a BCP for this, I
couldn't find it, but we can easily change it afterwards ;)
diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c
index 7c5da64..926c85b 100644
--- a/Modules/_ctypes/_ctypes.c
+++ b/Modules/_ctypes/_ctypes.c
@@ -3674,7 +3674,11 @@
 		if (cache == NULL)
 			return NULL;
 	}
+#if (PY_VERSION_HEX < 0x02050000)
+	key = Py_BuildValue("(Oi)", itemtype, length);
+#else
 	key = Py_BuildValue("(On)", itemtype, length);
+#endif
 	if (!key)
 		return NULL;
 	result = PyDict_GetItem(cache, key);
@@ -3698,7 +3702,11 @@
 #endif
 
 	result = PyObject_CallFunction((PyObject *)&ArrayType_Type,
+#if (PY_VERSION_HEX < 0x02050000)
+				       "s(O){s:i,s:O}",
+#else
 				       "s(O){s:n,s:O}",
+#endif
 				       name,
 				       &Array_Type,
 				       "_length_",
diff --git a/Modules/_ctypes/cfield.c b/Modules/_ctypes/cfield.c
index de41571..336f265 100644
--- a/Modules/_ctypes/cfield.c
+++ b/Modules/_ctypes/cfield.c
@@ -250,11 +250,21 @@
 	name = ((PyTypeObject *)self->proto)->tp_name;
 
 	if (bits)
-		result = PyString_FromFormat("<Field type=%s, ofs=%d:%d, bits=%d>",
-					     name, (int)self->offset, size, bits);
+		result = PyString_FromFormat(
+#if (PY_VERSION_HEX < 0x02050000)
+			"<Field type=%s, ofs=%d:%d, bits=%d>",
+#else
+			"<Field type=%s, ofs=%zd:%d, bits=%d>",
+#endif
+			name, self->offset, size, bits);
 	else
-		result = PyString_FromFormat("<Field type=%s, ofs=%d, size=%d>",
-					     name, (int)self->offset, size);
+		result = PyString_FromFormat(
+#if (PY_VERSION_HEX < 0x02050000)
+			"<Field type=%s, ofs=%d, size=%d>",
+#else
+			"<Field type=%s, ofs=%zd, size=%d>",
+#endif
+			name, self->offset, size);
 	return result;
 }
 
diff --git a/Modules/_ctypes/ctypes.h b/Modules/_ctypes/ctypes.h
index 9347c99..179dcf1 100644
--- a/Modules/_ctypes/ctypes.h
+++ b/Modules/_ctypes/ctypes.h
@@ -1,5 +1,18 @@
 /******************************************************************/
 
+#if (PY_VERSION_HEX < 0x02050000)
+typedef int Py_ssize_t;
+#define lenfunc inquiry
+#define readbufferproc getreadbufferproc
+#define writebufferproc getwritebufferproc
+#define segcountproc getsegcountproc
+#define charbufferproc getcharbufferproc
+#define ssizeargfunc intargfunc
+#define ssizessizeargfunc intintargfunc
+#define ssizeobjargproc intobjargproc
+#define ssizessizeobjargproc intintobjargproc
+#endif
+
 #ifndef MS_WIN32
 #define max(a, b) ((a) > (b) ? (a) : (b))
 #define min(a, b) ((a) < (b) ? (a) : (b))
diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c
index 913c49a..6d8ea3c 100644
--- a/Modules/_testcapimodule.c
+++ b/Modules/_testcapimodule.c
@@ -522,6 +522,18 @@
 	return Py_None;
 }
 
+/* Example passing NULLs to PyObject_Str(NULL) and PyObject_Unicode(NULL). */
+
+static PyObject *
+test_null_strings(PyObject *self)
+{
+	PyObject *o1 = PyObject_Str(NULL), *o2 = PyObject_Unicode(NULL);
+	PyObject *tuple = PyTuple_Pack(2, o1, o2);
+	Py_XDECREF(o1);
+	Py_XDECREF(o2);
+	return tuple;
+}
+
 static PyObject *
 raise_exception(PyObject *self, PyObject *args)
 {
@@ -597,6 +609,7 @@
 	{"test_long_api",	(PyCFunction)test_long_api,	 METH_NOARGS},
 	{"test_long_numbits",	(PyCFunction)test_long_numbits,	 METH_NOARGS},
 	{"test_k_code",		(PyCFunction)test_k_code,	 METH_NOARGS},
+	{"test_null_strings",	(PyCFunction)test_null_strings,	 METH_NOARGS},
 
 	{"getargs_b",		(PyCFunction)getargs_b,		 METH_VARARGS},
 	{"getargs_B",		(PyCFunction)getargs_B,		 METH_VARARGS},
diff --git a/Modules/cStringIO.c b/Modules/cStringIO.c
index fd28aa9..bdc9f00 100644
--- a/Modules/cStringIO.c
+++ b/Modules/cStringIO.c
@@ -144,7 +144,8 @@
 
 static PyObject *
 IO_isatty(IOobject *self, PyObject *unused) {
-	Py_INCREF(Py_False);
+        if (!IO__opencheck(self)) return NULL;
+        Py_INCREF(Py_False);
         return Py_False;
 }
 
diff --git a/Modules/main.c b/Modules/main.c
index c8298fb..b3ce16e 100644
--- a/Modules/main.c
+++ b/Modules/main.c
@@ -130,27 +130,42 @@
 	}
 }
 
-/* Get the path to a top-level module */
-static struct filedescr * FindModule(const char *module,
-				     FILE **fp, char **filename)
+
+static int RunModule(char *module)
 {
-	struct filedescr *fdescr = NULL;
-	*fp = NULL;
-	*filename = malloc(MAXPATHLEN);
-
-	if (*filename == NULL)
-		return NULL;
-
-	/* Find the actual module source code */
-	fdescr = _PyImport_FindModule(module, NULL,
-					*filename, MAXPATHLEN, fp, NULL);
-
-	if (fdescr == NULL) {
-		free(*filename);
-		*filename = NULL;
+	PyObject *runpy, *runmodule, *runargs, *result;
+	runpy = PyImport_ImportModule("runpy");
+	if (runpy == NULL) {
+		fprintf(stderr, "Could not import runpy module\n");
+		return -1;
 	}
-
-	return fdescr;
+	runmodule = PyObject_GetAttrString(runpy, "run_module");
+	if (runmodule == NULL) {
+		fprintf(stderr, "Could not access runpy.run_module\n");
+		Py_DECREF(runpy);
+		return -1;
+	}
+	runargs = Py_BuildValue("sOsO", module,
+							Py_None, "__main__", Py_True);
+	if (runargs == NULL) {
+		fprintf(stderr,
+				"Could not create arguments for runpy.run_module\n");
+		Py_DECREF(runpy);
+		Py_DECREF(runmodule);
+		return -1;
+	}
+	result = PyObject_Call(runmodule, runargs, NULL);
+	if (result == NULL) {
+		PyErr_Print();
+	}
+	Py_DECREF(runpy);
+	Py_DECREF(runmodule);
+	Py_DECREF(runargs);
+	if (result == NULL) {
+		return -1;
+	}
+	Py_DECREF(result);
+	return 0;
 }
 
 /* Main program */
@@ -410,28 +425,9 @@
 	}
 
 	if (module != NULL) {
-		/* Backup _PyOS_optind and find the real file */
-                struct filedescr *fdescr = NULL;
+		/* Backup _PyOS_optind and force sys.arv[0] = module */
 		_PyOS_optind--;
-		if ((fdescr = FindModule(module, &fp, &filename))) {
-			argv[_PyOS_optind] = filename;
-		} else {
-			fprintf(stderr, "%s: module %s not found\n",
-				argv[0], module);
-			return 2;
-		}
-		if (!fp) {
-			fprintf(stderr,
-				"%s: module %s has no associated file\n",
-				argv[0], module);
-			return 2;
-		}
-		if (!_PyImport_IsScript(fdescr)) {
-			fprintf(stderr,
-				"%s: module %s not usable as script\n  (%s)\n",
-				argv[0], module, filename);
-			return 2;
-		}
+        argv[_PyOS_optind] = module;
 	}
 
 	PySys_SetArgv(argc-_PyOS_optind, argv+_PyOS_optind);
@@ -450,9 +446,8 @@
 		sts = PyRun_SimpleStringFlags(command, &cf) != 0;
 		free(command);
 	} else if (module) {
-		sts = PyRun_AnyFileExFlags(fp, filename, 1, &cf) != 0;
+		sts = RunModule(module);
 		free(module);
-		free(filename);
 	}
 	else {
 		if (filename == NULL && stdin_is_interactive) {
diff --git a/Modules/xxmodule.c b/Modules/xxmodule.c
index df312eb..ea66eef 100644
--- a/Modules/xxmodule.c
+++ b/Modules/xxmodule.c
@@ -197,18 +197,6 @@
 	return Py_None;
 }
 
-/* Example passing NULLs to PyObject_Str(NULL) and PyObject_Unicode(NULL). */
-
-static PyObject *
-xx_null(PyObject *self, PyObject *noargs)
-{
-	PyObject *o1 = PyObject_Str(NULL), *o2 = PyObject_Unicode(NULL);
-	PyObject *tuple = PyTuple_Pack(2, o1, o2);
-	Py_XDECREF(o1);
-	Py_XDECREF(o2);
-	return tuple;
-}
-
 /* Test bad format character */
 
 static PyObject *
@@ -343,8 +331,6 @@
 		PyDoc_STR("new() -> new Xx object")},
 	{"bug",		xx_bug,		METH_VARARGS,
 		PyDoc_STR("bug(o) -> None")},
-	{"null",	xx_null,	METH_NOARGS,
-		PyDoc_STR("null(o) -> ('NULL', u'NULL')")},
 	{NULL,		NULL}		/* sentinel */
 };