@@ -364,12 +364,14 @@ static int
364364set_add_entry (register PySetObject * so , setentry * entry )
365365{
366366 register Py_ssize_t n_used ;
367+ PyObject * key = entry -> key ;
368+ long hash = entry -> hash ;
367369
368370 assert (so -> fill <= so -> mask ); /* at least one empty slot */
369371 n_used = so -> used ;
370- Py_INCREF (entry -> key );
371- if (set_insert_key (so , entry -> key , ( long ) entry -> hash ) == -1 ) {
372- Py_DECREF (entry -> key );
372+ Py_INCREF (key );
373+ if (set_insert_key (so , key , hash ) == -1 ) {
374+ Py_DECREF (key );
373375 return -1 ;
374376 }
375377 if (!(so -> used > n_used && so -> fill * 3 >= (so -> mask + 1 )* 2 ))
@@ -637,6 +639,8 @@ static int
637639set_merge (PySetObject * so , PyObject * otherset )
638640{
639641 PySetObject * other ;
642+ PyObject * key ;
643+ long hash ;
640644 register Py_ssize_t i ;
641645 register setentry * entry ;
642646
@@ -657,11 +661,13 @@ set_merge(PySetObject *so, PyObject *otherset)
657661 }
658662 for (i = 0 ; i <= other -> mask ; i ++ ) {
659663 entry = & other -> table [i ];
660- if (entry -> key != NULL &&
661- entry -> key != dummy ) {
662- Py_INCREF (entry -> key );
663- if (set_insert_key (so , entry -> key , (long ) entry -> hash ) == -1 ) {
664- Py_DECREF (entry -> key );
664+ key = entry -> key ;
665+ hash = entry -> hash ;
666+ if (key != NULL &&
667+ key != dummy ) {
668+ Py_INCREF (key );
669+ if (set_insert_key (so , key , hash ) == -1 ) {
670+ Py_DECREF (key );
665671 return -1 ;
666672 }
667673 }
@@ -1642,15 +1648,22 @@ set_symmetric_difference_update(PySetObject *so, PyObject *other)
16421648 while (_PyDict_Next (other , & pos , & key , & value , & hash )) {
16431649 setentry an_entry ;
16441650
1651+ Py_INCREF (key );
16451652 an_entry .hash = hash ;
16461653 an_entry .key = key ;
1654+
16471655 rv = set_discard_entry (so , & an_entry );
1648- if (rv == -1 )
1656+ if (rv == -1 ) {
1657+ Py_DECREF (key );
16491658 return NULL ;
1659+ }
16501660 if (rv == DISCARD_NOTFOUND ) {
1651- if (set_add_entry (so , & an_entry ) == -1 )
1661+ if (set_add_entry (so , & an_entry ) == -1 ) {
1662+ Py_DECREF (key );
16521663 return NULL ;
1664+ }
16531665 }
1666+ Py_DECREF (key );
16541667 }
16551668 Py_RETURN_NONE ;
16561669 }
0 commit comments