diff -r c4041b07165e -r b5dd654deb3b src/list.c --- a/src/list.c Mon Mar 20 18:05:12 2023 +0100 +++ b/src/list.c Mon Mar 20 19:09:08 2023 +0100 @@ -191,7 +191,7 @@ list->cl = &cx_pointer_list_class; } -bool cxListIsStoringPointers(CxList *list) { +bool cxListIsStoringPointers(CxList const *list) { return list->climpl != NULL; } @@ -203,11 +203,11 @@ ) { switch (list->content_destructor_type) { case CX_DESTRUCTOR_SIMPLE: { - list->simple_destructor(elem); + cx_list_invoke_simple_destructor(list, elem); break; } case CX_DESTRUCTOR_ADVANCED: { - list->advanced_destructor.func(list->advanced_destructor.data, elem); + cx_list_invoke_advanced_destructor(list, elem); break; } case CX_DESTRUCTOR_NONE: @@ -215,11 +215,32 @@ } } +void cx_list_invoke_simple_destructor( + CxList const *list, + void *elem +) { + if (cxListIsStoringPointers(list)) { + elem = *((void **) elem); + } + list->simple_destructor(elem); +} + +void cx_list_invoke_advanced_destructor( + CxList const *list, + void *elem +) { + if (cxListIsStoringPointers(list)) { + elem = *((void **) elem); + } + list->advanced_destructor.func(list->advanced_destructor.data, elem); +} + void cxListDestroy(CxList *list) { switch (list->content_destructor_type) { case CX_DESTRUCTOR_SIMPLE: { CxIterator iter = cxListIterator(list); cx_foreach(void*, elem, iter) { + // already correctly resolved pointer - immediately invoke dtor list->simple_destructor(elem); } break; @@ -227,6 +248,7 @@ case CX_DESTRUCTOR_ADVANCED: { CxIterator iter = cxListIterator(list); cx_foreach(void*, elem, iter) { + // already correctly resolved pointer - immediately invoke dtor list->advanced_destructor.func(list->advanced_destructor.data, elem); } break;