Internal refactoring in struct.pack:  make all integer conversions go through get_pylong.
diff --git a/Modules/_struct.c b/Modules/_struct.c
index 7f6e305..43321a4 100644
--- a/Modules/_struct.c
+++ b/Modules/_struct.c
@@ -89,7 +89,8 @@
 #pragma options align=reset
 #endif
 
-/* Helper to get a PyLongObject.  Caller should decref. */
+/* Helper for integer format codes: converts an arbitrary Python object to a
+   PyLongObject if possible, otherwise fails.  Caller should decref. */
 
 static PyObject *
 get_pylong(PyObject *v)
@@ -113,13 +114,13 @@
 {
 	long x;
 
-	if (!PyLong_Check(v)) {
-		PyErr_SetString(StructError,
-				"required argument is not an integer");
+	v = get_pylong(v);
+	if (v == NULL)
 		return -1;
-	}
+	assert(PyLong_Check(v));
 	x = PyLong_AsLong(v);
-	if (x == -1 && PyErr_Occurred()) {
+	Py_DECREF(v);
+	if (x == (long)-1 && PyErr_Occurred()) {
 		if (PyErr_ExceptionMatches(PyExc_OverflowError))
 			PyErr_SetString(StructError,
 					"argument out of range");
@@ -137,11 +138,10 @@
 {
 	unsigned long x;
 
-	if (!PyLong_Check(v)) {
-		PyErr_SetString(StructError,
-				"required argument is not an integer");
+	v = get_pylong(v);
+	if (v == NULL)
 		return -1;
-	}
+	assert(PyLong_Check(v));
 	x = PyLong_AsUnsignedLong(v);
 	if (x == (unsigned long)-1 && PyErr_Occurred()) {
 		if (PyErr_ExceptionMatches(PyExc_OverflowError))
@@ -161,13 +161,13 @@
 get_longlong(PyObject *v, PY_LONG_LONG *p)
 {
 	PY_LONG_LONG x;
-	if (!PyLong_Check(v)) {
-		PyErr_SetString(StructError,
-				"required argument is not an integer");
+
+	v = get_pylong(v);
+	if (v == NULL)
 		return -1;
-	}
+	assert(PyLong_Check(v));
 	x = PyLong_AsLongLong(v);
-	if (x == -1 && PyErr_Occurred()) {
+	if (x == (PY_LONG_LONG)-1 && PyErr_Occurred()) {
 		if (PyErr_ExceptionMatches(PyExc_OverflowError))
 			PyErr_SetString(StructError,
 					"argument out of range");
@@ -183,13 +183,13 @@
 get_ulonglong(PyObject *v, unsigned PY_LONG_LONG *p)
 {
 	unsigned PY_LONG_LONG x;
-	if (!PyLong_Check(v)) {
-		PyErr_SetString(StructError,
-				"required argument is not an integer");
+
+	v = get_pylong(v);
+	if (v == NULL)
 		return -1;
-	}
+	assert(PyLong_Check(v));
 	x = PyLong_AsUnsignedLongLong(v);
-	if (x == -1 && PyErr_Occurred()) {
+	if (x == (unsigned PY_LONG_LONG)-1 && PyErr_Occurred()) {
 		if (PyErr_ExceptionMatches(PyExc_OverflowError))
 			PyErr_SetString(StructError,
 					"argument out of range");