@@ -410,24 +410,27 @@ typedef struct {
410
410
Py_ssize_t allocated ; /* number of slots in data allocated */
411
411
} Pdata ;
412
412
413
+ #define Pdata_CAST (op ) ((Pdata *)(op))
414
+
413
415
static int
414
- Pdata_traverse (Pdata * self , visitproc visit , void * arg )
416
+ Pdata_traverse (PyObject * self , visitproc visit , void * arg )
415
417
{
416
418
Py_VISIT (Py_TYPE (self ));
417
419
return 0 ;
418
420
}
419
421
420
422
static void
421
- Pdata_dealloc (Pdata * self )
423
+ Pdata_dealloc (PyObject * op )
422
424
{
425
+ Pdata * self = Pdata_CAST (op );
423
426
PyTypeObject * tp = Py_TYPE (self );
424
427
PyObject_GC_UnTrack (self );
425
428
Py_ssize_t i = Py_SIZE (self );
426
429
while (-- i >= 0 ) {
427
430
Py_DECREF (self -> data [i ]);
428
431
}
429
432
PyMem_Free (self -> data );
430
- tp -> tp_free (( PyObject * ) self );
433
+ tp -> tp_free (self );
431
434
Py_DECREF (tp );
432
435
}
433
436
@@ -696,6 +699,11 @@ typedef struct {
696
699
UnpicklerObject * unpickler ;
697
700
} UnpicklerMemoProxyObject ;
698
701
702
+ #define PicklerObject_CAST (op ) ((PicklerObject *)(op))
703
+ #define UnpicklerObject_CAST (op ) ((UnpicklerObject *)(op))
704
+ #define PicklerMemoProxyObject_CAST (op ) ((PicklerMemoProxyObject *)(op))
705
+ #define UnpicklerMemoProxyObject_CAST (op ) ((UnpicklerMemoProxyObject *)(op))
706
+
699
707
/* Forward declarations */
700
708
static int save (PickleState * state , PicklerObject * , PyObject * , int );
701
709
static int save_reduce (PickleState * , PicklerObject * , PyObject * , PyObject * );
@@ -4720,8 +4728,9 @@ static struct PyMethodDef Pickler_methods[] = {
4720
4728
};
4721
4729
4722
4730
static int
4723
- Pickler_clear (PicklerObject * self )
4731
+ Pickler_clear (PyObject * op )
4724
4732
{
4733
+ PicklerObject * self = PicklerObject_CAST (op );
4725
4734
Py_CLEAR (self -> output_buffer );
4726
4735
Py_CLEAR (self -> write );
4727
4736
Py_CLEAR (self -> persistent_id );
@@ -4740,18 +4749,19 @@ Pickler_clear(PicklerObject *self)
4740
4749
}
4741
4750
4742
4751
static void
4743
- Pickler_dealloc (PicklerObject * self )
4752
+ Pickler_dealloc (PyObject * self )
4744
4753
{
4745
4754
PyTypeObject * tp = Py_TYPE (self );
4746
4755
PyObject_GC_UnTrack (self );
4747
4756
(void )Pickler_clear (self );
4748
- tp -> tp_free (( PyObject * ) self );
4757
+ tp -> tp_free (self );
4749
4758
Py_DECREF (tp );
4750
4759
}
4751
4760
4752
4761
static int
4753
- Pickler_traverse (PicklerObject * self , visitproc visit , void * arg )
4762
+ Pickler_traverse (PyObject * op , visitproc visit , void * arg )
4754
4763
{
4764
+ PicklerObject * self = PicklerObject_CAST (op );
4755
4765
Py_VISIT (Py_TYPE (self ));
4756
4766
Py_VISIT (self -> write );
4757
4767
Py_VISIT (self -> persistent_id );
@@ -4822,7 +4832,7 @@ _pickle_Pickler___init___impl(PicklerObject *self, PyObject *file,
4822
4832
{
4823
4833
/* In case of multiple __init__() calls, clear previous content. */
4824
4834
if (self -> write != NULL )
4825
- (void )Pickler_clear (self );
4835
+ (void )Pickler_clear (( PyObject * ) self );
4826
4836
4827
4837
if (_Pickler_SetProtocol (self , protocol , fix_imports ) < 0 )
4828
4838
return -1 ;
@@ -4974,27 +4984,29 @@ static PyMethodDef picklerproxy_methods[] = {
4974
4984
};
4975
4985
4976
4986
static void
4977
- PicklerMemoProxy_dealloc (PicklerMemoProxyObject * self )
4987
+ PicklerMemoProxy_dealloc (PyObject * op )
4978
4988
{
4989
+ PicklerMemoProxyObject * self = PicklerMemoProxyObject_CAST (op );
4979
4990
PyTypeObject * tp = Py_TYPE (self );
4980
4991
PyObject_GC_UnTrack (self );
4981
4992
Py_CLEAR (self -> pickler );
4982
- tp -> tp_free (( PyObject * ) self );
4993
+ tp -> tp_free (self );
4983
4994
Py_DECREF (tp );
4984
4995
}
4985
4996
4986
4997
static int
4987
- PicklerMemoProxy_traverse (PicklerMemoProxyObject * self ,
4988
- visitproc visit , void * arg )
4998
+ PicklerMemoProxy_traverse (PyObject * op , visitproc visit , void * arg )
4989
4999
{
5000
+ PicklerMemoProxyObject * self = PicklerMemoProxyObject_CAST (op );
4990
5001
Py_VISIT (Py_TYPE (self ));
4991
5002
Py_VISIT (self -> pickler );
4992
5003
return 0 ;
4993
5004
}
4994
5005
4995
5006
static int
4996
- PicklerMemoProxy_clear (PicklerMemoProxyObject * self )
5007
+ PicklerMemoProxy_clear (PyObject * op )
4997
5008
{
5009
+ PicklerMemoProxyObject * self = PicklerMemoProxyObject_CAST (op );
4998
5010
Py_CLEAR (self -> pickler );
4999
5011
return 0 ;
5000
5012
}
@@ -5032,15 +5044,17 @@ PicklerMemoProxy_New(PicklerObject *pickler)
5032
5044
/*****************************************************************************/
5033
5045
5034
5046
static PyObject *
5035
- Pickler_get_memo (PicklerObject * self , void * Py_UNUSED (ignored ))
5047
+ Pickler_get_memo (PyObject * op , void * Py_UNUSED (closure ))
5036
5048
{
5049
+ PicklerObject * self = PicklerObject_CAST (op );
5037
5050
return PicklerMemoProxy_New (self );
5038
5051
}
5039
5052
5040
5053
static int
5041
- Pickler_set_memo (PicklerObject * self , PyObject * obj , void * Py_UNUSED (ignored ))
5054
+ Pickler_set_memo (PyObject * op , PyObject * obj , void * Py_UNUSED (closure ))
5042
5055
{
5043
5056
PyMemoTable * new_memo = NULL ;
5057
+ PicklerObject * self = PicklerObject_CAST (op );
5044
5058
5045
5059
if (obj == NULL ) {
5046
5060
PyErr_SetString (PyExc_TypeError ,
@@ -5050,7 +5064,7 @@ Pickler_set_memo(PicklerObject *self, PyObject *obj, void *Py_UNUSED(ignored))
5050
5064
5051
5065
PickleState * st = _Pickle_FindStateByType (Py_TYPE (self ));
5052
5066
if (Py_IS_TYPE (obj , st -> PicklerMemoProxyType )) {
5053
- PicklerObject * pickler =
5067
+ PicklerObject * pickler = /* safe fast cast for 'obj' */
5054
5068
((PicklerMemoProxyObject * )obj )-> pickler ;
5055
5069
5056
5070
new_memo = PyMemoTable_Copy (pickler -> memo );
@@ -5103,11 +5117,12 @@ Pickler_set_memo(PicklerObject *self, PyObject *obj, void *Py_UNUSED(ignored))
5103
5117
static PyObject *
5104
5118
Pickler_getattr (PyObject * self , PyObject * name )
5105
5119
{
5120
+ PicklerObject * po = PicklerObject_CAST (self );
5106
5121
if (PyUnicode_Check (name )
5107
5122
&& PyUnicode_EqualToUTF8 (name , "persistent_id" )
5108
- && (( PicklerObject * ) self ) -> persistent_id_attr )
5123
+ && po -> persistent_id_attr )
5109
5124
{
5110
- return Py_NewRef ((( PicklerObject * ) self ) -> persistent_id_attr );
5125
+ return Py_NewRef (po -> persistent_id_attr );
5111
5126
}
5112
5127
5113
5128
return PyObject_GenericGetAttr (self , name );
@@ -5119,8 +5134,9 @@ Pickler_setattr(PyObject *self, PyObject *name, PyObject *value)
5119
5134
if (PyUnicode_Check (name )
5120
5135
&& PyUnicode_EqualToUTF8 (name , "persistent_id" ))
5121
5136
{
5137
+ PicklerObject * po = PicklerObject_CAST (self );
5122
5138
Py_XINCREF (value );
5123
- Py_XSETREF ((( PicklerObject * ) self ) -> persistent_id_attr , value );
5139
+ Py_XSETREF (po -> persistent_id_attr , value );
5124
5140
return 0 ;
5125
5141
}
5126
5142
@@ -5135,8 +5151,7 @@ static PyMemberDef Pickler_members[] = {
5135
5151
};
5136
5152
5137
5153
static PyGetSetDef Pickler_getsets [] = {
5138
- {"memo" , (getter )Pickler_get_memo ,
5139
- (setter )Pickler_set_memo },
5154
+ {"memo" , Pickler_get_memo , Pickler_set_memo },
5140
5155
{NULL }
5141
5156
};
5142
5157
@@ -7221,8 +7236,9 @@ static struct PyMethodDef Unpickler_methods[] = {
7221
7236
};
7222
7237
7223
7238
static int
7224
- Unpickler_clear (UnpicklerObject * self )
7239
+ Unpickler_clear (PyObject * op )
7225
7240
{
7241
+ UnpicklerObject * self = UnpicklerObject_CAST (op );
7226
7242
Py_CLEAR (self -> readline );
7227
7243
Py_CLEAR (self -> readinto );
7228
7244
Py_CLEAR (self -> read );
@@ -7250,18 +7266,19 @@ Unpickler_clear(UnpicklerObject *self)
7250
7266
}
7251
7267
7252
7268
static void
7253
- Unpickler_dealloc (UnpicklerObject * self )
7269
+ Unpickler_dealloc (PyObject * self )
7254
7270
{
7255
7271
PyTypeObject * tp = Py_TYPE (self );
7256
- PyObject_GC_UnTrack (( PyObject * ) self );
7272
+ PyObject_GC_UnTrack (self );
7257
7273
(void )Unpickler_clear (self );
7258
- tp -> tp_free (( PyObject * ) self );
7274
+ tp -> tp_free (self );
7259
7275
Py_DECREF (tp );
7260
7276
}
7261
7277
7262
7278
static int
7263
- Unpickler_traverse (UnpicklerObject * self , visitproc visit , void * arg )
7279
+ Unpickler_traverse (PyObject * op , visitproc visit , void * arg )
7264
7280
{
7281
+ UnpicklerObject * self = UnpicklerObject_CAST (op );
7265
7282
Py_VISIT (Py_TYPE (self ));
7266
7283
Py_VISIT (self -> readline );
7267
7284
Py_VISIT (self -> readinto );
@@ -7322,7 +7339,7 @@ _pickle_Unpickler___init___impl(UnpicklerObject *self, PyObject *file,
7322
7339
{
7323
7340
/* In case of multiple __init__() calls, clear previous content. */
7324
7341
if (self -> read != NULL )
7325
- (void )Unpickler_clear (self );
7342
+ (void )Unpickler_clear (( PyObject * ) self );
7326
7343
7327
7344
if (_Unpickler_SetInputStream (self , file ) < 0 )
7328
7345
return -1 ;
@@ -7461,27 +7478,29 @@ static PyMethodDef unpicklerproxy_methods[] = {
7461
7478
};
7462
7479
7463
7480
static void
7464
- UnpicklerMemoProxy_dealloc (UnpicklerMemoProxyObject * self )
7481
+ UnpicklerMemoProxy_dealloc (PyObject * op )
7465
7482
{
7483
+ UnpicklerMemoProxyObject * self = UnpicklerMemoProxyObject_CAST (op );
7466
7484
PyTypeObject * tp = Py_TYPE (self );
7467
7485
PyObject_GC_UnTrack (self );
7468
7486
Py_CLEAR (self -> unpickler );
7469
- tp -> tp_free (( PyObject * ) self );
7487
+ tp -> tp_free (self );
7470
7488
Py_DECREF (tp );
7471
7489
}
7472
7490
7473
7491
static int
7474
- UnpicklerMemoProxy_traverse (UnpicklerMemoProxyObject * self ,
7475
- visitproc visit , void * arg )
7492
+ UnpicklerMemoProxy_traverse (PyObject * op , visitproc visit , void * arg )
7476
7493
{
7494
+ UnpicklerMemoProxyObject * self = UnpicklerMemoProxyObject_CAST (op );
7477
7495
Py_VISIT (Py_TYPE (self ));
7478
7496
Py_VISIT (self -> unpickler );
7479
7497
return 0 ;
7480
7498
}
7481
7499
7482
7500
static int
7483
- UnpicklerMemoProxy_clear (UnpicklerMemoProxyObject * self )
7501
+ UnpicklerMemoProxy_clear (PyObject * op )
7484
7502
{
7503
+ UnpicklerMemoProxyObject * self = UnpicklerMemoProxyObject_CAST (op );
7485
7504
Py_CLEAR (self -> unpickler );
7486
7505
return 0 ;
7487
7506
}
@@ -7521,15 +7540,17 @@ UnpicklerMemoProxy_New(UnpicklerObject *unpickler)
7521
7540
7522
7541
7523
7542
static PyObject *
7524
- Unpickler_get_memo (UnpicklerObject * self , void * Py_UNUSED (ignored ))
7543
+ Unpickler_get_memo (PyObject * op , void * Py_UNUSED (closure ))
7525
7544
{
7545
+ UnpicklerObject * self = UnpicklerObject_CAST (op );
7526
7546
return UnpicklerMemoProxy_New (self );
7527
7547
}
7528
7548
7529
7549
static int
7530
- Unpickler_set_memo (UnpicklerObject * self , PyObject * obj , void * Py_UNUSED (ignored ))
7550
+ Unpickler_set_memo (PyObject * op , PyObject * obj , void * Py_UNUSED (closure ))
7531
7551
{
7532
7552
PyObject * * new_memo ;
7553
+ UnpicklerObject * self = UnpicklerObject_CAST (op );
7533
7554
size_t new_memo_size = 0 ;
7534
7555
7535
7556
if (obj == NULL ) {
@@ -7540,7 +7561,7 @@ Unpickler_set_memo(UnpicklerObject *self, PyObject *obj, void *Py_UNUSED(ignored
7540
7561
7541
7562
PickleState * state = _Pickle_FindStateByType (Py_TYPE (self ));
7542
7563
if (Py_IS_TYPE (obj , state -> UnpicklerMemoProxyType )) {
7543
- UnpicklerObject * unpickler =
7564
+ UnpicklerObject * unpickler = /* safe fast cast for 'obj' */
7544
7565
((UnpicklerMemoProxyObject * )obj )-> unpickler ;
7545
7566
7546
7567
new_memo_size = unpickler -> memo_size ;
@@ -7606,11 +7627,12 @@ Unpickler_set_memo(UnpicklerObject *self, PyObject *obj, void *Py_UNUSED(ignored
7606
7627
static PyObject *
7607
7628
Unpickler_getattr (PyObject * self , PyObject * name )
7608
7629
{
7630
+ UnpicklerObject * obj = UnpicklerObject_CAST (self );
7609
7631
if (PyUnicode_Check (name )
7610
7632
&& PyUnicode_EqualToUTF8 (name , "persistent_load" )
7611
- && (( UnpicklerObject * ) self ) -> persistent_load_attr )
7633
+ && obj -> persistent_load_attr )
7612
7634
{
7613
- return Py_NewRef ((( UnpicklerObject * ) self ) -> persistent_load_attr );
7635
+ return Py_NewRef (obj -> persistent_load_attr );
7614
7636
}
7615
7637
7616
7638
return PyObject_GenericGetAttr (self , name );
@@ -7622,16 +7644,17 @@ Unpickler_setattr(PyObject *self, PyObject *name, PyObject *value)
7622
7644
if (PyUnicode_Check (name )
7623
7645
&& PyUnicode_EqualToUTF8 (name , "persistent_load" ))
7624
7646
{
7647
+ UnpicklerObject * obj = UnpicklerObject_CAST (self );
7625
7648
Py_XINCREF (value );
7626
- Py_XSETREF ((( UnpicklerObject * ) self ) -> persistent_load_attr , value );
7649
+ Py_XSETREF (obj -> persistent_load_attr , value );
7627
7650
return 0 ;
7628
7651
}
7629
7652
7630
7653
return PyObject_GenericSetAttr (self , name , value );
7631
7654
}
7632
7655
7633
7656
static PyGetSetDef Unpickler_getsets [] = {
7634
- {"memo" , ( getter ) Unpickler_get_memo , ( setter ) Unpickler_set_memo },
7657
+ {"memo" , Unpickler_get_memo , Unpickler_set_memo },
7635
7658
{NULL }
7636
7659
};
7637
7660
0 commit comments