close
Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Fix non-inlined parsing in __init__ and __new__.
  • Loading branch information
serhiy-storchaka committed Aug 18, 2023
commit 660713746879e71c100ec88acf9ffbe2b8b302b0
27 changes: 27 additions & 0 deletions Lib/test/test_clinic.py
Comment thread
erlend-aasland marked this conversation as resolved.
Original file line number Diff line number Diff line change
Expand Up @@ -3247,6 +3247,19 @@ def test_depr_star_init_cloned(self):
fn(a=None)
self.check_depr_star("'a'", fn, None, name='_testclinic.DeprStarInit.cloned')

def test_depr_star_init_noinline(self):
cls = ac_tester.DeprStarInitNoInline
self.assertRaises(TypeError, cls, "a")
cls(a="a", b="b")
cls(a="a", b="b", c="c")
cls("a", b="b")
cls("a", b="b", c="c")
check = partial(self.check_depr_star, "'b' and 'c'", cls)
check("a", "b")
check("a", "b", "c")
check("a", "b", c="c")
self.assertRaises(TypeError, cls, "a", "b", "c", "d")

def test_depr_kwd_new(self):
cls = ac_tester.DeprKwdNew
cls()
Expand All @@ -3259,6 +3272,20 @@ def test_depr_kwd_init(self):
cls(None)
self.check_depr_kwd("'a'", cls, a=None)

def test_depr_kwd_init_noinline(self):
cls = ac_tester.DeprKwdInitNoInline
cls = ac_tester.depr_star_noinline
self.assertRaises(TypeError, cls, "a")
cls(a="a", b="b")
cls(a="a", b="b", c="c")
cls("a", b="b")
cls("a", b="b", c="c")
check = partial(self.check_depr_star, "'b' and 'c'", cls)
check("a", "b")
check("a", "b", "c")
check("a", "b", c="c")
self.assertRaises(TypeError, cls, "a", "b", "c", "d")

def test_depr_star_pos0_len1(self):
fn = ac_tester.depr_star_pos0_len1
fn(a=None)
Expand Down
66 changes: 66 additions & 0 deletions Modules/_testclinic.c
Original file line number Diff line number Diff line change
Expand Up @@ -1298,6 +1298,36 @@ static PyTypeObject DeprStarInit = {
};


/*[clinic input]
class _testclinic.DeprStarInitNoInline "PyObject *" "PyObject"
_testclinic.DeprStarInitNoInline.__init__ as depr_star_init_noinline
a: object
* [from 3.14]
b: object
c: object = None
*
# Force to use _PyArg_ParseTupleAndKeywordsFast.
d: str(accept={str, robuffer}, zeroes=True) = ''
[clinic start generated code]*/

static int
depr_star_init_noinline_impl(PyObject *self, PyObject *a, PyObject *b,
PyObject *c, const char *d, Py_ssize_t d_length)
/*[clinic end generated code: output=9b31fc167f1bf9f7 input=5a887543122bca48]*/
{
return 0;
}

static PyTypeObject DeprStarInitNoInline = {
PyVarObject_HEAD_INIT(NULL, 0)
.tp_name = "_testclinic.DeprStarInitNoInline",
.tp_basicsize = sizeof(PyObject),
.tp_new = PyType_GenericNew,
.tp_init = depr_star_init_noinline,
.tp_flags = Py_TPFLAGS_DEFAULT,
};


/*[clinic input]
class _testclinic.DeprKwdNew "PyObject *" "PyObject"
@classmethod
Expand Down Expand Up @@ -1348,6 +1378,36 @@ static PyTypeObject DeprKwdInit = {
};


/*[clinic input]
class _testclinic.DeprKwdInitNoInline "PyObject *" "PyObject"
_testclinic.DeprKwdInitNoInline.__init__ as depr_kwd_init_noinline
a: object
/
b: object
c: object = None
/ [from 3.14]
# Force to use _PyArg_ParseTupleAndKeywordsFast.
d: str(accept={str, robuffer}, zeroes=True) = ''
[clinic start generated code]*/

static int
depr_kwd_init_noinline_impl(PyObject *self, PyObject *a, PyObject *b,
PyObject *c, const char *d, Py_ssize_t d_length)
/*[clinic end generated code: output=27759d70ddd25873 input=c19d982c8c70a930]*/
{
return 0;
}

static PyTypeObject DeprKwdInitNoInline = {
PyVarObject_HEAD_INIT(NULL, 0)
.tp_name = "_testclinic.DeprKwdInitNoInline",
.tp_basicsize = sizeof(PyObject),
.tp_new = PyType_GenericNew,
.tp_init = depr_kwd_init_noinline,
.tp_flags = Py_TPFLAGS_DEFAULT,
};


/*[clinic input]
depr_star_pos0_len1
* [from 3.14]
Expand Down Expand Up @@ -1749,12 +1809,18 @@ PyInit__testclinic(void)
if (PyModule_AddType(m, &DeprStarInit) < 0) {
goto error;
}
if (PyModule_AddType(m, &DeprStarInitNoInline) < 0) {
goto error;
}
if (PyModule_AddType(m, &DeprKwdNew) < 0) {
goto error;
}
if (PyModule_AddType(m, &DeprKwdInit) < 0) {
goto error;
}
if (PyModule_AddType(m, &DeprKwdInitNoInline) < 0) {
goto error;
}
return m;

error:
Expand Down
145 changes: 144 additions & 1 deletion Modules/clinic/_testclinic_depr.c.h

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

2 changes: 2 additions & 0 deletions Tools/clinic/clinic.py
Original file line number Diff line number Diff line change
Expand Up @@ -1476,6 +1476,8 @@ def parser_body(
goto exit;
}}
""", indent=4)]
if deprecated_positionals or deprecated_keywords:
declarations += "\nPy_ssize_t nargs = PyTuple_GET_SIZE(args);"
if deprecated_keywords:
code = self.deprecate_keyword_use(f, deprecated_keywords, None)
parser_code.append(code)
Expand Down