@@ -189,7 +189,7 @@ framelocalsproxy_setitem(PyObject *self, PyObject *key, PyObject *value)
189
189
190
190
assert (PyDict_Check (extra ));
191
191
192
- return PyDict_SetItem (extra , key , value ) < 0 ;
192
+ return PyDict_SetItem (extra , key , value );
193
193
}
194
194
195
195
static int
@@ -200,19 +200,19 @@ framelocalsproxy_merge(PyObject* self, PyObject* other)
200
200
}
201
201
202
202
PyObject * keys = PyMapping_Keys (other );
203
- PyObject * iter = NULL ;
204
- PyObject * key = NULL ;
205
- PyObject * value = NULL ;
206
-
207
- assert (keys != NULL );
203
+ if (keys == NULL ) {
204
+ return -1 ;
205
+ }
208
206
209
- iter = PyObject_GetIter (keys );
207
+ PyObject * iter = PyObject_GetIter (keys );
210
208
Py_DECREF (keys );
211
-
212
209
if (iter == NULL ) {
213
210
return -1 ;
214
211
}
215
212
213
+ PyObject * key = NULL ;
214
+ PyObject * value = NULL ;
215
+
216
216
while ((key = PyIter_Next (iter )) != NULL ) {
217
217
value = PyObject_GetItem (other , key );
218
218
if (value == NULL ) {
@@ -238,12 +238,11 @@ framelocalsproxy_merge(PyObject* self, PyObject* other)
238
238
}
239
239
240
240
static PyObject *
241
- framelocalsproxy_keys (PyObject * self , PyObject * __unused )
241
+ framelocalsproxy_keys (PyObject * self , void * Py_UNUSED ( ignored ) )
242
242
{
243
- PyObject * names = PyList_New (0 );
244
243
PyFrameObject * frame = ((PyFrameLocalsProxyObject * )self )-> frame ;
245
244
PyCodeObject * co = _PyFrame_GetCode (frame -> f_frame );
246
-
245
+ PyObject * names = PyList_New ( 0 );
247
246
if (names == NULL ) {
248
247
return NULL ;
249
248
}
@@ -260,12 +259,13 @@ framelocalsproxy_keys(PyObject *self, PyObject *__unused)
260
259
}
261
260
262
261
// Iterate through the extra locals
263
- Py_ssize_t i = 0 ;
264
- PyObject * key = NULL ;
265
- PyObject * value = NULL ;
266
-
267
262
if (frame -> f_extra_locals ) {
268
263
assert (PyDict_Check (frame -> f_extra_locals ));
264
+
265
+ Py_ssize_t i = 0 ;
266
+ PyObject * key = NULL ;
267
+ PyObject * value = NULL ;
268
+
269
269
while (PyDict_Next (frame -> f_extra_locals , & i , & key , & value )) {
270
270
if (PyList_Append (names , key ) < 0 ) {
271
271
Py_DECREF (names );
@@ -341,9 +341,16 @@ framelocalsproxy_richcompare(PyObject *self, PyObject *other, int op)
341
341
}
342
342
} else if (PyDict_Check (other )) {
343
343
PyObject * dct = PyDict_New ();
344
- PyObject * result = NULL ;
345
- PyDict_Update (dct , self );
346
- result = PyObject_RichCompare (dct , other , op );
344
+ if (dct == NULL ) {
345
+ return NULL ;
346
+ }
347
+
348
+ if (PyDict_Update (dct , self ) < 0 ) {
349
+ Py_DECREF (dct );
350
+ return NULL ;
351
+ }
352
+
353
+ PyObject * result = PyObject_RichCompare (dct , other , op );
347
354
Py_DECREF (dct );
348
355
return result ;
349
356
}
@@ -360,14 +367,22 @@ framelocalsproxy_repr(PyObject *self)
360
367
}
361
368
362
369
PyObject * dct = PyDict_New ();
363
- PyObject * repr = NULL ;
370
+ if (dct == NULL ) {
371
+ Py_ReprLeave (self );
372
+ return NULL ;
373
+ }
364
374
365
- if (PyDict_Update (dct , self ) == 0 ) {
366
- repr = PyObject_Repr (dct );
375
+ if (PyDict_Update (dct , self ) < 0 ) {
376
+ Py_DECREF (dct );
377
+ Py_ReprLeave (self );
378
+ return NULL ;
367
379
}
368
- Py_ReprLeave (self );
369
380
381
+ PyObject * repr = PyObject_Repr (dct );
370
382
Py_DECREF (dct );
383
+
384
+ Py_ReprLeave (self );
385
+
371
386
return repr ;
372
387
}
373
388
@@ -379,6 +394,10 @@ framelocalsproxy_or(PyObject *self, PyObject *other)
379
394
}
380
395
381
396
PyObject * result = PyDict_New ();
397
+ if (result == NULL ) {
398
+ return NULL ;
399
+ }
400
+
382
401
if (PyDict_Update (result , self ) < 0 ) {
383
402
Py_DECREF (result );
384
403
return NULL ;
@@ -407,60 +426,90 @@ framelocalsproxy_inplace_or(PyObject *self, PyObject *other)
407
426
}
408
427
409
428
static PyObject *
410
- framelocalsproxy_values (PyObject * self , PyObject * __unused )
429
+ framelocalsproxy_values (PyObject * self , void * Py_UNUSED ( ignored ) )
411
430
{
412
- PyObject * values = PyList_New (0 );
413
431
PyFrameObject * frame = ((PyFrameLocalsProxyObject * )self )-> frame ;
414
432
PyCodeObject * co = _PyFrame_GetCode (frame -> f_frame );
433
+ PyObject * values = PyList_New (0 );
434
+ if (values == NULL ) {
435
+ return NULL ;
436
+ }
415
437
416
438
for (int i = 0 ; i < co -> co_nlocalsplus ; i ++ ) {
417
439
PyObject * value = framelocalsproxy_getval (frame -> f_frame , co , i );
418
440
if (value ) {
419
- PyList_Append (values , value );
441
+ if (PyList_Append (values , value ) < 0 ) {
442
+ Py_DECREF (values );
443
+ return NULL ;
444
+ }
420
445
}
421
446
}
422
447
423
448
// Iterate through the extra locals
424
- Py_ssize_t j = 0 ;
425
- PyObject * key = NULL ;
426
- PyObject * value = NULL ;
427
-
428
449
if (frame -> f_extra_locals ) {
450
+ Py_ssize_t j = 0 ;
451
+ PyObject * key = NULL ;
452
+ PyObject * value = NULL ;
429
453
while (PyDict_Next (frame -> f_extra_locals , & j , & key , & value )) {
430
- PyList_Append (values , value );
454
+ if (PyList_Append (values , value ) < 0 ) {
455
+ Py_DECREF (values );
456
+ return NULL ;
457
+ }
431
458
}
432
459
}
433
460
434
461
return values ;
435
462
}
436
463
437
464
static PyObject *
438
- framelocalsproxy_items (PyObject * self , PyObject * __unused )
465
+ framelocalsproxy_items (PyObject * self , void * Py_UNUSED ( ignored ) )
439
466
{
440
- PyObject * items = PyList_New (0 );
441
467
PyFrameObject * frame = ((PyFrameLocalsProxyObject * )self )-> frame ;
442
468
PyCodeObject * co = _PyFrame_GetCode (frame -> f_frame );
469
+ PyObject * items = PyList_New (0 );
470
+ if (items == NULL ) {
471
+ return NULL ;
472
+ }
443
473
444
474
for (int i = 0 ; i < co -> co_nlocalsplus ; i ++ ) {
445
475
PyObject * name = PyTuple_GET_ITEM (co -> co_localsplusnames , i );
446
476
PyObject * value = framelocalsproxy_getval (frame -> f_frame , co , i );
447
477
448
478
if (value ) {
449
479
PyObject * pair = PyTuple_Pack (2 , name , value );
450
- PyList_Append (items , pair );
480
+ if (pair == NULL ) {
481
+ Py_DECREF (items );
482
+ return NULL ;
483
+ }
484
+
485
+ if (PyList_Append (items , pair ) < 0 ) {
486
+ Py_DECREF (items );
487
+ Py_DECREF (pair );
488
+ return NULL ;
489
+ }
490
+
451
491
Py_DECREF (pair );
452
492
}
453
493
}
454
494
455
495
// Iterate through the extra locals
456
- Py_ssize_t j = 0 ;
457
- PyObject * key = NULL ;
458
- PyObject * value = NULL ;
459
-
460
496
if (frame -> f_extra_locals ) {
497
+ Py_ssize_t j = 0 ;
498
+ PyObject * key = NULL ;
499
+ PyObject * value = NULL ;
461
500
while (PyDict_Next (frame -> f_extra_locals , & j , & key , & value )) {
462
501
PyObject * pair = PyTuple_Pack (2 , key , value );
463
- PyList_Append (items , pair );
502
+ if (pair == NULL ) {
503
+ Py_DECREF (items );
504
+ return NULL ;
505
+ }
506
+
507
+ if (PyList_Append (items , pair ) < 0 ) {
508
+ Py_DECREF (items );
509
+ Py_DECREF (pair );
510
+ return NULL ;
511
+ }
512
+
464
513
Py_DECREF (pair );
465
514
}
466
515
}
@@ -588,7 +637,7 @@ framelocalsproxy_setdefault(PyObject* self, PyObject *const *args, Py_ssize_t na
588
637
}
589
638
590
639
static PyObject *
591
- framelocalsproxy_reversed (PyObject * self , PyObject * __unused )
640
+ framelocalsproxy_reversed (PyObject * self , void * Py_UNUSED ( ignored ) )
592
641
{
593
642
PyObject * result = framelocalsproxy_keys (self , NULL );
594
643
@@ -623,19 +672,19 @@ static PyMethodDef framelocalsproxy_methods[] = {
623
672
NULL },
624
673
{"__getitem__" , framelocalsproxy_getitem , METH_O | METH_COEXIST ,
625
674
NULL },
626
- {"__reversed__ " , framelocalsproxy_reversed , METH_NOARGS ,
675
+ {"update " , framelocalsproxy_update , METH_O ,
627
676
NULL },
628
- {"keys " , framelocalsproxy_keys , METH_NOARGS ,
677
+ {"__reversed__ " , _PyCFunction_CAST ( framelocalsproxy_reversed ), METH_NOARGS ,
629
678
NULL },
630
- {"values " , framelocalsproxy_values , METH_NOARGS ,
679
+ {"keys " , _PyCFunction_CAST ( framelocalsproxy_keys ), METH_NOARGS ,
631
680
NULL },
632
- {"items " , framelocalsproxy_items , METH_NOARGS ,
681
+ {"values " , _PyCFunction_CAST ( framelocalsproxy_values ), METH_NOARGS ,
633
682
NULL },
634
- {"update " , framelocalsproxy_update , METH_O ,
683
+ {"items " , _PyCFunction_CAST ( framelocalsproxy_items ) , METH_NOARGS ,
635
684
NULL },
636
- {"get" , _PyCFunction_CAST (framelocalsproxy_get ), METH_FASTCALL ,
685
+ {"get" , _PyCFunction_CAST (framelocalsproxy_get ), METH_FASTCALL ,
637
686
NULL },
638
- {"setdefault" , _PyCFunction_CAST (framelocalsproxy_setdefault ), METH_FASTCALL ,
687
+ {"setdefault" , _PyCFunction_CAST (framelocalsproxy_setdefault ), METH_FASTCALL ,
639
688
NULL },
640
689
{NULL , NULL } /* sentinel */
641
690
};
@@ -666,6 +715,10 @@ PyObject *
666
715
_PyFrameLocalsProxy_New (PyFrameObject * frame )
667
716
{
668
717
PyObject * args = PyTuple_Pack (1 , frame );
718
+ if (args == NULL ) {
719
+ return NULL ;
720
+ }
721
+
669
722
PyObject * proxy = (PyObject * )framelocalsproxy_new (& PyFrameLocalsProxy_Type , args , NULL );
670
723
Py_DECREF (args );
671
724
return proxy ;
0 commit comments