Trent Mick's Win64 changes: size_t vs. int or long; also some overflow
tests.
diff --git a/Python/ceval.c b/Python/ceval.c
index 78196ba..e153432 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -2876,7 +2876,7 @@
 	}
 	else {
 		char *s = PyString_AsString(prog);
-		if ((int)strlen(s) != PyString_Size(prog)) {
+		if (strlen(s) != (size_t)PyString_Size(prog)) {
 			PyErr_SetString(PyExc_ValueError,
 					"embedded '\\0' in exec string");
 			return -1;
diff --git a/Python/codecs.c b/Python/codecs.c
index 5e01cca..ceff376 100644
--- a/Python/codecs.c
+++ b/Python/codecs.c
@@ -83,11 +83,16 @@
 PyObject *normalizestring(const char *string)
 {
     register int i;
-    int len = strlen(string);
+    size_t len = strlen(string);
     char *p;
     PyObject *v;
     
-    v = PyString_FromStringAndSize(NULL, len);
+	if (len > INT_MAX) {
+		PyErr_SetString(PyExc_OverflowError, "string is too large");
+		return NULL;
+	}
+	
+    v = PyString_FromStringAndSize(NULL, (int)len);
     if (v == NULL)
 	return NULL;
     p = PyString_AS_STRING(v);
diff --git a/Python/compile.c b/Python/compile.c
index a387317..4373422 100644
--- a/Python/compile.c
+++ b/Python/compile.c
@@ -265,8 +265,8 @@
 		if (!PyString_Check(v))
 			continue;
 		p = PyString_AsString(v);
-		if ((int)strspn(p, NAME_CHARS)
-		    != PyString_Size(v))
+		if (strspn(p, NAME_CHARS)
+		    != (size_t)PyString_Size(v))
 			continue;
 		PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
 	}
@@ -340,7 +340,7 @@
 	PyObject *exc;
 	char *msg;
 {
-	int n = strlen(msg);
+	size_t n = strlen(msg);
 	PyObject *v;
 	char buffer[30];
 	char *s;
@@ -720,12 +720,12 @@
 	struct compiling *c;
 	char *name;
 	char *buffer;
-	int maxlen;
+	size_t maxlen;
 {
 	/* Name mangling: __private becomes _classname__private.
 	   This is independent from how the name is used. */
 	char *p;
-	int nlen, plen;
+	size_t nlen, plen;
 	nlen = strlen(name);
 	if (nlen+2 >= maxlen)
 		return 0; /* Don't mangle __extremely_long_names */
@@ -761,7 +761,7 @@
 	char buffer[256];
 	if (name != NULL && name[0] == '_' && name[1] == '_' &&
 	    c->c_private != NULL &&
-	    com_mangle(c, name, buffer, (int)sizeof(buffer)))
+	    com_mangle(c, name, buffer, sizeof(buffer)))
 		name = buffer;
 #endif
 	if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
@@ -883,7 +883,7 @@
 	char *s;
 {
 	PyObject *v;
-	int len;
+	size_t len;
 	char *buf;
 	char *p;
 	char *end;
@@ -908,6 +908,10 @@
 	}
 	s++;
 	len = strlen(s);
+	if (len > INT_MAX) {
+		PyErr_SetString(PyExc_OverflowError, "string to parse is too long");
+		return NULL;
+	}
 	if (s[--len] != quote) {
 		PyErr_BadInternalCall();
 		return NULL;
@@ -2201,7 +2205,7 @@
 		char buffer[256];
 		if (s != NULL && s[0] == '_' && s[1] == '_' &&
 		    c->c_private != NULL &&
-		    com_mangle(c, s, buffer, (int)sizeof(buffer)))
+		    com_mangle(c, s, buffer, sizeof(buffer)))
 			s = buffer;
 #endif
 		if (PyDict_GetItemString(c->c_locals, s) != NULL) {
diff --git a/Python/dynload_win.c b/Python/dynload_win.c
index 08a2a89..7506c41 100644
--- a/Python/dynload_win.c
+++ b/Python/dynload_win.c
@@ -104,7 +104,7 @@
 					"DLL load failed with error code %d",
 					errorCode);
 			} else {
-				int len;
+				size_t len;
 				/* For some reason a \r\n
 				   is appended to the text */
 				if (theLength >= 2 &&
diff --git a/Python/getcwd.c b/Python/getcwd.c
index e720c99..7005869 100644
--- a/Python/getcwd.c
+++ b/Python/getcwd.c
@@ -62,7 +62,7 @@
 		return NULL;
 	}
 	ret = getwd(localbuf);
-	if (ret != NULL && strlen(localbuf) >= size) {
+	if (ret != NULL && strlen(localbuf) >= (size_t)size) {
 		errno = ERANGE;
 		return NULL;
 	}
diff --git a/Python/modsupport.c b/Python/modsupport.c
index 7b40286..13737f1 100644
--- a/Python/modsupport.c
+++ b/Python/modsupport.c
@@ -355,8 +355,15 @@
 				Py_INCREF(v);
 			}
 			else {
-				if (n < 0)
-					n = strlen(str);
+				if (n < 0) {
+					size_t m = strlen(str);
+					if (m > INT_MAX) {
+						PyErr_SetString(PyExc_OverflowError,
+							"string too long for Python string");
+						return NULL;
+					}
+					n = (int)m;
+				}
 				v = PyString_FromStringAndSize(str, n);
 			}
 			return v;
diff --git a/Python/sysmodule.c b/Python/sysmodule.c
index 6219454..843df8d 100644
--- a/Python/sysmodule.c
+++ b/Python/sysmodule.c
@@ -504,7 +504,7 @@
 	Py_XDECREF(v);
 #ifdef MS_COREDLL
 	PyDict_SetItemString(sysdict, "dllhandle",
-			     v = PyInt_FromLong((int)PyWin_DLLhModule));
+			     v = PyLong_FromVoidPtr(PyWin_DLLhModule));
 	Py_XDECREF(v);
 	PyDict_SetItemString(sysdict, "winver",
 			     v = PyString_FromString(PyWin_DLLVersionString));
diff --git a/Python/thread_nt.h b/Python/thread_nt.h
index c8ed6cd..9e82a94 100644
--- a/Python/thread_nt.h
+++ b/Python/thread_nt.h
@@ -101,6 +101,9 @@
 	return mutex->hevent != NULL ;	/* TRUE if the mutex is created */
 }
 
+#ifdef InterlockedCompareExchange
+#undef InterlockedCompareExchange
+#endif
 #define InterlockedCompareExchange(dest,exchange,comperand) (ixchg((dest), (exchange), (comperand)))
 
 VOID DeleteNonRecursiveMutex(PNRMUTEX mutex)
@@ -179,7 +182,7 @@
  */
 int PyThread_start_new_thread(void (*func)(void *), void *arg)
 {
-	long rv;
+	INT_PTR rv;
 	int success = 0;
 
 	dprintf(("%ld: PyThread_start_new_thread called\n", PyThread_get_thread_ident()));
@@ -190,7 +193,7 @@
  
 	if (rv != -1) {
 		success = 1;
-		dprintf(("%ld: PyThread_start_new_thread succeeded: %ld\n", PyThread_get_thread_ident(), rv));
+		dprintf(("%ld: PyThread_start_new_thread succeeded: %p\n", PyThread_get_thread_ident(), rv));
 	}
 
 	return success;
diff --git a/Python/traceback.c b/Python/traceback.c
index 0b8157d..d63aef5 100644
--- a/Python/traceback.c
+++ b/Python/traceback.c
@@ -166,7 +166,7 @@
 		path = PySys_GetObject("path");
 		if (path != NULL && PyList_Check(path)) {
 			int npath = PyList_Size(path);
-			int taillen = strlen(tail);
+			size_t taillen = strlen(tail);
 			char namebuf[MAXPATHLEN+1];
 			for (i = 0; i < npath; i++) {
 				PyObject *v = PyList_GetItem(path, i);
@@ -175,12 +175,12 @@
 					break;
 				}
 				if (PyString_Check(v)) {
-					int len;
+					size_t len;
 					len = PyString_Size(v);
 					if (len + 1 + taillen >= MAXPATHLEN)
 						continue; /* Too long */
 					strcpy(namebuf, PyString_AsString(v));
-					if ((int)strlen(namebuf) != len)
+					if (strlen(namebuf) != len)
 						continue; /* v contains '\0' */
 					if (len > 0 && namebuf[len-1] != SEP)
 						namebuf[len++] = SEP;