@@ -46,12 +46,21 @@ _zstd_ZstdDict_new_impl(PyTypeObject *type, Py_buffer *dict_content,
4646                        int  is_raw )
4747/*[clinic end generated code: output=685b7406a48b0949 input=9e8c493e31c98383]*/ 
4848{
49+     /* All dictionaries must be at least 8 bytes */ 
50+     if  (dict_content -> len  <  8 ) {
51+         PyErr_SetString (PyExc_ValueError ,
52+                         "Zstandard dictionary content should at least " 
53+                         "8 bytes." );
54+         goto error ;
55+     }
56+ 
4957    ZstdDict *  self  =  PyObject_GC_New (ZstdDict , type );
5058    if  (self  ==  NULL ) {
5159        return  NULL ;
5260    }
5361
5462    self -> d_dict  =  NULL ;
63+     self -> dict_buffer  =  NULL ;
5564    self -> dict_id  =  0 ;
5665    self -> lock  =  (PyMutex ){0 };
5766
@@ -61,36 +70,20 @@ _zstd_ZstdDict_new_impl(PyTypeObject *type, Py_buffer *dict_content,
6170        goto error ;
6271    }
6372
64-     /* Check dict_content's type */ 
65-     if  (dict_content  ==  NULL ) {
66-         PyErr_SetString (PyExc_TypeError ,
67-                         "dict_content argument should be bytes-like object." );
68-         goto error ;
69-     }
70- 
71-     self -> dict_buffer  =  PyMem_RawMalloc (dict_content -> len );
73+     self -> dict_buffer  =  PyMem_Malloc (dict_content -> len );
7274    if  (!self -> dict_buffer ) {
75+         Py_DECREF (self );
7376        return  PyErr_NoMemory ();
7477    }
7578    memcpy (self -> dict_buffer , dict_content -> buf , dict_content -> len );
7679    self -> dict_len  =  dict_content -> len ;
7780
78-     /* Both ordinary and "raw content" dictionaries must be 8 bytes minimum */ 
79-     if  (self -> dict_len  <  8 ) {
80-         PyErr_SetString (PyExc_ValueError ,
81-                         "Zstandard dictionary content should at least " 
82-                         "8 bytes." );
83-         goto error ;
84-     }
85- 
8681    /* Get dict_id, 0 means "raw content" dictionary. */ 
87-     self -> dict_id  =  ZSTD_getDictID_fromDict (
88-                                     self -> dict_buffer , self -> dict_len );
82+     self -> dict_id  =  ZSTD_getDictID_fromDict (self -> dict_buffer , self -> dict_len );
8983
9084    /* Check validity for ordinary dictionary */ 
9185    if  (!is_raw  &&  self -> dict_id  ==  0 ) {
92-         char  * msg  =  "Invalid Zstandard dictionary and is_raw not set.\n" ;
93-         PyErr_SetString (PyExc_ValueError , msg );
86+         PyErr_SetString (PyExc_ValueError , "invalid Zstandard dictionary." );
9487        goto error ;
9588    }
9689
@@ -100,7 +93,6 @@ _zstd_ZstdDict_new_impl(PyTypeObject *type, Py_buffer *dict_content,
10093
10194error :
10295    Py_XDECREF (self );
103-     PyObject_GC_Del (self );
10496    return  NULL ;
10597}
10698
@@ -118,8 +110,8 @@ ZstdDict_dealloc(PyObject *ob)
118110
119111    assert (!PyMutex_IsLocked (& self -> lock ));
120112
121-     /* Release dict_buffer after Free  ZSTD_CDict/ZSTD_DDict instances */ 
122-     PyMem_RawFree (self -> dict_buffer );
113+     /* Release dict_buffer after freeing  ZSTD_CDict/ZSTD_DDict instances */ 
114+     PyMem_Free (self -> dict_buffer );
123115    Py_CLEAR (self -> c_dicts );
124116
125117    PyTypeObject  * tp  =  Py_TYPE (self );
@@ -135,11 +127,11 @@ PyDoc_STRVAR(ZstdDict_dictid_doc,
135127"without any restrictions on format or content." );
136128
137129static  PyObject  * 
138- ZstdDict_str (PyObject  * ob )
130+ ZstdDict_repr (PyObject  * ob )
139131{
140132    ZstdDict  * dict  =  ZstdDict_CAST (ob );
141133    return  PyUnicode_FromFormat ("<ZstdDict dict_id=%u dict_size=%zd>" ,
142-                                 dict -> dict_id , dict -> dict_len );
134+                                 ( unsigned  int ) dict -> dict_id , dict -> dict_len );
143135}
144136
145137static  PyMemberDef  ZstdDict_members [] =  {
@@ -252,15 +244,24 @@ ZstdDict_traverse(PyObject *ob, visitproc visit, void *arg)
252244    return  0 ;
253245}
254246
247+ static  int 
248+ ZstdDict_clear (PyObject  * ob )
249+ {
250+     ZstdDict  * self  =  ZstdDict_CAST (ob );
251+     Py_CLEAR (self -> c_dicts );
252+     return  0 ;
253+ }
254+ 
255255static  PyType_Slot  zstddict_slots [] =  {
256256    {Py_tp_members , ZstdDict_members },
257257    {Py_tp_getset , ZstdDict_getset },
258258    {Py_tp_new , _zstd_ZstdDict_new },
259259    {Py_tp_dealloc , ZstdDict_dealloc },
260-     {Py_tp_str ,  ZstdDict_str },
260+     {Py_tp_repr ,  ZstdDict_repr },
261261    {Py_tp_doc , (void  * )_zstd_ZstdDict_new__doc__ },
262262    {Py_sq_length , ZstdDict_length },
263263    {Py_tp_traverse , ZstdDict_traverse },
264+     {Py_tp_clear , ZstdDict_clear },
264265    {0 , 0 }
265266};
266267
0 commit comments