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-111495: Add tests for PyList C API #111562

Merged
merged 33 commits into from
Nov 8, 2023
Merged

Conversation

rawwar
Copy link
Contributor

@rawwar rawwar commented Oct 31, 2023

Adding tests for PyList C API - Issue #111495

@bedevere-app bedevere-app bot mentioned this pull request Oct 31, 2023
10 tasks
Lib/test/test_capi/test_list.py Show resolved Hide resolved
Lib/test/test_capi/test_list.py Show resolved Hide resolved
Lib/test/test_capi/test_list.py Outdated Show resolved Hide resolved
Modules/_testcapi/list.c Outdated Show resolved Hide resolved
Modules/_testcapi/list.c Outdated Show resolved Hide resolved
Lib/test/test_capi/test_list.py Show resolved Hide resolved
@rawwar
Copy link
Contributor Author

rawwar commented Nov 1, 2023

@serhiy-storchaka , Is adding {NULL}, to test_methods[] necessary? yesterday, i was able to run make without any issues. Today, after taking the pull from main, its been failing. below are the details

static PyMethodDef test_methods[] = {
    {"list_check", list_check, METH_O},
    {"list_check_exact", list_check_exact, METH_O},
    {"list_new", list_new, METH_O},
    {"list_size", list_size, METH_O},
};

Fails with

(base) kalyan@rawwar:~/oss/python-projects/cpython$ make
gcc  -fno-strict-overflow -Wsign-compare -DNDEBUG -g -O3 -Wall    -std=c11 -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden  -I./Include/internal -I./Include/internal/mimalloc  -I. -I./Include    -fPIC -c ./Modules/_testcapi/list.c -o Modules/_testcapi/list.o
gcc -shared      Modules/_testcapimodule.o Modules/_testcapi/vectorcall.o Modules/_testcapi/vectorcall_limited.o Modules/_testcapi/heaptype.o Modules/_testcapi/abstract.o Modules/_testcapi/bytearray.o Modules/_testcapi/bytes.o Modules/_testcapi/unicode.o Modules/_testcapi/dict.o Modules/_testcapi/set.o Modules/_testcapi/list.o Modules/_testcapi/tuple.o Modules/_testcapi/getargs.o Modules/_testcapi/datetime.o Modules/_testcapi/docstring.o Modules/_testcapi/mem.o Modules/_testcapi/watchers.o Modules/_testcapi/long.o Modules/_testcapi/float.o Modules/_testcapi/complex.o Modules/_testcapi/numbers.o Modules/_testcapi/structmember.o Modules/_testcapi/exceptions.o Modules/_testcapi/code.o Modules/_testcapi/buffer.o Modules/_testcapi/pyatomic.o Modules/_testcapi/pyos.o Modules/_testcapi/file.o Modules/_testcapi/codec.o Modules/_testcapi/immortal.o Modules/_testcapi/heaptype_relative.o Modules/_testcapi/gc.o Modules/_testcapi/sys.o   -o Modules/_testcapi.cpython-313-x86_64-linux-gnu.so
[ERROR] Importing extension '_testcapi' failed!
Traceback (most recent call last):
  File "/home/kalyan/oss/python-projects/cpython/./Tools/build/check_extension_modules.py", line 412, in check_module_import
    bootstrap_load(spec)
  File "<frozen importlib._bootstrap>", line 960, in _load
  File "<frozen importlib._bootstrap>", line 915, in _load_unlocked
  File "<frozen importlib._bootstrap>", line 813, in module_from_spec
  File "<frozen importlib._bootstrap_external>", line 1302, in create_module
  File "<frozen importlib._bootstrap>", line 488, in _call_with_frames_removed
ValueError: module functions cannot set METH_CLASS or METH_STATIC
Traceback (most recent call last):
  File "/home/kalyan/oss/python-projects/cpython/./Tools/build/check_extension_modules.py", line 483, in <module>
    main()
  File "/home/kalyan/oss/python-projects/cpython/./Tools/build/check_extension_modules.py", line 474, in main
    checker.check()
  File "/home/kalyan/oss/python-projects/cpython/./Tools/build/check_extension_modules.py", line 171, in check
    self.check_module_import(modinfo)
  File "/home/kalyan/oss/python-projects/cpython/./Tools/build/check_extension_modules.py", line 412, in check_module_import
    bootstrap_load(spec)
  File "<frozen importlib._bootstrap>", line 960, in _load
  File "<frozen importlib._bootstrap>", line 915, in _load_unlocked
  File "<frozen importlib._bootstrap>", line 813, in module_from_spec
  File "<frozen importlib._bootstrap_external>", line 1302, in create_module
  File "<frozen importlib._bootstrap>", line 488, in _call_with_frames_removed
ValueError: module functions cannot set METH_CLASS or METH_STATIC
make: *** [Makefile:1177: checksharedmods] Error 1

But, when I include {NULL} like below, I am able to run make without any issues:

static PyMethodDef test_methods[] = {
    {"list_check", list_check, METH_O},
    {"list_check_exact", list_check_exact, METH_O},
    {"list_new", list_new, METH_O},
    {"list_size", list_size, METH_O},
    {NULL},
};

