Commit 055a3fbe authored by Mark Dickinson's avatar Mark Dickinson

Internal refactoring in struct.pack: make all integer conversions go through get_pylong.

parent b9f751ad
...@@ -89,7 +89,8 @@ typedef struct { char c; _Bool x; } s_bool; ...@@ -89,7 +89,8 @@ typedef struct { char c; _Bool x; } s_bool;
#pragma options align=reset #pragma options align=reset
#endif #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 * static PyObject *
get_pylong(PyObject *v) get_pylong(PyObject *v)
...@@ -113,13 +114,13 @@ get_long(PyObject *v, long *p) ...@@ -113,13 +114,13 @@ get_long(PyObject *v, long *p)
{ {
long x; long x;
if (!PyLong_Check(v)) { v = get_pylong(v);
PyErr_SetString(StructError, if (v == NULL)
"required argument is not an integer");
return -1; return -1;
} assert(PyLong_Check(v));
x = PyLong_AsLong(v); x = PyLong_AsLong(v);
if (x == -1 && PyErr_Occurred()) { Py_DECREF(v);
if (x == (long)-1 && PyErr_Occurred()) {
if (PyErr_ExceptionMatches(PyExc_OverflowError)) if (PyErr_ExceptionMatches(PyExc_OverflowError))
PyErr_SetString(StructError, PyErr_SetString(StructError,
"argument out of range"); "argument out of range");
...@@ -137,11 +138,10 @@ get_ulong(PyObject *v, unsigned long *p) ...@@ -137,11 +138,10 @@ get_ulong(PyObject *v, unsigned long *p)
{ {
unsigned long x; unsigned long x;
if (!PyLong_Check(v)) { v = get_pylong(v);
PyErr_SetString(StructError, if (v == NULL)
"required argument is not an integer");
return -1; return -1;
} assert(PyLong_Check(v));
x = PyLong_AsUnsignedLong(v); x = PyLong_AsUnsignedLong(v);
if (x == (unsigned long)-1 && PyErr_Occurred()) { if (x == (unsigned long)-1 && PyErr_Occurred()) {
if (PyErr_ExceptionMatches(PyExc_OverflowError)) if (PyErr_ExceptionMatches(PyExc_OverflowError))
...@@ -161,13 +161,13 @@ static int ...@@ -161,13 +161,13 @@ static int
get_longlong(PyObject *v, PY_LONG_LONG *p) get_longlong(PyObject *v, PY_LONG_LONG *p)
{ {
PY_LONG_LONG x; PY_LONG_LONG x;
if (!PyLong_Check(v)) {
PyErr_SetString(StructError, v = get_pylong(v);
"required argument is not an integer"); if (v == NULL)
return -1; return -1;
} assert(PyLong_Check(v));
x = PyLong_AsLongLong(v); x = PyLong_AsLongLong(v);
if (x == -1 && PyErr_Occurred()) { if (x == (PY_LONG_LONG)-1 && PyErr_Occurred()) {
if (PyErr_ExceptionMatches(PyExc_OverflowError)) if (PyErr_ExceptionMatches(PyExc_OverflowError))
PyErr_SetString(StructError, PyErr_SetString(StructError,
"argument out of range"); "argument out of range");
...@@ -183,13 +183,13 @@ static int ...@@ -183,13 +183,13 @@ static int
get_ulonglong(PyObject *v, unsigned PY_LONG_LONG *p) get_ulonglong(PyObject *v, unsigned PY_LONG_LONG *p)
{ {
unsigned PY_LONG_LONG x; unsigned PY_LONG_LONG x;
if (!PyLong_Check(v)) {
PyErr_SetString(StructError, v = get_pylong(v);
"required argument is not an integer"); if (v == NULL)
return -1; return -1;
} assert(PyLong_Check(v));
x = PyLong_AsUnsignedLongLong(v); x = PyLong_AsUnsignedLongLong(v);
if (x == -1 && PyErr_Occurred()) { if (x == (unsigned PY_LONG_LONG)-1 && PyErr_Occurred()) {
if (PyErr_ExceptionMatches(PyExc_OverflowError)) if (PyErr_ExceptionMatches(PyExc_OverflowError))
PyErr_SetString(StructError, PyErr_SetString(StructError,
"argument out of range"); "argument out of range");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment