Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 408c3b2

Browse files
WIP
1 parent 4c7ca15 commit 408c3b2

5 files changed

Lines changed: 31 additions & 21 deletions

File tree

Modules/_io/bufferedio.c

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -368,6 +368,15 @@ _enter_buffered_busy(buffered *self)
368368
(self->buffer_size * (size / self->buffer_size)))
369369

370370

371+
static int
372+
buffered_clear(buffered *self)
373+
{
374+
self->ok = 0;
375+
Py_CLEAR(self->raw);
376+
Py_CLEAR(self->dict);
377+
return 0;
378+
}
379+
371380
static void
372381
buffered_dealloc(buffered *self)
373382
{
@@ -379,7 +388,6 @@ buffered_dealloc(buffered *self)
379388
self->ok = 0;
380389
if (self->weakreflist != NULL)
381390
PyObject_ClearWeakRefs((PyObject *)self);
382-
Py_CLEAR(self->raw);
383391
if (self->buffer) {
384392
PyMem_Free(self->buffer);
385393
self->buffer = NULL;
@@ -388,7 +396,7 @@ buffered_dealloc(buffered *self)
388396
PyThread_free_lock(self->lock);
389397
self->lock = NULL;
390398
}
391-
Py_CLEAR(self->dict);
399+
(void)buffered_clear(self);
392400
tp->tp_free((PyObject *)self);
393401
Py_DECREF(tp);
394402
}
@@ -412,15 +420,6 @@ buffered_traverse(buffered *self, visitproc visit, void *arg)
412420
return 0;
413421
}
414422

415-
static int
416-
buffered_clear(buffered *self)
417-
{
418-
self->ok = 0;
419-
Py_CLEAR(self->raw);
420-
Py_CLEAR(self->dict);
421-
return 0;
422-
}
423-
424423
/* Because this can call arbitrary code, it shouldn't be called when
425424
the refcount is 0 (that is, not directly from tp_dealloc unless
426425
the refcount has been temporarily re-incremented). */
@@ -2128,6 +2127,8 @@ bufferedrwpair_traverse(rwpair *self, visitproc visit, void *arg)
21282127
{
21292128
Py_VISIT(Py_TYPE(self));
21302129
Py_VISIT(self->dict);
2130+
Py_VISIT(self->reader);
2131+
Py_VISIT(self->writer);
21312132
return 0;
21322133
}
21332134

@@ -2147,9 +2148,7 @@ bufferedrwpair_dealloc(rwpair *self)
21472148
_PyObject_GC_UNTRACK(self);
21482149
if (self->weakreflist != NULL)
21492150
PyObject_ClearWeakRefs((PyObject *)self);
2150-
Py_CLEAR(self->reader);
2151-
Py_CLEAR(self->writer);
2152-
Py_CLEAR(self->dict);
2151+
(void)bufferedrwpair_clear(self);
21532152
tp->tp_free((PyObject *) self);
21542153
Py_DECREF(tp);
21552154
}

Modules/_io/bytesio.c

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1090,6 +1090,13 @@ bytesiobuf_releasebuffer(bytesiobuf *obj, Py_buffer *view)
10901090
b->exports--;
10911091
}
10921092

1093+
static int
1094+
bytesiobuf_clear(bytesiobuf *self)
1095+
{
1096+
Py_CLEAR(self->source);
1097+
return 0;
1098+
}
1099+
10931100
static int
10941101
bytesiobuf_traverse(bytesiobuf *self, visitproc visit, void *arg)
10951102
{
@@ -1104,14 +1111,15 @@ bytesiobuf_dealloc(bytesiobuf *self)
11041111
PyTypeObject *tp = Py_TYPE(self);
11051112
/* bpo-31095: UnTrack is needed before calling any callbacks */
11061113
PyObject_GC_UnTrack(self);
1107-
Py_CLEAR(self->source);
1114+
(void)bytesiobuf_clear(self);
11081115
tp->tp_free(self);
11091116
Py_DECREF(tp);
11101117
}
11111118

11121119
static PyType_Slot bytesiobuf_slots[] = {
11131120
{Py_tp_dealloc, bytesiobuf_dealloc},
11141121
{Py_tp_traverse, bytesiobuf_traverse},
1122+
{Py_tp_clear, bytesiobuf_clear},
11151123

11161124
// Buffer protocol
11171125
{Py_bf_getbuffer, bytesiobuf_getbuffer},

Modules/_io/fileio.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -536,7 +536,7 @@ fileio_dealloc(fileio *self)
536536
_PyObject_GC_UNTRACK(self);
537537
if (self->weakreflist != NULL)
538538
PyObject_ClearWeakRefs((PyObject *) self);
539-
Py_CLEAR(self->dict);
539+
(void)fileio_clear(self);
540540
tp->tp_free((PyObject *)self);
541541
Py_DECREF(tp);
542542
}

Modules/_io/stringio.c

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -583,13 +583,19 @@ static int
583583
stringio_traverse(stringio *self, visitproc visit, void *arg)
584584
{
585585
Py_VISIT(Py_TYPE(self));
586+
Py_VISIT(self->readnl);
587+
Py_VISIT(self->writenl);
588+
Py_VISIT(self->decoder);
586589
Py_VISIT(self->dict);
587590
return 0;
588591
}
589592

590593
static int
591594
stringio_clear(stringio *self)
592595
{
596+
Py_CLEAR(self->readnl);
597+
Py_CLEAR(self->writenl);
598+
Py_CLEAR(self->decoder);
593599
Py_CLEAR(self->dict);
594600
return 0;
595601
}
@@ -605,10 +611,7 @@ stringio_dealloc(stringio *self)
605611
self->buf = NULL;
606612
}
607613
_PyUnicodeWriter_Dealloc(&self->writer);
608-
Py_CLEAR(self->readnl);
609-
Py_CLEAR(self->writenl);
610-
Py_CLEAR(self->decoder);
611-
Py_CLEAR(self->dict);
614+
(void)stringio_clear(self);
612615
if (self->weakreflist != NULL) {
613616
PyObject_ClearWeakRefs((PyObject *) self);
614617
}

Modules/_io/textio.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1403,7 +1403,7 @@ textiowrapper_dealloc(textio *self)
14031403
_PyObject_GC_UNTRACK(self);
14041404
if (self->weakreflist != NULL)
14051405
PyObject_ClearWeakRefs((PyObject *)self);
1406-
textiowrapper_clear(self);
1406+
(void)textiowrapper_clear(self);
14071407
tp->tp_free((PyObject *)self);
14081408
Py_DECREF(tp);
14091409
}

0 commit comments

Comments
 (0)