Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
a3292c2
Do not track frozenset objects with immutables
eendebakpt Oct 16, 2025
cd294a6
cleanup
eendebakpt Oct 16, 2025
7e28cf2
cleanup
eendebakpt Oct 16, 2025
30057a5
Merge branch 'main' into frozenset_immutable_tracking
eendebakpt Oct 16, 2025
c4deb03
fix test
eendebakpt Oct 16, 2025
607237a
📜🤖 Added by blurb_it.
blurb-it[bot] Oct 16, 2025
2735a71
Update Objects/setobject.c
eendebakpt Oct 17, 2025
c05db54
make sure PySet_Add tracks frozensets if needed
eendebakpt Oct 24, 2025
7f6bc4b
Merge branch 'frozenset_immutable_tracking' of github.com:eendebakpt/…
eendebakpt Oct 24, 2025
0b97604
review comment
eendebakpt Oct 24, 2025
948daed
Merge branch 'main' into frozenset_immutable_tracking
eendebakpt Oct 24, 2025
08e22c3
use _testcapi for testing
eendebakpt Oct 26, 2025
62afc76
whitespace
eendebakpt Oct 26, 2025
eab653e
Merge branch 'main' into frozenset_immutable_tracking
eendebakpt Oct 26, 2025
37fc61d
Apply suggestions from code review
eendebakpt Oct 26, 2025
4f8bda7
review comment
eendebakpt Oct 26, 2025
e9d42b4
Merge branch 'frozenset_immutable_tracking' of github.com:eendebakpt/…
eendebakpt Oct 26, 2025
4b39149
Apply suggestions from code review
eendebakpt Oct 28, 2025
2859802
review comments
eendebakpt Oct 28, 2025
08f43c5
review comments
eendebakpt Oct 28, 2025
d12102c
Merge branch 'main' into frozenset_immutable_tracking
eendebakpt Jan 18, 2026
5f8b1f2
Update Objects/setobject.c
eendebakpt Jan 18, 2026
ae5cc7f
review comments
eendebakpt Jan 23, 2026
786019d
Update Lib/test/test_set.py
eendebakpt Jan 23, 2026
f37f46e
Update Modules/_testcapimodule.c
eendebakpt Jan 23, 2026
afd8a5b
Merge branch 'main' into frozenset_immutable_tracking
eendebakpt Jan 23, 2026
377e6d8
Apply suggestions from code review
eendebakpt Jan 23, 2026
c62fa9a
revert to fastcall
eendebakpt Jan 24, 2026
69b728f
Merge branch 'frozenset_immutable_tracking' of github.com:eendebakpt/…
eendebakpt Jan 24, 2026
71d9eba
fix header
eendebakpt Jan 25, 2026
5c19de2
Fully write test in C
eendebakpt Jan 25, 2026
e7dd248
adjust tests
eendebakpt Jan 26, 2026
075b582
cleanup tests
eendebakpt Jan 26, 2026
3dd4c95
cleanup tests
eendebakpt Jan 26, 2026
8d864ef
rework
eendebakpt Jan 26, 2026
e262963
refactor code
eendebakpt Jan 26, 2026
6027391
cleanup
eendebakpt Jan 26, 2026
6269f68
Merge branch 'main' into frozenset_immutable_tracking
eendebakpt Jan 26, 2026
37af64f
Update Modules/_testlimitedcapi/set.c
eendebakpt Jan 27, 2026
ea3ba39
Merge branch 'main' into frozenset_immutable_tracking
eendebakpt Jan 27, 2026
ff61155
Update Modules/_testlimitedcapi/set.c
eendebakpt Jan 27, 2026
6bb0d58
Apply suggestions from code review
eendebakpt Jan 27, 2026
7a4859b
Update Objects/setobject.c
vstinner Jan 27, 2026
a2bcfdb
review comment
eendebakpt Jan 27, 2026
88c3f4a
whitespace
eendebakpt Jan 27, 2026
be20046
Merge branch 'main' into frozenset_immutable_tracking
eendebakpt Jan 27, 2026
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
rework
  • Loading branch information
eendebakpt committed Jan 26, 2026
commit 8d864ef70b8c8c052028e2ee20fda583b297d40d
6 changes: 6 additions & 0 deletions Lib/test/test_capi/test_set.py
Original file line number Diff line number Diff line change
Expand Up @@ -166,6 +166,12 @@ def test_add(self):
# CRASHES: add(instance, NULL)
# CRASHES: add(NULL, NULL)

def test_add_frozenset(self):
add = _testlimitedcapi.set_add
frozen_set = frozenset()
# test adding an element to a non-uniquely referenced frozenset throws an exception
self.assertRaises(SystemError, add, frozen_set, 1)

