Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix limited API __Pyx_PyObject_ToDouble #5888

Merged
merged 9 commits into from Dec 3, 2023
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
30 changes: 9 additions & 21 deletions Cython/Utility/Optimize.c
Expand Up @@ -578,6 +578,10 @@ static double __Pyx__PyObject_AsDouble(PyObject* obj); /* proto */
(likely(PyFloat_CheckExact(obj)) ? PyFloat_AS_DOUBLE(obj) : \
likely(PyInt_CheckExact(obj)) ? \
PyFloat_AsDouble(obj) : __Pyx__PyObject_AsDouble(obj))
#elif !CYTHON_ASSUME_SAFE_MACROS
#define __Pyx_PyObject_AsDouble(obj) \
da-woods marked this conversation as resolved.
Show resolved Hide resolved
(likely(PyFloat_CheckExact(obj) || PyInt_CheckExact(obj)) ? \
PyFloat_AsDouble(obj) : __Pyx__PyObject_AsDouble(obj))
#else
#define __Pyx_PyObject_AsDouble(obj) \
((likely(PyFloat_CheckExact(obj))) ? PyFloat_AS_DOUBLE(obj) : \
da-woods marked this conversation as resolved.
Show resolved Hide resolved
Expand Down Expand Up @@ -621,7 +625,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;
}
Expand Down Expand Up @@ -827,11 +831,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;
}
Expand Down Expand Up @@ -1078,11 +1078,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)}}
}

Expand Down Expand Up @@ -1304,11 +1300,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}};
Expand Down Expand Up @@ -1384,11 +1376,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

Expand Down
2 changes: 2 additions & 0 deletions Cython/Utility/TypeConversion.c
Expand Up @@ -124,8 +124,10 @@ 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_AS_DOUBLE(x) PyFloat_AS_DOUBLE(x)
da-woods marked this conversation as resolved.
Show resolved Hide resolved
#else
#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))

Expand Down