Properly use scm_dynwind_* functions where they still make sense

git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@22685 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
Geert Janssens 2012-12-22 18:20:39 +00:00
parent 06eb020f7f
commit 5666e5bd6d
2 changed files with 23 additions and 10 deletions

View File

@ -55,6 +55,7 @@
#include "gnc-locale-utils.h" #include "gnc-locale-utils.h"
#include "gnc-component-manager.h" #include "gnc-component-manager.h"
#include "gnc-features.h" #include "gnc-features.h"
#include "gnc-guile-utils.h"
#define KEY_CURRENCY_CHOICE "currency_choice" #define KEY_CURRENCY_CHOICE "currency_choice"
#define KEY_CURRENCY_OTHER "currency_other" #define KEY_CURRENCY_OTHER "currency_other"
@ -450,7 +451,13 @@ gnc_ui_account_get_tax_info_string (const Account *account)
else else
{ {
gchar *form = NULL; gchar *form = NULL;
scm_dynwind_begin (0);
/* Note: using scm_to_locale_string directly here instead
of our wrapper gnc_scm_to_locale_string. 'form' should
be freed with 'free' instead of 'g_free'. This will
be taken care of automatically during scm_dynwind_end,
because we inform guile of this memory allocation via
scm_dynwind_free a little further. */
form = scm_to_locale_string (form_scm); form = scm_to_locale_string (form_scm);
if (!form) if (!form)
{ {
@ -466,6 +473,11 @@ gnc_ui_account_get_tax_info_string (const Account *account)
else else
{ {
SCM desc_scm; SCM desc_scm;
/* Create a dynwind context because we will be calling (scm) functions
that potentially exit non-locally */
scm_dynwind_begin (0);
scm_dynwind_free (form);
desc_scm = scm_call_3 (get_desc, category, code_scm, desc_scm = scm_call_3 (get_desc, category, code_scm,
tax_entity_type); tax_entity_type);
if (!scm_is_string (desc_scm)) if (!scm_is_string (desc_scm))
@ -482,7 +494,7 @@ gnc_ui_account_get_tax_info_string (const Account *account)
else else
{ {
gchar *desc = NULL; gchar *desc = NULL;
desc = scm_to_locale_string (desc_scm); desc = gnc_scm_to_locale_string (desc_scm);
if (!desc) if (!desc)
{ {
if (tax_related) if (tax_related)
@ -519,11 +531,10 @@ gnc_ui_account_get_tax_info_string (const Account *account)
} }
g_free (copy_txt); g_free (copy_txt);
} }
scm_dynwind_free (desc); g_free (desc);
} }
scm_dynwind_end ();
} }
scm_dynwind_free (form);
scm_dynwind_end ();
} }
} }
g_free (num_code); g_free (num_code);

View File

@ -981,23 +981,25 @@ gnc_scm2KvpFrame (SCM frame_scm)
if (!scm_is_string (key_scm)) if (!scm_is_string (key_scm))
continue; continue;
key = scm_to_locale_string (key_scm); /* key should be freed with free !
This is automatically taken care
of by scm_dynwind_free below. */
scm_dynwind_begin (0); scm_dynwind_begin (0);
key = scm_to_locale_string (key_scm); scm_dynwind_free (key); /* free key whenever the dynwind context ends */
if (!key) if (!key)
{ {
scm_dynwind_free (key);
scm_dynwind_end (); scm_dynwind_end ();
continue; continue;
} }
value = gnc_scm2KvpValue (val_scm); value = gnc_scm2KvpValue (val_scm); /* can exit non-locally so justifies
the use of scm_dynwind context
protection */
if (!value) if (!value)
{ {
scm_dynwind_free (key);
scm_dynwind_end (); scm_dynwind_end ();
continue; continue;
} }
kvp_frame_set_slot_nc (frame, key, value); kvp_frame_set_slot_nc (frame, key, value);
scm_dynwind_free (key);
scm_dynwind_end (); scm_dynwind_end ();
} }