Signed-off-by: kalyanr <[email protected]>
Signed-off-by: kalyanr <[email protected]>
Copy link
Member

@vstinner vstinner left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh! I wrote a very similar PR yesterday! I have a few more tests.

Copy link
Member

@serhiy-storchaka serhiy-storchaka left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See also #111582. It would be nice if you with @vstinner unite your works.

Lib/test/test_capi/test_list.py Outdated Show resolved Hide resolved
Lib/test/test_capi/test_list.py Outdated Show resolved Hide resolved
Lib/test/test_capi/test_list.py Outdated Show resolved Hide resolved
lst = [1, 2, NULL]
self.assertEqual(getitem(lst, 0), 1)
self.assertRaises(IndexError, getitem, lst, -1)
self.assertRaises(IndexError, getitem, lst, 10)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Add tests for index equal to the size of the list, PY_SSIZE_T_MIN, PY_SSIZE_T_MAX (imported from _testcapi).

All functions that have Py_ssize_t parameter should be tested with the following values: 0, size-1, -1, size, PY_SSIZE_T_MIN, PY_SSIZE_T_MAX.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For methods like slice, they accept multiple Py_ssize_t parameters. Should each of these parameters be tested with the values you mentioned?

Lib/test/test_capi/test_list.py Outdated Show resolved Hide resolved
Lib/test/test_capi/test_list.py Outdated Show resolved Hide resolved
Lib/test/test_capi/test_list.py Outdated Show resolved Hide resolved
Lib/test/test_capi/test_list.py Outdated Show resolved Hide resolved
Modules/_testcapi/list.c Outdated Show resolved Hide resolved
rawwar and others added 5 commits November 1, 2023 15:36
Signed-off-by: kalyanr <[email protected]>
Co-authored-by: Serhiy Storchaka <[email protected]>
@rawwar
Copy link
Contributor Author

rawwar commented Nov 1, 2023

@vstinner , What can we do now? I'm not sure If I should continue working on this PR? Although, I also added tests for Py_LIMITED_API ones as well.
I am also planning on contributing tests for PyTuple. let me know if I can go ahead with that

Signed-off-by: kalyanr <[email protected]>
}
NULLABLE(obj);
NULLABLE(value);
RETURN_INT(PyList_SetSlice(obj, ilow, ihigh, Py_XNewRef(value)));
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Py_XNewRef() is wrong and causes a reference leak.

}
NULLABLE(obj);
NULLABLE(value);
RETURN_INT(PyList_Append(obj, Py_XNewRef(value)));
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Py_XNewRef() is wrong and causes a reference leak.

Modules/_testcapi/list.c Outdated Show resolved Hide resolved
Modules/_testcapi/list.c Outdated Show resolved Hide resolved
Copy link
Member

@serhiy-storchaka serhiy-storchaka left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you @rawwar.

I had too much minor suggestions, so I simply applied them myself.

Now it LGTM.

Comment on lines 116 to 117
self.assertRaises(TypeError, setitem, lst, 1.5, 10)
self.assertRaises(TypeError, setitem, 23, 'a', 5)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It only tests the wrapper, not the C API function.

@vstinner vstinner merged commit a3903c8 into python:main Nov 8, 2023
31 checks passed
@vstinner
Copy link
Member

vstinner commented Nov 8, 2023

I merged your PR @rawwar, thanks for adding tests for the PyList API!

@serhiy-storchaka serhiy-storchaka added the needs backport to 3.12 bug and security fixes label Nov 8, 2023
@miss-islington-app
Copy link

Thanks @rawwar for the PR, and @vstinner for merging it 🌮🎉.. I'm working now to backport this PR to: 3.12.
🐍🍒⛏🤖

miss-islington pushed a commit to miss-islington/cpython that referenced this pull request Nov 8, 2023
(cherry picked from commit a3903c8)

Co-authored-by: Kalyan <[email protected]>
Signed-off-by: kalyanr <[email protected]>
Co-authored-by: Serhiy Storchaka <[email protected]>
Co-authored-by: Victor Stinner <[email protected]>
@bedevere-app
Copy link

bedevere-app bot commented Nov 8, 2023

GH-111861 is a backport of this pull request to the 3.12 branch.

@bedevere-app bedevere-app bot removed the needs backport to 3.12 bug and security fixes label Nov 8, 2023
serhiy-storchaka added a commit that referenced this pull request Nov 8, 2023
(cherry picked from commit a3903c8)

Signed-off-by: kalyanr <[email protected]>
Co-authored-by: Kalyan <[email protected]>
Co-authored-by: Serhiy Storchaka <[email protected]>
Co-authored-by: Victor Stinner <[email protected]>
aisk pushed a commit to aisk/cpython that referenced this pull request Feb 11, 2024
Signed-off-by: kalyanr <[email protected]>
Co-authored-by: Serhiy Storchaka <[email protected]>
Co-authored-by: Victor Stinner <[email protected]>
Glyphack pushed a commit to Glyphack/cpython that referenced this pull request Sep 2, 2024
Signed-off-by: kalyanr <[email protected]>
Co-authored-by: Serhiy Storchaka <[email protected]>
Co-authored-by: Victor Stinner <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants