diff options
-rw-r--r-- | Lib/test/test_struct.py | 1 | ||||
-rw-r--r-- | Modules/structmodule.c | 16 |
2 files changed, 10 insertions, 7 deletions
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 @@ if sz * 3 != sz3: 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 @@ np_double(char *p, PyObject *v, const formatdef *f) 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; } |