Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

gh-96002: Add functional test for Argument Clinic #96178

Merged
merged 35 commits into from
Nov 21, 2022
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
f00bb03
Support functional test for Argument Clinic
colorfulappl Aug 22, 2022
a59e304
📜🤖 Added by blurb_it.
blurb-it[bot] Aug 22, 2022
2bd331e
Revert "Support functional test for Argument Clinic"
colorfulappl Aug 23, 2022
fac5b77
Add functional test for Argument Clinic
colorfulappl Aug 23, 2022
962434c
Add testcases written in C
colorfulappl Aug 23, 2022
b93b2ae
Rename _testclinicfunctionality.c to _testclinic.c
colorfulappl Oct 25, 2022
35c5f13
Add _testclinic to stdlib IGNORE list
colorfulappl Oct 25, 2022
86703de
Merge TestClinicFunctionalityC class into TestClinicFunctionality
colorfulappl Oct 25, 2022
e66d60b
Format code in _testclinic.c
colorfulappl Oct 25, 2022
f1fb377
Merge test_clinic_functionality.py into test_clinic.py
colorfulappl Oct 26, 2022
449c8fe
Simplify testcases
colorfulappl Oct 26, 2022
1553574
Merge branch 'main' into test_clinic_functionality
colorfulappl Oct 26, 2022
81fe77b
Add more testcases
colorfulappl Oct 28, 2022
7c269d0
Rename class TestClinicFunctionality to ClinicFunctionalTest
colorfulappl Nov 1, 2022
a3a3455
Fix UB problem
colorfulappl Nov 2, 2022
80ba71a
Fix refleaks
colorfulappl Nov 4, 2022
cf77785
Clean code
colorfulappl Nov 4, 2022
10ce3c7
Add PoC of GH-99233
colorfulappl Nov 8, 2022
2cc6c0a
Add PoC of GH-99240
colorfulappl Nov 8, 2022
6a2d334
Delete test cases which fail this test
colorfulappl Nov 10, 2022
d82ef72
Merge branch 'main' into test_clinic_functionality
colorfulappl Nov 10, 2022
b27b43d
Rerun `make regen-all`
colorfulappl Nov 10, 2022
1cae160
Fix leaking
colorfulappl Nov 13, 2022
fb6d3be
Fix code style
colorfulappl Nov 13, 2022
fd1ed14
Merge branch 'main' into test_clinic_functionality
colorfulappl Nov 13, 2022
e82c88a
Rerun `make regen-all`
colorfulappl Nov 13, 2022
598568c
Fix object leaking and code style
colorfulappl Nov 14, 2022
dd43f24
Change argument release order
colorfulappl Nov 14, 2022
325e35b
Rename macro
colorfulappl Nov 14, 2022
967dda6
Update news
colorfulappl Nov 14, 2022
d568683
Fix object leaking
colorfulappl Nov 14, 2022
ce337e8
Remove unnecessary logic
colorfulappl Nov 15, 2022
3314465
Merge branch 'main' into test_clinic_functionality
colorfulappl Nov 15, 2022
68277c5
Merge branch 'main' into test_clinic_functionality
colorfulappl Nov 15, 2022
da0789f
Merge branch 'main' into test_clinic_functionality
colorfulappl Nov 17, 2022
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
5 changes: 5 additions & 0 deletions Include/internal/pycore_global_strings.h
Original file line number Diff line number Diff line change
Expand Up @@ -425,6 +425,9 @@ struct _Py_global_strings {
STRUCT_FOR_ID(keyfile)
STRUCT_FOR_ID(keys)
STRUCT_FOR_ID(kind)
STRUCT_FOR_ID(kw)
STRUCT_FOR_ID(kw1)
STRUCT_FOR_ID(kw2)
STRUCT_FOR_ID(lambda)
STRUCT_FOR_ID(last)
STRUCT_FOR_ID(last_node)
Expand Down Expand Up @@ -516,6 +519,8 @@ struct _Py_global_strings {
STRUCT_FOR_ID(pid)
STRUCT_FOR_ID(policy)
STRUCT_FOR_ID(pos)
STRUCT_FOR_ID(pos1)
STRUCT_FOR_ID(pos2)
STRUCT_FOR_ID(print_file_and_line)
STRUCT_FOR_ID(priority)
STRUCT_FOR_ID(progress)
Expand Down
35 changes: 35 additions & 0 deletions Include/internal/pycore_runtime_init_generated.h

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

21 changes: 21 additions & 0 deletions Lib/test/test_clinic_functionality.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import unittest
from test.support import import_helper

ac_tester = import_helper.import_module('_testclinicfunctionality')


class TestClinicFunctionality(unittest.TestCase):
def test_gh_32092_oob(self):
res = ac_tester.gh_32092_oob(1, 2, 3, 4, kw1=5, kw2=6)
expect = (1, 2, (3, 4), 5, 6)
self.assertEqual(res, expect)

def test_gh_32092_kw_pass(self):
res = ac_tester.gh_32092_kw_pass(1, 2, 3)
expect = (1, (2, 3), None)
self.assertEqual(res, expect)


class TestClinicFunctionalityC(unittest.TestCase):
locals().update((name, getattr(ac_tester, name))
for name in dir(ac_tester) if name.startswith('test_'))
colorfulappl marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Add functional test (``test_clinic_functionality``) for Argument Clinic.
colorfulappl marked this conversation as resolved.
Show resolved Hide resolved
1 change: 1 addition & 0 deletions Modules/Setup.stdlib.in
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,7 @@
@MODULE__TESTBUFFER_TRUE@_testbuffer _testbuffer.c
@MODULE__TESTINTERNALCAPI_TRUE@_testinternalcapi _testinternalcapi.c
@MODULE__TESTCAPI_TRUE@_testcapi _testcapimodule.c _testcapi/vectorcall.c _testcapi/vectorcall_limited.c _testcapi/heaptype.c _testcapi/unicode.c
@MODULE__TESTCLINICFUNCTIONALITY_TRUE@_testclinicfunctionality _testclinicfunctionality.c

# Some testing modules MUST be built as shared libraries.
*shared*
Expand Down
118 changes: 118 additions & 0 deletions Modules/_testclinicfunctionality.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
#ifndef Py_BUILD_CORE_BUILTIN
# define Py_BUILD_CORE_MODULE 1
#endif

/* Always enable assertions */
#undef NDEBUG

#define PY_SSIZE_T_CLEAN

#include "Python.h"

#include "clinic/_testclinicfunctionality.c.h"

/*[clinic input]
module _testclinicfunctionality
[clinic start generated code]*/
/*[clinic end generated code: output=da39a3ee5e6b4b0d input=19bd80db1aefb188]*/

/*[clinic input]
test_empty_function

[clinic start generated code]*/

static PyObject *
test_empty_function_impl(PyObject *module)
/*[clinic end generated code: output=0f8aeb3ddced55cb input=0dd7048651ad4ae4]*/
{
Py_RETURN_NONE;
};

/*[clinic input]
gh_32092_oob

pos1: object
pos2: object
*varargs: object
kw1: object = None
kw2: object = None

Proof-of-concept of GH-32092 OOB bug.

Array index out-of-bound bug in function
`_PyArg_UnpackKeywordsWithVararg` .

Calling this function by gh_32092_oob(1, 2, 3, 4, kw1=5, kw2=6)
to trigger this bug (crash).
Expected return: (1, 2, (3, 4), 5, 6)

[clinic start generated code]*/

static PyObject *
gh_32092_oob_impl(PyObject *module, PyObject *pos1, PyObject *pos2,
PyObject *varargs, PyObject *kw1, PyObject *kw2)
/*[clinic end generated code: output=ee259c130054653f input=91d8e227acf93b02]*/
{
PyObject *tuple = PyTuple_New(5);
PyTuple_SET_ITEM(tuple, 0, Py_NewRef(pos1));
PyTuple_SET_ITEM(tuple, 1, Py_NewRef(pos2));
PyTuple_SET_ITEM(tuple, 2, Py_NewRef(varargs));
PyTuple_SET_ITEM(tuple, 3, Py_NewRef(kw1));
PyTuple_SET_ITEM(tuple, 4, Py_NewRef(kw2));
return tuple;
}
erlend-aasland marked this conversation as resolved.
Show resolved Hide resolved

/*[clinic input]
gh_32092_kw_pass

pos: object
*args: object
kw: object = None

Proof-of-concept of GH-32092 keyword args passing bug.

The calculation of `noptargs` in AC-generated function
`builtin_kw_pass_poc` is incorrect.

Calling this function by gh_32092_kw_pass(1, 2, 3)
to trigger this bug (crash).
Expected return: (1, (2, 3), None)

[clinic start generated code]*/

static PyObject *
gh_32092_kw_pass_impl(PyObject *module, PyObject *pos, PyObject *args,
PyObject *kw)
/*[clinic end generated code: output=4a2bbe4f7c8604e9 input=5fc48f72f49193b6]*/
{
PyObject *tuple = PyTuple_New(3);
PyTuple_SET_ITEM(tuple, 0, Py_NewRef(pos));
PyTuple_SET_ITEM(tuple, 1, Py_NewRef(args));
PyTuple_SET_ITEM(tuple, 2, Py_NewRef(kw));
return tuple;
}
erlend-aasland marked this conversation as resolved.
Show resolved Hide resolved

static PyMethodDef tester_methods[] = {
TEST_EMPTY_FUNCTION_METHODDEF
GH_32092_OOB_METHODDEF
GH_32092_KW_PASS_METHODDEF
{NULL, NULL}
};

static struct PyModuleDef _testclinicfunctionality_module = {
PyModuleDef_HEAD_INIT,
"_testclinicfunctionality",
NULL,
0,
tester_methods,
NULL,
NULL,
NULL,
NULL
colorfulappl marked this conversation as resolved.
Show resolved Hide resolved
};

PyMODINIT_FUNC
PyInit__testclinicfunctionality(void)
{
return PyModule_Create(&_testclinicfunctionality_module);
}
Loading