Skip to content

Commit

Permalink
pythongh-116417: Avoid PyFloat_AS_DOUBLE() in AC limited C API (pytho…
Browse files Browse the repository at this point in the history
…n#116568)

Argument Clinic no longer calls PyFloat_AS_DOUBLE() when the usage of
the limited C API is requested.
  • Loading branch information
vstinner authored and diegorusso committed Apr 17, 2024
1 parent e5130ab commit 7a97ca7
Show file tree
Hide file tree
Showing 3 changed files with 155 additions and 19 deletions.
36 changes: 36 additions & 0 deletions Modules/_testclinic_limited.c
Expand Up @@ -72,10 +72,46 @@ my_int_sum_impl(PyObject *module, int x, int y)
}


/*[clinic input]
my_float_sum -> float
x: float
y: float
/
[clinic start generated code]*/

static float
my_float_sum_impl(PyObject *module, float x, float y)
/*[clinic end generated code: output=634f59a5a419cad7 input=d4b5313bdf4dc377]*/
{
return x + y;
}


/*[clinic input]
my_double_sum -> double
x: double
y: double
/
[clinic start generated code]*/

static double
my_double_sum_impl(PyObject *module, double x, double y)
/*[clinic end generated code: output=a75576d9e4d8557f input=16b11c8aba172801]*/
{
return x + y;
}


static PyMethodDef tester_methods[] = {
TEST_EMPTY_FUNCTION_METHODDEF
MY_INT_FUNC_METHODDEF
MY_INT_SUM_METHODDEF
MY_FLOAT_SUM_METHODDEF
MY_DOUBLE_SUM_METHODDEF
{NULL, NULL}
};

Expand Down
84 changes: 83 additions & 1 deletion Modules/clinic/_testclinic_limited.c.h

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

54 changes: 36 additions & 18 deletions Tools/clinic/clinic.py
Expand Up @@ -3867,19 +3867,28 @@ class float_converter(CConverter):

def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> str | None:
if self.format_unit == 'f':
return self.format_code("""
if (PyFloat_CheckExact({argname})) {{{{
{paramname} = (float) (PyFloat_AS_DOUBLE({argname}));
}}}}
else
{{{{
if not limited_capi:
return self.format_code("""
if (PyFloat_CheckExact({argname})) {{{{
{paramname} = (float) (PyFloat_AS_DOUBLE({argname}));
}}}}
else
{{{{
{paramname} = (float) PyFloat_AsDouble({argname});
if ({paramname} == -1.0 && PyErr_Occurred()) {{{{
goto exit;
}}}}
}}}}
""",
argname=argname)
else:
return self.format_code("""
{paramname} = (float) PyFloat_AsDouble({argname});
if ({paramname} == -1.0 && PyErr_Occurred()) {{{{
goto exit;
}}}}
}}}}
""",
argname=argname)
""",
argname=argname)
return super().parse_arg(argname, displayname, limited_capi=limited_capi)

class double_converter(CConverter):
Expand All @@ -3890,19 +3899,28 @@ class double_converter(CConverter):

def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> str | None:
if self.format_unit == 'd':
return self.format_code("""
if (PyFloat_CheckExact({argname})) {{{{
{paramname} = PyFloat_AS_DOUBLE({argname});
}}}}
else
{{{{
if not limited_capi:
return self.format_code("""
if (PyFloat_CheckExact({argname})) {{{{
{paramname} = PyFloat_AS_DOUBLE({argname});
}}}}
else
{{{{
{paramname} = PyFloat_AsDouble({argname});
if ({paramname} == -1.0 && PyErr_Occurred()) {{{{
goto exit;
}}}}
}}}}
""",
argname=argname)
else:
return self.format_code("""
{paramname} = PyFloat_AsDouble({argname});
if ({paramname} == -1.0 && PyErr_Occurred()) {{{{
goto exit;
}}}}
}}}}
""",
argname=argname)
""",
argname=argname)
return super().parse_arg(argname, displayname, limited_capi=limited_capi)


Expand Down

0 comments on commit 7a97ca7

Please sign in to comment.