From ce94984b718ae5d52aab4ff9ce392d41f4bcaac9 Mon Sep 17 00:00:00 2001 From: Marcelo Matus Date: Mon, 23 Jan 2006 00:33:19 +0000 Subject: [PATCH] fix errors for 32bit arch. git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@8523 626c5289-ae23-0410-ae9c-e8d60b6d4f22 --- .../python/overload_simple_cast_runme.py | 6 +- Lib/python/pyprimtypes.swg | 98 ++++++++----------- Lib/typemaps/primtypes.swg | 27 ++--- 3 files changed, 60 insertions(+), 71 deletions(-) diff --git a/Examples/test-suite/python/overload_simple_cast_runme.py b/Examples/test-suite/python/overload_simple_cast_runme.py index 95fd57aa4..87e6e5d43 100644 --- a/Examples/test-suite/python/overload_simple_cast_runme.py +++ b/Examples/test-suite/python/overload_simple_cast_runme.py @@ -161,7 +161,7 @@ if s.type != "void *": # unsigned long long ullmax = 9223372036854775807 #0xffffffffffffffff -ullmaxd = 922337203685477580.0 +ullmaxd = 9007199254740992.0 ullmin = 0 ullmind = 0.0 if ull(ullmin) != ullmin: @@ -177,8 +177,8 @@ if ull(ullmaxd) != ullmaxd: llmax = 9223372036854775807 #0x7fffffffffffffff llmin = -9223372036854775808 # these are near the largest floats we can still convert into long long -llmaxd = 922337203685477580.0 -llmind = -922337203685477580.0 +llmaxd = 9007199254740992.0 +llmind = -9007199254740992.0 if ll(llmin) != llmin: raise runtimeerror, "ll(llmin)" if ll(llmax) != llmax: diff --git a/Lib/python/pyprimtypes.swg b/Lib/python/pyprimtypes.swg index cb9fc52a7..2a30f6ac3 100644 --- a/Lib/python/pyprimtypes.swg +++ b/Lib/python/pyprimtypes.swg @@ -118,14 +118,10 @@ SWIG_AsVal_dec(unsigned long)(PyObject *obj, unsigned long *val) %#ifdef SWIG_PYTHON_CAST_MODE { int dispatch = 0; - long v = PyInt_AsLong(obj); + unsigned long v = PyLong_AsUnsignedLong(obj); if (!PyErr_Occurred()) { - if (v >= 0) { - if (val) *val = v; - return SWIG_AddCast(SWIG_OK); - } else { - return SWIG_OverflowError; - } + if (val) *val = v; + return SWIG_AddCast(SWIG_OK); } else { PyErr_Clear(); } @@ -157,15 +153,14 @@ SWIG_From_dec(long long)(long long value) } %fragment(SWIG_AsVal_frag(long long),"header", + fragment=SWIG_AsVal_frag(long), fragment="SWIG_CanCastAsInteger", fragment="") { SWIGINTERN int SWIG_AsVal_dec(long long)(PyObject *obj, long long *val) { - if (PyInt_Check(obj)) { - if (val) *val = PyInt_AsLong(obj); - return SWIG_OK; - } else if (PyLong_Check(obj)) { + int res = SWIG_TypeError; + if (PyLong_Check(obj)) { long long v = PyLong_AsLongLong(obj); if (!PyErr_Occurred()) { if (val) *val = v; @@ -173,30 +168,28 @@ SWIG_AsVal_dec(long long)(PyObject *obj, long long *val) } else { PyErr_Clear(); } - } -%#ifdef SWIG_PYTHON_CAST_MODE - { - int dispatch = 0; - long v = PyInt_AsLong(obj); - if (!PyErr_Occurred()) { + } else { + long v; + res = SWIG_AsVal(long)(obj,&v); + if (SWIG_IsOK(res)) { if (val) *val = v; - return SWIG_AddCast(SWIG_OK); - } else { - PyErr_Clear(); - } - if (!dispatch) { - const double mant_max = 1LL << DBL_MANT_DIG; - const double mant_min = -mant_max; - double d; - int res = SWIG_AddCast(SWIG_AsVal(double)(obj,&d)); - if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, mant_min, mant_max)) { - if (val) *val = (long long)(d); - return res; - } + return res; } } +%#ifdef SWIG_PYTHON_CAST_MODE + { + const double mant_max = 1LL << DBL_MANT_DIG; + const double mant_min = -mant_max; + double d; + res = SWIG_AsVal(double)(obj,&d); + if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, mant_min, mant_max)) { + if (val) *val = (long long)(d); + return SWIG_AddCast(res); + } + res = SWIG_TypeError; + } %#endif - return SWIG_TypeError; + return res; } } @@ -220,6 +213,7 @@ SWIG_From_dec(unsigned long long)(unsigned long long value) SWIGINTERN int SWIG_AsVal_dec(unsigned long long)(PyObject *obj, unsigned long long *val) { + int res = SWIG_TypeError; if (PyLong_Check(obj)) { unsigned long long v = PyLong_AsUnsignedLongLong(obj); if (!PyErr_Occurred()) { @@ -230,36 +224,25 @@ SWIG_AsVal_dec(unsigned long long)(PyObject *obj, unsigned long long *val) } } else { unsigned long v; - int res = SWIG_AsVal(unsigned long)(obj,&v); - if (SWIG_IsOK(res) && val) *val = v; - return res; + res = SWIG_AsVal(unsigned long)(obj,&v); + if (SWIG_IsOK(res)) { + if (val) *val = v; + return res; + } } %#ifdef SWIG_PYTHON_CAST_MODE { - int dispatch = 0; - long v = PyInt_AsLong(obj); - if (!PyErr_Occurred()) { - if (v >= 0) { - if (val) *val = v; - return SWIG_AddCast(SWIG_OK); - } else { - return SWIG_OverflowError; - } - } else { - PyErr_Clear(); - } - if (!dispatch) { - const double mant_max = 1LL << DBL_MANT_DIG; - double d; - int res = SWIG_AddCast(SWIG_AsVal(double)(obj,&d)); - if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, 0, mant_max)) { - if (val) *val = (unsigned long long)(d); - return res; - } + const double mant_max = 1LL << DBL_MANT_DIG; + double d; + res = SWIG_AsVal(double)(obj,&d); + if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, 0, mant_max)) { + if (val) *val = (unsigned long long)(d); + return SWIG_AddCast(res); } + res = SWIG_TypeError; } %#endif - return SWIG_TypeError; + return res; } } @@ -273,6 +256,7 @@ SWIG_AsVal_dec(unsigned long long)(PyObject *obj, unsigned long long *val) SWIGINTERN int SWIG_AsVal_dec(double)(PyObject *obj, double *val) { + int res = SWIG_TypeError; if (PyFloat_Check(obj)) { if (val) *val = PyFloat_AsDouble(obj); return SWIG_OK; @@ -299,7 +283,7 @@ SWIG_AsVal_dec(double)(PyObject *obj, double *val) PyErr_Clear(); } if (!dispatch) { - long v = PyInt_AsLong(obj); + long v = PyLong_AsLong(obj); if (!PyErr_Occurred()) { if (val) *val = v; return SWIG_AddCast(SWIG_AddCast(SWIG_OK)); @@ -309,7 +293,7 @@ SWIG_AsVal_dec(double)(PyObject *obj, double *val) } } %#endif - return SWIG_TypeError; + return res; } } diff --git a/Lib/typemaps/primtypes.swg b/Lib/typemaps/primtypes.swg index f387e3697..57bda144a 100644 --- a/Lib/typemaps/primtypes.swg +++ b/Lib/typemaps/primtypes.swg @@ -197,6 +197,7 @@ SWIG_AsVal_dec(ptrdiff_t)(SWIG_Object obj, ptrdiff_t *val) } } + %fragment("SWIG_CanCastAsInteger","header", fragment=SWIG_AsVal_frag(double), fragment="", @@ -205,21 +206,25 @@ SWIGINTERNINLINE int SWIG_CanCastAsInteger(double *d, double min, double max) { double x = *d; if ((min <= x && x <= max)) { - double fx = floor(x); - double rd = ((x - fx) < 0.5) ? fx : ceil(x); /* simple rint */ + double fx = floor(x); + double cx = ceil(x); + double rd = ((x - fx) < 0.5) ? fx : cx; /* simple rint */ if ((errno == EDOM) || (errno == ERANGE)) { errno = 0; } else { - if (rd == x) { - return 1; + double summ, reps, diff; + if (rd < x) { + diff = x - rd; + } else if (rd > x) { + diff = rd - x; } else { - double diff = rd - x; - double summ = rd + x; - double reps = diff/summ; - if (fabs(reps) < 8*DBL_EPSILON) { - *d = rd; - return 1; - } + return 1; + } + summ = rd + x; + reps = diff/summ; + if (reps < 8*DBL_EPSILON) { + *d = rd; + return 1; } } }