]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Use Py_complex_protected AC converter for cmath.rect() (GH-154034)
authorSergey B Kirpichev <skirpichev@gmail.com>
Sun, 19 Jul 2026 00:24:16 +0000 (03:24 +0300)
committerGitHub <noreply@github.com>
Sun, 19 Jul 2026 00:24:16 +0000 (02:24 +0200)
Modules/clinic/cmathmodule.c.h
Modules/cmathmodule.c

index ecb5257cf6b240837df12a13653ea4c56b9ee7e5..fe40ece030116bf6386055e59f665efa9b6a1f96 100644 (file)
@@ -745,7 +745,7 @@ PyDoc_STRVAR(cmath_rect__doc__,
 #define CMATH_RECT_METHODDEF    \
     {"rect", _PyCFunction_CAST(cmath_rect), METH_FASTCALL, cmath_rect__doc__},
 
-static PyObject *
+static Py_complex
 cmath_rect_impl(PyObject *module, double r, double phi);
 
 static PyObject *
@@ -754,6 +754,7 @@ cmath_rect(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
     PyObject *return_value = NULL;
     double r;
     double phi;
+    Py_complex _return_value;
 
     if (!_PyArg_CheckPositional("rect", nargs, 2, 2)) {
         goto exit;
@@ -778,7 +779,18 @@ cmath_rect(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
             goto exit;
         }
     }
-    return_value = cmath_rect_impl(module, r, phi);
+    _return_value = cmath_rect_impl(module, r, phi);
+    if (errno == EDOM) {
+        PyErr_SetString(PyExc_ValueError, "math domain error");
+        goto exit;
+    }
+    else if (errno == ERANGE) {
+        PyErr_SetString(PyExc_OverflowError, "math range error");
+        goto exit;
+    }
+    else {
+        return_value = PyComplex_FromCComplex(_return_value);
+    }
 
 exit:
     return return_value;
@@ -987,4 +999,4 @@ skip_optional_kwonly:
 exit:
     return return_value;
 }
-/*[clinic end generated code: output=7d5ad4cf258526cd input=a9049054013a1b77]*/
+/*[clinic end generated code: output=89513888cb105a65 input=a9049054013a1b77]*/
index 7c736f4610bb9882dc2a3a9934010bdd29b986ff..f6e1475b00ecfbbeb34caa9dca3cbdb75891e448 100644 (file)
@@ -1060,7 +1060,7 @@ static Py_complex rect_special_values[7][7] = {
 };
 
 /*[clinic input]
-cmath.rect
+cmath.rect -> Py_complex_protected
 
     r: double
     phi: double
@@ -1069,9 +1069,9 @@ cmath.rect
 Convert from polar coordinates to rectangular coordinates.
 [clinic start generated code]*/
 
-static PyObject *
+static Py_complex
 cmath_rect_impl(PyObject *module, double r, double phi)
-/*[clinic end generated code: output=385a0690925df2d5 input=24c5646d147efd69]*/
+/*[clinic end generated code: output=74ff3d17585f3388 input=50e60c5d28c834e6]*/
 {
     Py_complex z;
     errno = 0;
@@ -1115,11 +1115,7 @@ cmath_rect_impl(PyObject *module, double r, double phi)
         z.imag = r * sin(phi);
         errno = 0;
     }
-
-    if (errno != 0)
-        return math_error();
-    else
-        return PyComplex_FromCComplex(z);
+    return z;
 }
 
 /*[clinic input]