X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1b8c7ba607a15a2ff8a04448138df9ffff7df6c5..6caa0f5cd18fe9fb39c207d5f31fa5633479a822:/wxPython/src/pyfragments.swg diff --git a/wxPython/src/pyfragments.swg b/wxPython/src/pyfragments.swg index 84fc9a705a..e3c7d9fe4b 100644 --- a/wxPython/src/pyfragments.swg +++ b/wxPython/src/pyfragments.swg @@ -1,45 +1,55 @@ -// There standard t_output_helper has been changed to return a list rather -// than a tuple, we'll replace it with the old implementation here. - - -%fragment("t_output_helper","header") %{ - static PyObject* t_output_helper(PyObject* target, PyObject* o) { - PyObject* o2; - PyObject* o3; - - if (!target) { - target = o; - } else if (target == Py_None) { - Py_DECREF(Py_None); - target = o; - } else { - if (!PyTuple_Check(target)) { - o2 = target; - target = PyTuple_New(1); - PyTuple_SetItem(target, 0, o2); - } - o3 = PyTuple_New(1); - PyTuple_SetItem(o3, 0, o); - - o2 = target; - target = PySequence_Concat(o2, o3); - Py_DECREF(o2); - Py_DECREF(o3); +//---------------------------------------------------------------------- + +// The standard t_output_helper has been changed to return a list rather than +// a tuple, we'll replace it with the old implementation here. In SWIG 1.3.27 +// and earlier it is implemented as a $fragment, so it is only inserted into +// the modules that need it. For SWIG 1.3.28+ we just need to add a -D on the +// compile command line to turn on the tuple version of the AppendOuput +// function. +#if SWIG_VERSION < 0x010328 +%fragment("t_output_helper","header") +%{ + static PyObject* t_output_helper(PyObject* result, PyObject* obj) + { + PyObject* o2; + PyObject* o3; + if (!result) { + result = obj; + } else if (result == Py_None) { + Py_DECREF(result); + result = obj; + } else { + if (!PyTuple_Check(result)) { + o2 = result; + result = PyTuple_New(1); + PyTuple_SET_ITEM(result, 0, o2); + } + o3 = PyTuple_New(1); + PyTuple_SetItem(o3, 0, obj); + o2 = result; + result = PySequence_Concat(o2, o3); + Py_DECREF(o2); + Py_DECREF(o3); + } + return result; } - return target; - } %} +#endif + + +//---------------------------------------------------------------------- // These fragments are inserted in modules that need to convert PyObjects to // integer values, my versions allow any numeric type to be used, as long as // it can be converted to a PyInt. (Specifically, I allow floats where the // default SWIG_AsVal_long would just raise an exception. // +#if SWIG_VERSION < 0x010328 %fragment(SWIG_AsVal_frag(long), "header") { SWIGINTERN int @@ -50,7 +60,7 @@ SWIG_AsVal(long)(PyObject* obj, long* val) return 1; } else { - SWIG_type_error("number", obj); + SWIG_Python_TypeError("number", obj); } return 0; } @@ -64,7 +74,7 @@ SWIG_AsVal(unsigned long)(PyObject* obj, unsigned long* val) { long v = 0; if (SWIG_AsVal_long(obj, &v) && v < 0) { - SWIG_type_error("unsigned number", obj); + SWIG_Python_TypeError("unsigned number", obj); } else if (val) *val = (unsigned long)v; @@ -82,8 +92,55 @@ SWIG_AsVal(double)(PyObject *obj, double* val) return 1; } else { - SWIG_type_error("number", obj); + SWIG_Python_TypeError("number", obj); } return 0; } } + + +#else // SWIG_VERSION >= 1.3.28 + +%fragment(SWIG_AsVal_frag(long), "header") { +SWIGINTERN int +SWIG_AsVal(long)(PyObject* obj, long* val) +{ + if (PyNumber_Check(obj)) { + if (val) *val = PyInt_AsLong(obj); + return SWIG_OK; + } + return SWIG_TypeError; +} +} + + +%fragment(SWIG_AsVal_frag(unsigned long), "header", + fragment=SWIG_AsVal_frag(long)) { +SWIGINTERN int +SWIG_AsVal(unsigned long)(PyObject* obj, unsigned long* val) +{ + long v = 0; + if (SWIG_AsVal_long(obj, &v) && v < 0) { + return SWIG_TypeError; + } + else if (val) + *val = (unsigned long)v; + return SWIG_OK; +} +} + + +%fragment(SWIG_AsVal_frag(double), "header") { +SWIGINTERN int +SWIG_AsVal(double)(PyObject *obj, double* val) +{ + if (PyNumber_Check(obj)) { + if (val) *val = PyFloat_AsDouble(obj); + return SWIG_OK; + } + return SWIG_TypeError; +} +} + + +#endif // SWIG_VERSION