bpo-37942: Improve argument clinic float converter (GH-15470)
diff --git a/Tools/clinic/clinic.py b/Tools/clinic/clinic.py
index 9880b39..d5863a3 100755
--- a/Tools/clinic/clinic.py
+++ b/Tools/clinic/clinic.py
@@ -3106,9 +3106,15 @@
def parse_arg(self, argname, argnum):
if self.format_unit == 'f':
return """
- {paramname} = (float) PyFloat_AsDouble({argname});
- if (PyErr_Occurred()) {{{{
- goto exit;
+ if (PyFloat_CheckExact({argname})) {{{{
+ {paramname} = (float) (PyFloat_AS_DOUBLE({argname}));
+ }}}}
+ else
+ {{{{
+ {paramname} = (float) PyFloat_AsDouble({argname});
+ if ({paramname} == -1.0 && PyErr_Occurred()) {{{{
+ goto exit;
+ }}}}
}}}}
""".format(argname=argname, paramname=self.name)
return super().parse_arg(argname, argnum)
@@ -3122,9 +3128,15 @@
def parse_arg(self, argname, argnum):
if self.format_unit == 'd':
return """
- {paramname} = PyFloat_AsDouble({argname});
- if (PyErr_Occurred()) {{{{
- goto exit;
+ if (PyFloat_CheckExact({argname})) {{{{
+ {paramname} = PyFloat_AS_DOUBLE({argname});
+ }}}}
+ else
+ {{{{
+ {paramname} = PyFloat_AsDouble({argname});
+ if ({paramname} == -1.0 && PyErr_Occurred()) {{{{
+ goto exit;
+ }}}}
}}}}
""".format(argname=argname, paramname=self.name)
return super().parse_arg(argname, argnum)