@@ -1145,42 +1145,49 @@ _Pickler_Write(PicklerObject *self, const char *s, Py_ssize_t data_len)
1145
1145
static PicklerObject *
1146
1146
_Pickler_New (PickleState * st )
1147
1147
{
1148
- PicklerObject * self ;
1149
-
1150
- self = PyObject_GC_New (PicklerObject , st -> Pickler_Type );
1151
- if (self == NULL )
1148
+ PyMemoTable * memo = PyMemoTable_New ();
1149
+ if (memo == NULL ) {
1152
1150
return NULL ;
1151
+ }
1152
+
1153
+ const Py_ssize_t max_output_len = WRITE_BUF_SIZE ;
1154
+ PyObject * output_buffer = PyBytes_FromStringAndSize (NULL , max_output_len );
1155
+ if (output_buffer == NULL ) {
1156
+ goto error ;
1157
+ }
1153
1158
1159
+ PicklerObject * self = PyObject_GC_New (PicklerObject , st -> Pickler_Type );
1160
+ if (self == NULL ) {
1161
+ goto error ;
1162
+ }
1163
+
1164
+ self -> memo = memo ;
1154
1165
self -> pers_func = NULL ;
1166
+ self -> pers_func_self = NULL ;
1155
1167
self -> dispatch_table = NULL ;
1156
- self -> buffer_callback = NULL ;
1168
+ self -> reducer_override = NULL ;
1157
1169
self -> write = NULL ;
1170
+ self -> output_buffer = output_buffer ;
1171
+ self -> output_len = 0 ;
1172
+ self -> max_output_len = max_output_len ;
1158
1173
self -> proto = 0 ;
1159
1174
self -> bin = 0 ;
1160
1175
self -> framing = 0 ;
1161
1176
self -> frame_start = -1 ;
1177
+ self -> buf_size = 0 ;
1162
1178
self -> fast = 0 ;
1163
1179
self -> fast_nesting = 0 ;
1164
1180
self -> fix_imports = 0 ;
1165
1181
self -> fast_memo = NULL ;
1166
- self -> max_output_len = WRITE_BUF_SIZE ;
1167
- self -> output_len = 0 ;
1168
- self -> reducer_override = NULL ;
1169
-
1170
- self -> memo = PyMemoTable_New ();
1171
- if (self -> memo == NULL ) {
1172
- Py_DECREF (self );
1173
- return NULL ;
1174
- }
1175
- self -> output_buffer = PyBytes_FromStringAndSize (NULL ,
1176
- self -> max_output_len );
1177
- if (self -> output_buffer == NULL ) {
1178
- Py_DECREF (self );
1179
- return NULL ;
1180
- }
1182
+ self -> buffer_callback = NULL ;
1181
1183
1182
1184
PyObject_GC_Track (self );
1183
1185
return self ;
1186
+
1187
+ error :
1188
+ PyMem_Free (memo );
1189
+ Py_XDECREF (output_buffer );
1190
+ return NULL ;
1184
1191
}
1185
1192
1186
1193
static int
@@ -1628,14 +1635,31 @@ _Unpickler_MemoCleanup(UnpicklerObject *self)
1628
1635
static UnpicklerObject *
1629
1636
_Unpickler_New (PyObject * module )
1630
1637
{
1631
- UnpicklerObject * self ;
1638
+ const int MEMO_SIZE = 32 ;
1639
+ PyObject * * memo = _Unpickler_NewMemo (MEMO_SIZE );
1640
+ if (memo == NULL ) {
1641
+ return NULL ;
1642
+ }
1643
+
1632
1644
PickleState * st = _Pickle_GetState (module );
1645
+ PyObject * stack = Pdata_New (st );
1646
+ if (stack == NULL ) {
1647
+ goto error ;
1648
+ }
1633
1649
1634
- self = PyObject_GC_New (UnpicklerObject , st -> Unpickler_Type );
1635
- if (self == NULL )
1636
- return NULL ;
1650
+ UnpicklerObject * self = PyObject_GC_New (UnpicklerObject ,
1651
+ st -> Unpickler_Type );
1652
+ if (self == NULL ) {
1653
+ goto error ;
1654
+ }
1637
1655
1656
+ self -> stack = (Pdata * )stack ;
1657
+ self -> memo = memo ;
1658
+ self -> memo_size = MEMO_SIZE ;
1659
+ self -> memo_len = 0 ;
1638
1660
self -> pers_func = NULL ;
1661
+ self -> pers_func_self = NULL ;
1662
+ memset (& self -> buffer , 0 , sizeof (Py_buffer ));
1639
1663
self -> input_buffer = NULL ;
1640
1664
self -> input_line = NULL ;
1641
1665
self -> input_len = 0 ;
@@ -1653,22 +1677,14 @@ _Unpickler_New(PyObject *module)
1653
1677
self -> marks_size = 0 ;
1654
1678
self -> proto = 0 ;
1655
1679
self -> fix_imports = 0 ;
1656
- memset (& self -> buffer , 0 , sizeof (Py_buffer ));
1657
- self -> memo_size = 32 ;
1658
- self -> memo_len = 0 ;
1659
- self -> memo = _Unpickler_NewMemo (self -> memo_size );
1660
- if (self -> memo == NULL ) {
1661
- Py_DECREF (self );
1662
- return NULL ;
1663
- }
1664
- self -> stack = (Pdata * )Pdata_New (st );
1665
- if (self -> stack == NULL ) {
1666
- Py_DECREF (self );
1667
- return NULL ;
1668
- }
1669
1680
1670
1681
PyObject_GC_Track (self );
1671
1682
return self ;
1683
+
1684
+ error :
1685
+ PyMem_Free (memo );
1686
+ Py_XDECREF (stack );
1687
+ return NULL ;
1672
1688
}
1673
1689
1674
1690
/* Returns -1 (with an exception set) on failure, 0 on success. This may
0 commit comments