From bcc6799dad4bd496624bd377f2e6e0c4b3fc7a79 Mon Sep 17 00:00:00 2001 From: da-woods Date: Sun, 3 Dec 2023 19:33:31 +0000 Subject: [PATCH] Make __Pyx_PyObject_ToDouble() work in the Limited API (GH-5888) --- Cython/Compiler/PyrexTypes.py | 4 ++-- Cython/Utility/Optimize.c | 28 ++++++---------------------- Cython/Utility/TypeConversion.c | 8 +++++--- 3 files changed, 13 insertions(+), 27 deletions(-) diff --git a/Cython/Compiler/PyrexTypes.py b/Cython/Compiler/PyrexTypes.py index a9802066479..b6af4a5ab3f 100644 --- a/Cython/Compiler/PyrexTypes.py +++ b/Cython/Compiler/PyrexTypes.py @@ -2377,7 +2377,7 @@ class CFloatType(CNumericType): is_float = 1 to_py_function = "PyFloat_FromDouble" - from_py_function = "__pyx_PyFloat_AsDouble" + from_py_function = "__Pyx_PyFloat_AsDouble" exception_value = -1 @@ -2385,7 +2385,7 @@ def __init__(self, rank, math_h_modifier = ''): CNumericType.__init__(self, rank, 1) self.math_h_modifier = math_h_modifier if rank == RANK_FLOAT: - self.from_py_function = "__pyx_PyFloat_AsFloat" + self.from_py_function = "__Pyx_PyFloat_AsFloat" def assignable_from_resolved_type(self, src_type): return (src_type.is_numeric and not src_type.is_complex) or src_type is error_type diff --git a/Cython/Utility/Optimize.c b/Cython/Utility/Optimize.c index 9a7eb356fbe..619e054b285 100644 --- a/Cython/Utility/Optimize.c +++ b/Cython/Utility/Optimize.c @@ -598,7 +598,7 @@ static double __Pyx__PyObject_AsDouble(PyObject* obj); /* proto */ PyFloat_AsDouble(obj) : __Pyx__PyObject_AsDouble(obj)) #else #define __Pyx_PyObject_AsDouble(obj) \ -((likely(PyFloat_CheckExact(obj))) ? PyFloat_AS_DOUBLE(obj) : \ +((likely(PyFloat_CheckExact(obj))) ? __Pyx_PyFloat_AS_DOUBLE(obj) : \ likely(PyLong_CheckExact(obj)) ? \ PyLong_AsDouble(obj) : __Pyx__PyObject_AsDouble(obj)) #endif @@ -639,7 +639,7 @@ static double __Pyx__PyObject_AsDouble(PyObject* obj) { } #endif if (likely(float_value)) { - double value = PyFloat_AS_DOUBLE(float_value); + double value = __Pyx_PyFloat_AS_DOUBLE(float_value); Py_DECREF(float_value); return value; } @@ -845,11 +845,7 @@ static CYTHON_INLINE double __Pyx_PyByteArray_AsDouble(PyObject *obj) { static double __Pyx_SlowPyString_AsDouble(PyObject *obj) { PyObject *float_value = PyFloat_FromString(obj); if (likely(float_value)) { -#if CYTHON_ASSUME_SAFE_MACROS - double value = PyFloat_AS_DOUBLE(float_value); -#else - double value = PyFloat_AsDouble(float_value); -#endif + double value = __Pyx_PyFloat_AS_DOUBLE(float_value); Py_DECREF(float_value); return value; } @@ -1096,11 +1092,7 @@ static CYTHON_INLINE {{c_ret_type}} __Pyx_PyInt_{{'' if ret_type.is_pyobject els if (PyFloat_CheckExact({{pyval}})) { const long {{'a' if order == 'CObj' else 'b'}} = intval; -#if CYTHON_COMPILING_IN_LIMITED_API - double {{ival}} = __pyx_PyFloat_AsDouble({{pyval}}); -#else - double {{ival}} = PyFloat_AS_DOUBLE({{pyval}}); -#endif + double {{ival}} = __Pyx_PyFloat_AS_DOUBLE({{pyval}}); {{return_compare('(double)a', '(double)b', c_op)}} } @@ -1322,11 +1314,7 @@ static {{c_ret_type}} {{cfunc_name}}(PyObject *op1, PyObject *op2, long intval, {{if c_op in '+-*' or op in ('TrueDivide', 'Eq', 'Ne')}} if (PyFloat_CheckExact({{pyval}})) { const long {{'a' if order == 'CObj' else 'b'}} = intval; -#if CYTHON_COMPILING_IN_LIMITED_API - double {{ival}} = __pyx_PyFloat_AsDouble({{pyval}}); -#else - double {{ival}} = PyFloat_AS_DOUBLE({{pyval}}); -#endif + double {{ival}} = __Pyx_PyFloat_AS_DOUBLE({{pyval}}); {{if op in ('Eq', 'Ne')}} if ((double)a {{c_op}} (double)b) { {{return_true}}; @@ -1402,11 +1390,7 @@ static {{c_ret_type}} {{cfunc_name}}(PyObject *op1, PyObject *op2, double floatv {{endif}} if (likely(PyFloat_CheckExact({{pyval}}))) { -#if CYTHON_COMPILING_IN_LIMITED_API - {{fval}} = __pyx_PyFloat_AsDouble({{pyval}}); -#else - {{fval}} = PyFloat_AS_DOUBLE({{pyval}}); -#endif + {{fval}} = __Pyx_PyFloat_AS_DOUBLE({{pyval}}); {{zerodiv_check(fval)}} } else diff --git a/Cython/Utility/TypeConversion.c b/Cython/Utility/TypeConversion.c index 4ac109ccd2c..449cd49efff 100644 --- a/Cython/Utility/TypeConversion.c +++ b/Cython/Utility/TypeConversion.c @@ -123,11 +123,13 @@ static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t); static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject*); #if CYTHON_ASSUME_SAFE_MACROS -#define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) +#define __Pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) +#define __Pyx_PyFloat_AS_DOUBLE(x) PyFloat_AS_DOUBLE(x) #else -#define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x) +#define __Pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x) +#define __Pyx_PyFloat_AS_DOUBLE(x) PyFloat_AsDouble(x) #endif -#define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x)) +#define __Pyx_PyFloat_AsFloat(x) ((float) __Pyx_PyFloat_AsDouble(x)) #define __Pyx_PyNumber_Int(x) (PyLong_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Long(x)) // __Pyx_PyNumber_Float is now in its own section since it has dependencies (needed to make