Skip to content

Commit 8eecd42

Browse files
committed
Don't use helper that processes entire stack
1 parent b1c6768 commit 8eecd42

File tree

5 files changed

+85
-38
lines changed

5 files changed

+85
-38
lines changed

Include/internal/pycore_setobject.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,6 @@ extern void _PySet_ClearInternal(PySetObject *so);
3535

3636
PyAPI_FUNC(int) _PySet_AddTakeRef(PySetObject *so, PyObject *key);
3737

38-
PyAPI_FUNC(PyObject *)
39-
_PySet_FromStackRefSteal(const _PyStackRef *src, Py_ssize_t n);
40-
4138

4239

4340
#ifdef __cplusplus

Objects/setobject.c

Lines changed: 2 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -208,52 +208,22 @@ set_add_entry(PySetObject *so, PyObject *key, Py_hash_t hash)
208208
{
209209
_Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(so);
210210

211-
/* Pre-increment is necessary to prevent arbitrary code in the rich
212-
comparison from deallocating the key just before the insertion. */
213-
Py_INCREF(key);
214-
215-
return set_add_entry_takeref(so, key, hash);
211+
return set_add_entry_takeref(so, Py_NewRef(key), hash);
216212
}
217213

218214
int
219215
_PySet_AddTakeRef(PySetObject *so, PyObject *key)
220216
{
221217
Py_hash_t hash = _PyObject_HashFast(key);
222218
if (hash == -1) {
219+
Py_DECREF(key);
223220
return -1;
224221
}
225222
// We don't pre-increment here, the caller holds a strong
226223
// reference to the object which we are stealing.
227224
return set_add_entry_takeref(so, key, hash);
228225
}
229226

230-
PyObject *
231-
_PySet_FromStackRefSteal(const _PyStackRef *src, Py_ssize_t n)
232-
{
233-
PySetObject *set = (PySetObject *)PySet_New(NULL);
234-
if (n == 0) {
235-
return (PyObject *)set;
236-
}
237-
238-
if (set_table_resize(set, n*2) != 0) {
239-
return NULL;
240-
}
241-
242-
int err = 0;
243-
for (Py_ssize_t i = 0; i < n; i++) {
244-
if (err == 0) {
245-
err = _PySet_AddTakeRef(set, PyStackRef_AsPyObjectSteal(src[i]));
246-
} else {
247-
PyStackRef_CLOSE(src[i]);
248-
}
249-
}
250-
if (err) {
251-
Py_CLEAR(set);
252-
}
253-
254-
return (PyObject *)set;
255-
}
256-
257227
/*
258228
Internal routine used by set_table_resize() to insert an item which is
259229
known to be absent from the set. Besides the performance benefit,

Python/bytecodes.c

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1898,10 +1898,28 @@ dummy_func(
18981898
}
18991899

19001900
inst(BUILD_SET, (values[oparg] -- set)) {
1901-
PyObject *set_o = _PySet_FromStackRefSteal(values, oparg);
1901+
PySetObject *set_o = (PySetObject *)PySet_New(NULL);
19021902
if (set_o == NULL) {
1903+
DECREF_INPUTS();
19031904
ERROR_IF(true, error);
19041905
}
1906+
1907+
int err = 0;
1908+
for (Py_ssize_t i = 0; i < oparg; i++) {
1909+
_PyStackRef value = values[i];
1910+
values[i] = PyStackRef_NULL;
1911+
if (err == 0) {
1912+
err = _PySet_AddTakeRef(set_o, PyStackRef_AsPyObjectSteal(value));
1913+
}
1914+
else {
1915+
PyStackRef_CLOSE(value);
1916+
}
1917+
}
1918+
if (err) {
1919+
Py_DECREF(set_o);
1920+
ERROR_IF(true, error);
1921+
}
1922+
19051923
INPUTS_DEAD();
19061924
set = PyStackRef_FromPyObjectSteal(set_o);
19071925
}

Python/executor_cases.c.h

Lines changed: 32 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Python/generated_cases.c.h

Lines changed: 32 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)