gnucash master: Bug 798778 - GnuCashquits abruptly when attempting to edit optionsâ¦
John Ralls
jralls at code.gnucash.org
Fri Mar 17 13:42:31 EDT 2023
Updated via https://github.com/Gnucash/gnucash/commit/b4b84319 (commit)
from https://github.com/Gnucash/gnucash/commit/144b6ae0 (commit)
commit b4b843198421aef9332ad1cae348a4acacfa5586
Author: John Ralls <jralls at ceridwen.us>
Date: Thu Mar 16 17:50:06 2023 -0700
Bug 798778 - GnuCashquits abruptly when attempting to edit optionsâ¦
for certain reports.
Those reports being ones using complex options, apparently because
the callbacks weren't protected from Guile's garbage collector.
So replace the anyway ugly hack of a void* with a std::any wrapping
a class holding a std::unique_ptr with a custom deleter. The
constructor calls scm_gc_protect_object on the SCM containing the
callback and the custom deleter calls scm_gc_unprotect_object. The
copy constructor, required for std::any, makes a new std::unique_ptr
and calls scm_gc_protect_object again ensuring that the protect and
unprotect calls are symmetrical.
Meanwhile std::any hides the Guile dependency from all the classes
that don't need to know about it. The only ugliness is that there's
no good place to put a common implementation of SCNCallbackWrapper so it's
repeated in gnc-optiondb.i and dialog-options.cpp.
Summary of changes:
bindings/guile/gnc-optiondb.i | 24 ++++++++++++++++++++++--
gnucash/gnome-utils/dialog-options.cpp | 30 ++++++++++++++++++++++++++----
libgnucash/engine/gnc-option.hpp | 9 +++++----
3 files changed, 53 insertions(+), 10 deletions(-)
More information about the gnucash-patches
mailing list