@@ -1116,42 +1116,49 @@ _Pickler_Write(PicklerObject *self, const char *s, Py_ssize_t data_len)
11161116static PicklerObject *
11171117_Pickler_New(void)
11181118{
1119- PicklerObject *self;
1120-
1121- self = PyObject_GC_New(PicklerObject, &Pickler_Type);
1122- if (self == NULL)
1119+ PyMemoTable *memo = PyMemoTable_New();
1120+ if (memo == NULL) {
11231121 return NULL;
1122+ }
1123+
1124+ const Py_ssize_t max_output_len = WRITE_BUF_SIZE;
1125+ PyObject *output_buffer = PyBytes_FromStringAndSize(NULL, max_output_len);
1126+ if (output_buffer == NULL) {
1127+ goto error;
1128+ }
11241129
1130+ PicklerObject *self = PyObject_GC_New(PicklerObject, &Pickler_Type);
1131+ if (self == NULL) {
1132+ goto error;
1133+ }
1134+
1135+ self->memo = memo;
11251136 self->pers_func = NULL;
1137+ self->pers_func_self = NULL;
11261138 self->dispatch_table = NULL;
1127- self->buffer_callback = NULL;
1139+ self->reducer_override = NULL;
11281140 self->write = NULL;
1141+ self->output_buffer = output_buffer;
1142+ self->output_len = 0;
1143+ self->max_output_len = max_output_len;
11291144 self->proto = 0;
11301145 self->bin = 0;
11311146 self->framing = 0;
11321147 self->frame_start = -1;
1148+ self->buf_size = 0;
11331149 self->fast = 0;
11341150 self->fast_nesting = 0;
11351151 self->fix_imports = 0;
11361152 self->fast_memo = NULL;
1137- self->max_output_len = WRITE_BUF_SIZE;
1138- self->output_len = 0;
1139- self->reducer_override = NULL;
1140-
1141- self->memo = PyMemoTable_New();
1142- if (self->memo == NULL) {
1143- Py_DECREF(self);
1144- return NULL;
1145- }
1146- self->output_buffer = PyBytes_FromStringAndSize(NULL,
1147- self->max_output_len);
1148- if (self->output_buffer == NULL) {
1149- Py_DECREF(self);
1150- return NULL;
1151- }
1153+ self->buffer_callback = NULL;
11521154
11531155 PyObject_GC_Track(self);
11541156 return self;
1157+
1158+ error:
1159+ PyMem_Free(memo);
1160+ Py_XDECREF(output_buffer);
1161+ return NULL;
11551162}
11561163
11571164static int
@@ -1602,13 +1609,29 @@ _Unpickler_MemoCleanup(UnpicklerObject *self)
16021609static UnpicklerObject *
16031610_Unpickler_New(void)
16041611{
1605- UnpicklerObject *self;
1606-
1607- self = PyObject_GC_New(UnpicklerObject, &Unpickler_Type);
1608- if (self == NULL)
1612+ const int MEMO_SIZE = 32;
1613+ PyObject **memo = _Unpickler_NewMemo(MEMO_SIZE);
1614+ if (memo == NULL) {
16091615 return NULL;
1616+ }
1617+
1618+ PyObject *stack = Pdata_New();
1619+ if (stack == NULL) {
1620+ goto error;
1621+ }
16101622
1623+ UnpicklerObject *self = PyObject_GC_New(UnpicklerObject, &Unpickler_Type);
1624+ if (self == NULL) {
1625+ goto error;
1626+ }
1627+
1628+ self->stack = (Pdata *)stack;
1629+ self->memo = memo;
1630+ self->memo_size = MEMO_SIZE;
1631+ self->memo_len = 0;
16111632 self->pers_func = NULL;
1633+ self->pers_func_self = NULL;
1634+ memset(&self->buffer, 0, sizeof(Py_buffer));
16121635 self->input_buffer = NULL;
16131636 self->input_line = NULL;
16141637 self->input_len = 0;
@@ -1626,22 +1649,14 @@ _Unpickler_New(void)
16261649 self->marks_size = 0;
16271650 self->proto = 0;
16281651 self->fix_imports = 0;
1629- memset(&self->buffer, 0, sizeof(Py_buffer));
1630- self->memo_size = 32;
1631- self->memo_len = 0;
1632- self->memo = _Unpickler_NewMemo(self->memo_size);
1633- if (self->memo == NULL) {
1634- Py_DECREF(self);
1635- return NULL;
1636- }
1637- self->stack = (Pdata *)Pdata_New();
1638- if (self->stack == NULL) {
1639- Py_DECREF(self);
1640- return NULL;
1641- }
16421652
16431653 PyObject_GC_Track(self);
16441654 return self;
1655+
1656+ error:
1657+ PyMem_Free(memo);
1658+ Py_XDECREF(stack);
1659+ return NULL;
16451660}
16461661
16471662/* Returns -1 (with an exception set) on failure, 0 on success. This may
0 commit comments