Skip to content

Commit 8301cfd

Browse files
committed
Don't use helper that processes entire stack
1 parent 0c29a40 commit 8301cfd

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
@@ -1910,10 +1910,28 @@ dummy_func(
19101910
}
19111911

19121912
inst(BUILD_SET, (values[oparg] -- set)) {
1913-
PyObject *set_o = _PySet_FromStackRefSteal(values, oparg);
1913+
PyObject *set_o = PySet_New(NULL);
19141914
if (set_o == NULL) {
1915+
DECREF_INPUTS();
19151916
ERROR_IF(true, error);
19161917
}
1918+
1919+
int err = 0;
1920+
for (Py_ssize_t i = 0; i < oparg; i++) {
1921+
_PyStackRef value = values[i];
1922+
values[i] = PyStackRef_NULL;
1923+
if (err == 0) {
1924+
err = _PySet_AddTakeRef((PySetObject *)set_o, PyStackRef_AsPyObjectSteal(value));
1925+
}
1926+
else {
1927+
PyStackRef_CLOSE(value);
1928+
}
1929+
}
1930+
if (err) {
1931+
Py_DECREF(set_o);
1932+
ERROR_IF(true, error);
1933+
}
1934+
19171935
INPUTS_DEAD();
19181936
set = PyStackRef_FromPyObjectStealMortal(set_o);
19191937
}

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)