def test_discard(self):
discard = _testlimitedcapi.set_discard
for cls in (set, set_subclass):
Expand Down
96 changes: 1 addition & 95 deletions Modules/_testlimitedcapi/set.c
Original file line number Diff line number Diff line change
Expand Up @@ -130,62 +130,6 @@ raiseTestError(const char* test_name, const char* msg)
return NULL;
}

static PyObject *
test_pyset_add_exact_set(PyObject *self, PyObject *Py_UNUSED(ignored))
{
// Test: Adding to a regular set
PyObject *set = PySet_New(NULL);
if (set == NULL) {
return NULL;
}
PyObject *one = PyLong_FromLong(1);
assert(one);

if (PySet_Add(set, one) < 0) {
Py_DECREF(set);
return raiseTestError("test_pyset_add_exact_set",
"PySet_Add to empty set failed");
}
if (PySet_Size(set) != 1) {
Py_DECREF(set);
return raiseTestError("test_pyset_add_exact_set",
"set size should be 1 after adding one element");
}
if (PySet_Contains(set, one) != 1) {
Py_DECREF(set);
return raiseTestError("test_pyset_add_exact_set",
"set should contain the added element");
}
Py_DECREF(set);

// Test: Adding unhashable item should raise TypeError
set = PySet_New(NULL);
if (set == NULL) {
return NULL;
}
PyObject *unhashable = PyList_New(0);
if (unhashable == NULL) {
Py_DECREF(set);
return NULL;
}
if (PySet_Add(set, unhashable) != -1) {
Py_DECREF(unhashable);
Py_DECREF(set);
return raiseTestError("test_pyset_add_exact_set",
"PySet_Add with unhashable should fail");
}
if (!PyErr_ExceptionMatches(PyExc_TypeError)) {
Py_DECREF(unhashable);
Py_DECREF(set);
return raiseTestError("test_pyset_add_exact_set",
"PySet_Add with unhashable should raise TypeError");
}
PyErr_Clear();
Py_DECREF(unhashable);
Py_DECREF(set);

Py_RETURN_NONE;
}

static PyObject *
test_frozenset_add_in_capi(PyObject *self, PyObject *Py_UNUSED(obj))
Expand Down Expand Up @@ -223,48 +167,11 @@ test_frozenset_add_in_capi(PyObject *self, PyObject *Py_UNUSED(obj))
}

static PyObject *
test_pyset_add_frozenset(PyObject *self, PyObject *Py_UNUSED(ignored))
test_frozenset_add_in_capi_tracking(PyObject *self, PyObject *Py_UNUSED(ignored))
{
PyObject *one = PyLong_FromLong(1);
assert(one);

// Test: Adding to uniquely-referenced frozenset should succeed
PyObject *frozenset = PyFrozenSet_New(NULL);
if (frozenset == NULL) {
return NULL;
}

// frozenset is uniquely referenced here, so PySet_Add should work
if (PySet_Add(frozenset, one) < 0) {
Py_DECREF(frozenset);
return raiseTestError("test_pyset_add_frozenset",
"PySet_Add to uniquely-referenced frozenset failed");
}
Py_DECREF(frozenset);

// Test: Adding to non-uniquely-referenced frozenset should raise SystemError
frozenset = PyFrozenSet_New(NULL);
if (frozenset == NULL) {
return NULL;
}
Py_INCREF(frozenset); // Make it non-uniquely referenced

if (PySet_Add(frozenset, one) != -1) {
Py_DECREF(frozenset);
Py_DECREF(frozenset);
return raiseTestError("test_pyset_add_frozenset",
"PySet_Add to non-uniquely-referenced frozenset should fail");
}
if (!PyErr_ExceptionMatches(PyExc_SystemError)) {
Py_DECREF(frozenset);
Py_DECREF(frozenset);
return raiseTestError("test_pyset_add_frozenset",
"PySet_Add to non-uniquely-referenced frozenset should raise SystemError");
}
PyErr_Clear();
Py_DECREF(frozenset);
Py_DECREF(frozenset);

// Test: GC tracking - frozenset with only immutable items should not be tracked
frozenset = PyFrozenSet_New(NULL);
if (frozenset == NULL) {
Expand Down Expand Up @@ -379,7 +286,6 @@ static PyMethodDef test_methods[] = {
{"test_frozenset_add_in_capi", test_frozenset_add_in_capi, METH_NOARGS},
{"test_set_contains_does_not_convert_unhashable_key",
test_set_contains_does_not_convert_unhashable_key, METH_NOARGS},
{"test_pyset_add_exact_set", test_pyset_add_exact_set, METH_NOARGS},
{"test_pyset_add_frozenset", test_pyset_add_frozenset, METH_NOARGS},

{NULL},
Expand Down