Skip to content

Commit

Permalink
pythongh-116417: Avoid PyFloat_AS_DOUBLE() in AC limited C API
Browse files Browse the repository at this point in the history
Argument Clinic no longer calls PyFloat_AS_DOUBLE() when the usage of
the limited C API is requested.
  • Loading branch information
vstinner committed Mar 10, 2024
1 parent 5b2f21f commit 39e6d67
Showing 1 changed file with 36 additions and 18 deletions.
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 39e6d67

Please sign in to comment.