PyAPI: use PyC_Long_As... for gawain
Avoids inline overflow checks.
This commit is contained in:
@@ -180,28 +180,15 @@ success:
|
||||
/** \name Utility Functions
|
||||
* \{ */
|
||||
|
||||
#ifdef __GNUC__
|
||||
# define WARN_TYPE_LIMIT_PUSH \
|
||||
_Pragma("warning(push)") _Pragma("GCC diagnostic ignored \"-Wtype-limits\"") ((void)0)
|
||||
# define WARN_TYPE_LIMIT_POP \
|
||||
_Pragma("warning(pop)") ((void)0)
|
||||
#else
|
||||
# define WARN_TYPE_LIMIT_PUSH ((void)0)
|
||||
# define WARN_TYPE_LIMIT_POP ((void)0)
|
||||
#endif
|
||||
|
||||
/* Use for both tuple and single item, TODO: GWN_COMP_I10 */
|
||||
static const char *fill_format_elem_range_error = "Value out of range";
|
||||
|
||||
#define PY_AS_NATIVE_SWITCH(attr) \
|
||||
switch (attr->comp_type) { \
|
||||
case GWN_COMP_I8: { PY_AS_NATIVE(int8_t, INT8_MIN, INT8_MAX, int, PyLong_AsLong); break; } \
|
||||
case GWN_COMP_U8: { PY_AS_NATIVE(uint8_t, 0, UINT8_MAX, uint, PyLong_AsUnsignedLong); break; } \
|
||||
case GWN_COMP_I16: { PY_AS_NATIVE(int16_t, INT16_MIN, INT16_MAX, int, PyLong_AsLong); break; } \
|
||||
case GWN_COMP_U16: { PY_AS_NATIVE(uint16_t, 0, UINT16_MAX, uint, PyLong_AsUnsignedLong); break; } \
|
||||
case GWN_COMP_I32: { PY_AS_NATIVE(int32_t, INT32_MIN, INT32_MAX, int, PyLong_AsLong); break; } \
|
||||
case GWN_COMP_U32: { PY_AS_NATIVE(uint32_t, 0, UINT32_MAX, uint, PyLong_AsUnsignedLong); break; } \
|
||||
case GWN_COMP_F32: { PY_AS_NATIVE(float, 0, 0, float, PyFloat_AsDouble); break; } \
|
||||
case GWN_COMP_I8: { PY_AS_NATIVE(int8_t, PyC_Long_AsI8); break; } \
|
||||
case GWN_COMP_U8: { PY_AS_NATIVE(uint8_t, PyC_Long_AsU8); break; } \
|
||||
case GWN_COMP_I16: { PY_AS_NATIVE(int16_t, PyC_Long_AsI16); break; } \
|
||||
case GWN_COMP_U16: { PY_AS_NATIVE(uint16_t, PyC_Long_AsU16); break; } \
|
||||
case GWN_COMP_I32: { PY_AS_NATIVE(int32_t, PyC_Long_AsI32); break; } \
|
||||
case GWN_COMP_U32: { PY_AS_NATIVE(uint32_t, PyC_Long_AsU32); break; } \
|
||||
case GWN_COMP_F32: { PY_AS_NATIVE(float, PyFloat_AsDouble); break; } \
|
||||
default: \
|
||||
BLI_assert(0); \
|
||||
} ((void)0)
|
||||
@@ -209,16 +196,10 @@ static const char *fill_format_elem_range_error = "Value out of range";
|
||||
/* No error checking, callers must run PyErr_Occurred */
|
||||
static void fill_format_elem(void *data_dst_void, PyObject *py_src, const Gwn_VertAttr *attr)
|
||||
{
|
||||
#define PY_AS_NATIVE(ty_dst, ty_dst_min, ty_dst_max, ty_src, py_as_native) \
|
||||
#define PY_AS_NATIVE(ty_dst, py_as_native) \
|
||||
{ \
|
||||
ty_dst *data_dst = data_dst_void; \
|
||||
ty_src v = py_as_native(py_src); \
|
||||
WARN_TYPE_LIMIT_PUSH; \
|
||||
if ((ty_dst_min != ty_dst_max) && (v < ty_dst_min || v > ty_dst_max)) { \
|
||||
PyErr_SetString(PyExc_OverflowError, fill_format_elem_range_error); \
|
||||
} \
|
||||
WARN_TYPE_LIMIT_POP; \
|
||||
*data_dst = v; \
|
||||
*data_dst = py_as_native(py_src); \
|
||||
} ((void)0)
|
||||
|
||||
PY_AS_NATIVE_SWITCH(attr);
|
||||
@@ -234,16 +215,10 @@ static void fill_format_tuple(void *data_dst_void, PyObject *py_src, const Gwn_V
|
||||
/**
|
||||
* Args are constants, so range checks will be optimized out if they're nop's.
|
||||
*/
|
||||
#define PY_AS_NATIVE(ty_dst, ty_dst_min, ty_dst_max, ty_src, py_as_native) \
|
||||
#define PY_AS_NATIVE(ty_dst, py_as_native) \
|
||||
ty_dst *data_dst = data_dst_void; \
|
||||
for (uint i = 0; i < len; i++) { \
|
||||
ty_src v = py_as_native(PyTuple_GET_ITEM(py_src, i)); \
|
||||
WARN_TYPE_LIMIT_PUSH; \
|
||||
if ((ty_dst_min != ty_dst_max) && (v < ty_dst_min || v > ty_dst_max)) { \
|
||||
PyErr_SetString(PyExc_OverflowError, fill_format_elem_range_error); \
|
||||
} \
|
||||
WARN_TYPE_LIMIT_POP; \
|
||||
data_dst[i] = v; \
|
||||
data_dst[i] = py_as_native(PyTuple_GET_ITEM(py_src, i)); \
|
||||
} ((void)0)
|
||||
|
||||
PY_AS_NATIVE_SWITCH(attr);
|
||||
|
||||
Reference in New Issue
Block a user