@@ -311,13 +311,13 @@ PyCursesPanel_Clear(PyObject *op)
311311 PyCursesPanelObject * self = _PyCursesPanelObject_CAST (op );
312312 PyObject * extra = (PyObject * )panel_userptr (self -> pan );
313313 if (extra != NULL ) {
314- Py_DECREF (extra );
315314 if (set_panel_userptr (self -> pan , NULL ) == ERR ) {
316315 _curses_panel_state * state = get_curses_panel_state_by_panel (self );
317316 PyErr_SetString (state -> PyCursesError ,
318317 "set_panel_userptr() returned ERR" );
319318 return -1 ;
320319 }
320+ Py_DECREF (extra );
321321 }
322322 // self->wo should not be cleared because an associated WINDOW may exist
323323 return 0 ;
@@ -330,18 +330,26 @@ PyCursesPanel_Dealloc(PyObject *self)
330330 PyObject_GC_UnTrack (self );
331331
332332 PyCursesPanelObject * po = _PyCursesPanelObject_CAST (self );
333- if (PyCursesPanel_Clear (self ) < 0 ) {
333+ PyObject * extra = (PyObject * )panel_userptr (po -> pan );
334+ if (extra != NULL && set_panel_userptr (po -> pan , NULL ) == ERR ) {
335+ _curses_panel_state * state = get_curses_panel_state_by_panel (po );
336+ PyErr_SetString (state -> PyCursesError ,
337+ "set_panel_userptr() returned ERR" );
334338 PyErr_FormatUnraisable ("Exception ignored in PyCursesPanel_Dealloc()" );
335339 }
340+ if (po -> wo != NULL ) {
341+ remove_lop (po );
342+ if (PyErr_Occurred ()) {
343+ PyErr_FormatUnraisable ("Exception ignored in PyCursesPanel_Dealloc()" );
344+ }
345+ }
336346 if (del_panel (po -> pan ) == ERR && !PyErr_Occurred ()) {
337347 _curses_panel_state * state = get_curses_panel_state_by_panel (po );
338348 PyErr_SetString (state -> PyCursesError , "del_panel() returned ERR" );
339349 PyErr_FormatUnraisable ("Exception ignored in PyCursesPanel_Dealloc()" );
340350 }
341- if (po -> wo != NULL ) {
342- Py_DECREF (po -> wo );
343- remove_lop (po );
344- }
351+ Py_XDECREF (extra );
352+ Py_XDECREF (po -> wo );
345353 tp -> tp_free (po );
346354 Py_DECREF (tp );
347355}
0 commit comments