@@ -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