# HG changeset patch # User Etan Reisner # Date 1196491505 0 # Node ID 4b33d418534247d2e5007b49a57b33da6eb973a7 # Parent 4dc66862203f094db42e7132831d52272b41d1a5 A couple more similar leak fixes though some of these still leak if the calling perl code doesn't clean up after the call. But there isn't a good way around that at the moment. diff -r 4dc66862203f -r 4b33d4185342 libpurple/plugins/perl/common/BuddyList.xs --- a/libpurple/plugins/perl/common/BuddyList.xs Sat Dec 01 06:30:25 2007 +0000 +++ b/libpurple/plugins/perl/common/BuddyList.xs Sat Dec 01 06:45:05 2007 +0000 @@ -44,11 +44,13 @@ Purple::Account account const char * name PREINIT: - GSList *l; + GSList *l, *ll; PPCODE: - for (l = purple_find_buddies(account, name); l != NULL; l = l->next) { + ll = purple_find_buddies(account, name); + for (l = ll; l != NULL; l = l->next) { XPUSHs(sv_2mortal(purple_perl_bless_object(l->data, "Purple::BuddyList::Buddy"))); } + g_slist_free(ll); Purple::BuddyList::Group purple_find_group(name) @@ -101,11 +103,13 @@ purple_group_get_accounts(group) Purple::BuddyList::Group group PREINIT: - GSList *l; + GSList *l, *ll; PPCODE: - for (l = purple_group_get_accounts(group); l != NULL; l = l->next) { + ll = purple_group_get_accounts(group); + for (l = ll; l != NULL; l = l->next) { XPUSHs(sv_2mortal(purple_perl_bless_object(l->data, "Purple::Account"))); } + g_slist_free(ll); gboolean purple_group_on_account(group, account) @@ -268,11 +272,15 @@ purple_blist_node_get_extended_menu(node) Purple::BuddyList::Node node PREINIT: - GList *l; + GList *l, *ll; PPCODE: - for (l = purple_blist_node_get_extended_menu(node); l != NULL; l = g_list_delete_link(l, l)) { + ll = purple_blist_node_get_extended_menu(node); + for (l = ll; l != NULL; l = l->next) { XPUSHs(sv_2mortal(purple_perl_bless_object(l->data, "Purple::Menu::Action"))); } + /* We can free the list here but the script needs to free the + * Purple::Menu::Action 'objects' itself. */ + g_list_free(ll); void purple_blist_node_set_bool(node, key, value) diff -r 4dc66862203f -r 4b33d4185342 libpurple/plugins/perl/common/Log.xs --- a/libpurple/plugins/perl/common/Log.xs Sat Dec 01 06:30:25 2007 +0000 +++ b/libpurple/plugins/perl/common/Log.xs Sat Dec 01 06:45:05 2007 +0000 @@ -65,11 +65,15 @@ const char *name Purple::Account account PREINIT: - GList *l; + GList *l, *ll; PPCODE: - for (l = purple_log_get_logs(type, name, account); l != NULL; l = l->next) { - XPUSHs(sv_2mortal(purple_perl_bless_object(l->data, "Purple::ListEntry"))); + ll = purple_log_get_logs(type, name, account); + for (l = ll; l != NULL; l = l->next) { + XPUSHs(sv_2mortal(purple_perl_bless_object(l->data, "Purple::Log"))); } + /* We can free the list here but the script needs to free the + * Purple::Log 'objects' itself. */ + g_list_free(ll); int purple_log_get_size(log) @@ -79,11 +83,15 @@ purple_log_get_system_logs(account) Purple::Account account PREINIT: - GList *l; + GList *l, *ll; PPCODE: - for (l = purple_log_get_system_logs(account); l != NULL; l = l->next) { - XPUSHs(sv_2mortal(purple_perl_bless_object(l->data, "Purple::ListEntry"))); + ll = purple_log_get_system_logs(account); + for (l = ll; l != NULL; l = l->next) { + XPUSHs(sv_2mortal(purple_perl_bless_object(l->data, "Purple::Log"))); } + /* We can free the list here but the script needs to free the + * Purple::Log 'objects' itself. */ + g_list_free(ll); int purple_log_get_total_size(type, name, account) @@ -101,11 +109,14 @@ void purple_log_logger_get_options() PREINIT: - GList *l; + GList *l, *ll; PPCODE: - for (l = purple_log_logger_get_options(); l != NULL; l = l->next) { - XPUSHs(sv_2mortal(purple_perl_bless_object(l->data, "Purple::ListEntry"))); + /* This might want to be massaged to a hash, since that's essentially + * what the key/value list is emulating. */ + for (l = ll = purple_log_logger_get_options(); l != NULL; l = l->next) { + XPUSHs(sv_2mortal(newSVpv(l->data, 0))); } + g_list_free(ll); gchar_own * purple_log_read(log, flags) diff -r 4dc66862203f -r 4b33d4185342 libpurple/plugins/perl/common/Prpl.xs --- a/libpurple/plugins/perl/common/Prpl.xs Sat Dec 01 06:30:25 2007 +0000 +++ b/libpurple/plugins/perl/common/Prpl.xs Sat Dec 01 06:45:05 2007 +0000 @@ -21,13 +21,15 @@ Purple::Account account Purple::Presence presence PREINIT: - GList *l; + GList *l, *ll; PPCODE: - for (l = purple_prpl_get_statuses(account,presence); l != NULL; l = l->next) { - /* XXX Someone please test and make sure this is the right - * type for these things. */ + ll = purple_prpl_get_statuses(account,presence); + for (l = ll; l != NULL; l = l->next) { XPUSHs(sv_2mortal(purple_perl_bless_object(l->data, "Purple::Status"))); } + /* We can free the list here but the script needs to free the + * Purple::Status 'objects' itself. */ + g_list_free(ll); void purple_prpl_got_account_idle(account, idle, idle_time)