mirror of
https://github.com/python/cpython.git
synced 2025-11-03 11:23:31 +00:00
Issue #20381: Fix sanity checking on default arguments when c_default is
also specified.
This commit is contained in:
parent
66964cd477
commit
021bb87845
2 changed files with 16 additions and 3 deletions
|
|
@ -141,6 +141,11 @@ Tests
|
||||||
|
|
||||||
Tools/Demos
|
Tools/Demos
|
||||||
-----------
|
-----------
|
||||||
|
|
||||||
|
- Issue #20381: Argument Clinic now sanity checks the default argument when
|
||||||
|
c_default is also specified, providing a nice failure message for
|
||||||
|
disallowed values.
|
||||||
|
|
||||||
- Issue #20189: Argument Clinic now ensures that parser functions for
|
- Issue #20189: Argument Clinic now ensures that parser functions for
|
||||||
__new__ are always of type newfunc, the type of the tp_new slot.
|
__new__ are always of type newfunc, the type of the tp_new slot.
|
||||||
Similarly, parser functions for __init__ are now always of type initproc,
|
Similarly, parser functions for __init__ are now always of type initproc,
|
||||||
|
|
|
||||||
|
|
@ -3279,11 +3279,11 @@ class DSLParser:
|
||||||
fail("You can't specify py_default without specifying a default value!")
|
fail("You can't specify py_default without specifying a default value!")
|
||||||
else:
|
else:
|
||||||
default = default.strip()
|
default = default.strip()
|
||||||
|
bad = False
|
||||||
ast_input = "x = {}".format(default)
|
ast_input = "x = {}".format(default)
|
||||||
try:
|
try:
|
||||||
module = ast.parse(ast_input)
|
module = ast.parse(ast_input)
|
||||||
|
|
||||||
bad = False
|
|
||||||
if 'c_default' not in kwargs:
|
if 'c_default' not in kwargs:
|
||||||
# we can only represent very simple data values in C.
|
# we can only represent very simple data values in C.
|
||||||
# detect whether default is okay, via a blacklist
|
# detect whether default is okay, via a blacklist
|
||||||
|
|
@ -3317,8 +3317,16 @@ class DSLParser:
|
||||||
bad = blacklist.bad
|
bad = blacklist.bad
|
||||||
else:
|
else:
|
||||||
# if they specify a c_default, we can be more lenient about the default value.
|
# if they specify a c_default, we can be more lenient about the default value.
|
||||||
# but at least ensure that we can turn it into text and reconstitute it correctly.
|
# but at least make an attempt at ensuring it's a valid expression.
|
||||||
bad = default != repr(eval(default))
|
try:
|
||||||
|
value = eval(default)
|
||||||
|
if value == unspecified:
|
||||||
|
fail("'unspecified' is not a legal default value!")
|
||||||
|
except NameError:
|
||||||
|
pass # probably a named constant
|
||||||
|
except Exception as e:
|
||||||
|
fail("Malformed expression given as default value\n"
|
||||||
|
"{!r} caused {!r}".format(default, e))
|
||||||
if bad:
|
if bad:
|
||||||
fail("Unsupported expression as default value: " + repr(default))
|
fail("Unsupported expression as default value: " + repr(default))
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue