diff options
author | Simon Feltman <sfeltman@src.gnome.org> | 2013-07-28 23:00:26 -0700 |
---|---|---|
committer | Simon Feltman <sfeltman@src.gnome.org> | 2013-07-28 23:00:26 -0700 |
commit | b5dcb1800839f747a052e487643c234668384677 (patch) | |
tree | 470a1f9099ef0ad07aab10683945b8b766373bef /gi | |
parent | 3c83bfb14b850670eb7c0208e55c120ca203f8af (diff) | |
download | pygobject-b5dcb1800839f747a052e487643c234668384677.tar.gz |
Use Python error messages for marshaling integers from Python
Use Pythons default error messages where possible.
Change all explicitly raised ValueError to use OverflowError
for out of range data.
https://bugzilla.gnome.org/show_bug.cgi?id=705057
Diffstat (limited to 'gi')
-rw-r--r-- | gi/pygi-marshal-from-py.c | 76 |
1 files changed, 27 insertions, 49 deletions
diff --git a/gi/pygi-marshal-from-py.c b/gi/pygi-marshal-from-py.c index 7c282348..a48479b5 100644 --- a/gi/pygi-marshal-from-py.c +++ b/gi/pygi-marshal-from-py.c @@ -286,7 +286,7 @@ check_valid_double (double x, double min, double max) /* we need this as PyErr_Format() does not support float types */ snprintf (buf, sizeof (buf), "%g not in range %g to %g", x, min, max); - PyErr_SetString (PyExc_ValueError, buf); + PyErr_SetString (PyExc_OverflowError, buf); return FALSE; } return TRUE; @@ -524,8 +524,10 @@ _pygi_marshal_from_py_long (PyObject *object, /* in */ case GI_TYPE_TAG_INT8: { long long_value = PyLong_AsLong (number); - if (long_value < G_MININT8 || long_value > G_MAXINT8) { - PyErr_Format (PyExc_ValueError, "%ld not in range %ld to %ld", + if (PyErr_Occurred()) { + break; + } else if (long_value < G_MININT8 || long_value > G_MAXINT8) { + PyErr_Format (PyExc_OverflowError, "%ld not in range %ld to %ld", long_value, (long)G_MININT8, (long)G_MAXINT8); } else { arg->v_int8 = long_value; @@ -536,8 +538,10 @@ _pygi_marshal_from_py_long (PyObject *object, /* in */ case GI_TYPE_TAG_UINT8: { long long_value = PyLong_AsLong (number); - if (long_value < 0 || long_value > G_MAXUINT8) { - PyErr_Format (PyExc_ValueError, "%ld not in range %ld to %ld", + if (PyErr_Occurred()) { + break; + } else if (long_value < 0 || long_value > G_MAXUINT8) { + PyErr_Format (PyExc_OverflowError, "%ld not in range %ld to %ld", long_value, (long)0, (long)G_MAXUINT8); } else { arg->v_uint8 = long_value; @@ -548,8 +552,10 @@ _pygi_marshal_from_py_long (PyObject *object, /* in */ case GI_TYPE_TAG_INT16: { long long_value = PyLong_AsLong (number); - if (long_value < G_MININT16 || long_value > G_MAXINT16) { - PyErr_Format (PyExc_ValueError, "%ld not in range %ld to %ld", + if (PyErr_Occurred()) { + break; + } else if (long_value < G_MININT16 || long_value > G_MAXINT16) { + PyErr_Format (PyExc_OverflowError, "%ld not in range %ld to %ld", long_value, (long)G_MININT16, (long)G_MAXINT16); } else { arg->v_int16 = long_value; @@ -560,8 +566,10 @@ _pygi_marshal_from_py_long (PyObject *object, /* in */ case GI_TYPE_TAG_UINT16: { long long_value = PyLong_AsLong (number); - if (long_value < 0 || long_value > G_MAXUINT16) { - PyErr_Format (PyExc_ValueError, "%ld not in range %ld to %ld", + if (PyErr_Occurred()) { + break; + } else if (long_value < 0 || long_value > G_MAXUINT16) { + PyErr_Format (PyExc_OverflowError, "%ld not in range %ld to %ld", long_value, (long)0, (long)G_MAXUINT16); } else { arg->v_uint16 = long_value; @@ -572,8 +580,10 @@ _pygi_marshal_from_py_long (PyObject *object, /* in */ case GI_TYPE_TAG_INT32: { long long_value = PyLong_AsLong (number); - if (long_value < G_MININT32 || long_value > G_MAXINT32) { - PyErr_Format (PyExc_ValueError, "%ld not in range %ld to %ld", + if (PyErr_Occurred()) { + break; + } else if (long_value < G_MININT32 || long_value > G_MAXINT32) { + PyErr_Format (PyExc_OverflowError, "%ld not in range %ld to %ld", long_value, (long)G_MININT32, (long)G_MAXINT32); } else { arg->v_int32 = long_value; @@ -584,8 +594,10 @@ _pygi_marshal_from_py_long (PyObject *object, /* in */ case GI_TYPE_TAG_UINT32: { PY_LONG_LONG long_value = PyLong_AsLongLong (number); - if (long_value < 0 || long_value > G_MAXUINT32) { - PyErr_Format (PyExc_ValueError, "%lld not in range %ld to %lu", + if (PyErr_Occurred()) { + break; + } else if (long_value < 0 || long_value > G_MAXUINT32) { + PyErr_Format (PyExc_OverflowError, "%lld not in range %ld to %lu", long_value, (long)0, (unsigned long)G_MAXUINT32); } else { arg->v_uint32 = long_value; @@ -596,48 +608,14 @@ _pygi_marshal_from_py_long (PyObject *object, /* in */ case GI_TYPE_TAG_INT64: { /* Rely on Python overflow error and convert to ValueError for 64 bit values */ - gint64 value = PyLong_AsLongLong (number); - if (PyErr_Occurred()) { - if (PyErr_ExceptionMatches (PyExc_OverflowError)) { - PyErr_Clear(); -#if PY_MAJOR_VERSION >= 3 - PyErr_Format (PyExc_ValueError, "%S not in range %lld to %lld", - number, PY_LLONG_MIN, PY_LLONG_MAX); -#else - /* Python 2.x does not support the %S format option and it is not - * worth the trouble to support this manually. - */ - PyErr_Format (PyExc_ValueError, "number not in range %lld to %lld", - PY_LLONG_MIN, PY_LLONG_MAX); -#endif - } - } else { - arg->v_int64 = value; - } + arg->v_int64 = PyLong_AsLongLong (number); break; } case GI_TYPE_TAG_UINT64: { /* Rely on Python overflow error and convert to ValueError for 64 bit values */ - guint64 value = PyLong_AsUnsignedLongLong (number); - if (PyErr_Occurred()) { - if (PyErr_ExceptionMatches (PyExc_OverflowError)) { - PyErr_Clear(); -#if PY_MAJOR_VERSION >= 3 - PyErr_Format (PyExc_ValueError, "%S not in range %ld to %llu", - number, (long)0, PY_ULLONG_MAX); -#else - /* Python 2.x does not support the %S format option and it is not - * worth the trouble to support this manually. - */ - PyErr_Format (PyExc_ValueError, "number not in range %ld to %llu", - (long)0, PY_ULLONG_MAX); -#endif - } - } else { - arg->v_uint64 = value; - } + arg->v_uint64 = PyLong_AsUnsignedLongLong (number); break; } |