Patch #1011240: SystemError generated by struct.pack('P', 'foo').
diff --git a/Lib/test/test_struct.py b/Lib/test/test_struct.py
index 0641d9b..9332466 100644
--- a/Lib/test/test_struct.py
+++ b/Lib/test/test_struct.py
@@ -54,6 +54,7 @@
 simple_err(struct.pack, 'iii', 3)
 simple_err(struct.pack, 'i', 3, 3, 3)
 simple_err(struct.pack, 'i', 'foo')
+simple_err(struct.pack, 'P', 'foo')
 simple_err(struct.unpack, 'd', 'flap')
 s = struct.pack('ii', 1, 2)
 simple_err(struct.unpack, 'iii', s)
diff --git a/Modules/structmodule.c b/Modules/structmodule.c
index b78231f..33134e9 100644
--- a/Modules/structmodule.c
+++ b/Modules/structmodule.c
@@ -518,14 +518,16 @@
 static int
 np_void_p(char *p, PyObject *v, const formatdef *f)
 {
-	void *x = PyLong_AsVoidPtr(v);
-	if (x == NULL && PyErr_Occurred()) {
-		/* ### hrm. PyLong_AsVoidPtr raises SystemError */
-		if (PyErr_ExceptionMatches(PyExc_TypeError))
-			PyErr_SetString(StructError,
-					"required argument is not an integer");
+	void *x;
+
+	v = get_pylong(v);
+	if (v == NULL)
 		return -1;
-	}
+	assert(PyLong_Check(v));
+	x = PyLong_AsVoidPtr(v);
+	Py_DECREF(v);
+	if (x == NULL && PyErr_Occurred())
+		return -1;
 	memcpy(p, (char *)&x, sizeof x);
 	return 0;
 }