@@ -507,36 +507,39 @@ w_complex_object(PyObject *v, char flag, WFILE *p)
507
507
// to have their elements serialized in a consistent order (even when
508
508
// they have been scrambled by hash randomization). To ensure this, we
509
509
// use an order equivalent to sorted(v, key=marshal.dumps):
510
- PyObject * pairs = PyList_New (0 );
510
+ PyObject * pairs = PyList_New (n );
511
511
if (pairs == NULL ) {
512
512
p -> error = WFERR_NOMEMORY ;
513
513
return ;
514
514
}
515
+ Py_ssize_t i = 0 ;
515
516
while (_PySet_NextEntry (v , & pos , & value , & hash )) {
516
517
PyObject * dump = PyMarshal_WriteObjectToString (value , p -> version );
517
518
if (dump == NULL ) {
518
519
p -> error = WFERR_UNMARSHALLABLE ;
519
- goto anyset_done ;
520
+ Py_DECREF (pairs );
521
+ return ;
520
522
}
521
523
PyObject * pair = PyTuple_Pack (2 , dump , value );
522
524
Py_DECREF (dump );
523
- if (pair == NULL || PyList_Append ( pairs , pair ) ) {
525
+ if (pair == NULL ) {
524
526
p -> error = WFERR_NOMEMORY ;
525
- Py_XDECREF ( pair );
526
- goto anyset_done ;
527
+ Py_DECREF ( pairs );
528
+ return ;
527
529
}
528
- Py_DECREF ( pair );
530
+ PyList_SET_ITEM ( pairs , i ++ , pair );
529
531
}
532
+ assert (i == n );
530
533
if (PyList_Sort (pairs )) {
531
534
p -> error = WFERR_NOMEMORY ;
532
- goto anyset_done ;
535
+ Py_DECREF (pairs );
536
+ return ;
533
537
}
534
538
for (Py_ssize_t i = 0 ; i < n ; i ++ ) {
535
539
PyObject * pair = PyList_GET_ITEM (pairs , i );
536
540
value = PyTuple_GET_ITEM (pair , 1 );
537
541
w_object (value , p );
538
542
}
539
- anyset_done :
540
543
Py_DECREF (pairs );
541
544
}
542
545
else if (PyCode_Check (v )) {
0 commit comments