Skip to content

Commit 04f0f66

Browse files
Implement for all
1 parent be72b3f commit 04f0f66

File tree

1 file changed

+30
-6
lines changed

1 file changed

+30
-6
lines changed

Objects/tupleobject.c

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -383,12 +383,18 @@ _PyTuple_FromArray(PyObject *const *src, Py_ssize_t n)
383383
if (tuple == NULL) {
384384
return NULL;
385385
}
386+
bool track = false;
386387
PyObject **dst = tuple->ob_item;
387388
for (Py_ssize_t i = 0; i < n; i++) {
388389
PyObject *item = src[i];
389390
dst[i] = Py_NewRef(item);
391+
if (!track && _PyObject_GC_MAY_BE_TRACKED(dst[i])) {
392+
track = true;
393+
}
394+
}
395+
if (track) {
396+
_PyObject_GC_TRACK(tuple);
390397
}
391-
_PyObject_GC_TRACK(tuple);
392398
return (PyObject *)tuple;
393399
}
394400

@@ -402,11 +408,17 @@ _PyTuple_FromStackRefStealOnSuccess(const _PyStackRef *src, Py_ssize_t n)
402408
if (tuple == NULL) {
403409
return NULL;
404410
}
411+
bool track = false;
405412
PyObject **dst = tuple->ob_item;
406413
for (Py_ssize_t i = 0; i < n; i++) {
407414
dst[i] = PyStackRef_AsPyObjectSteal(src[i]);
415+
if (!track && _PyObject_GC_MAY_BE_TRACKED(dst[i])) {
416+
track = true;
417+
}
418+
}
419+
if (track) {
420+
_PyObject_GC_TRACK(tuple);
408421
}
409-
_PyObject_GC_TRACK(tuple);
410422
return (PyObject *)tuple;
411423
}
412424

@@ -423,12 +435,18 @@ _PyTuple_FromArraySteal(PyObject *const *src, Py_ssize_t n)
423435
}
424436
return NULL;
425437
}
438+
bool track = false;
426439
PyObject **dst = tuple->ob_item;
427440
for (Py_ssize_t i = 0; i < n; i++) {
428441
PyObject *item = src[i];
429442
dst[i] = item;
443+
if (!track && _PyObject_GC_MAY_BE_TRACKED(item)) {
444+
track = true;
445+
}
446+
}
447+
if (track) {
448+
_PyObject_GC_TRACK(tuple);
430449
}
431-
_PyObject_GC_TRACK(tuple);
432450
return (PyObject *)tuple;
433451
}
434452

@@ -501,7 +519,9 @@ tuple_concat(PyObject *aa, PyObject *bb)
501519
dest[i] = Py_NewRef(v);
502520
}
503521

504-
_PyObject_GC_TRACK(np);
522+
if (_PyObject_GC_IS_TRACKED(a) || _PyObject_GC_IS_TRACKED(b)) {
523+
_PyObject_GC_TRACK(np);
524+
}
505525
return (PyObject *)np;
506526
}
507527

@@ -550,7 +570,9 @@ tuple_repeat(PyObject *self, Py_ssize_t n)
550570
_Py_memory_repeat((char *)np->ob_item, sizeof(PyObject *)*output_size,
551571
sizeof(PyObject *)*input_size);
552572
}
553-
_PyObject_GC_TRACK(np);
573+
if (_PyObject_GC_IS_TRACKED(a)) {
574+
_PyObject_GC_TRACK(np);
575+
}
554576
return (PyObject *) np;
555577
}
556578

@@ -828,7 +850,9 @@ tuple_subscript(PyObject *op, PyObject* item)
828850
dest[i] = it;
829851
}
830852

831-
_PyObject_GC_TRACK(result);
853+
if (_PyObject_GC_IS_TRACKED(self)) {
854+
_PyObject_GC_TRACK(result);
855+
}
832856
return (PyObject *)result;
833857
}
834858
}

0 commit comments

Comments
 (0)