From aa429131a379cdbfb9b8e75cb27b5707a219fcd0 Mon Sep 17 00:00:00 2001 From: Tom Feist Date: Fri, 8 Apr 2011 20:53:03 +0100 Subject: add sig_unbind as a demonstration of the signal_remove coderef bug, and a patch to fix it. --- feature-tests/sig_unbind.pl | 58 +++++++++++++++++++++++++++++++++ patches/fix-signal-remove-coderef.patch | 22 +++++++++++++ 2 files changed, 80 insertions(+) create mode 100644 feature-tests/sig_unbind.pl create mode 100644 patches/fix-signal-remove-coderef.patch diff --git a/feature-tests/sig_unbind.pl b/feature-tests/sig_unbind.pl new file mode 100644 index 0000000..3123182 --- /dev/null +++ b/feature-tests/sig_unbind.pl @@ -0,0 +1,58 @@ +use strict; +use warnings; + + +use Irssi (@Irssi::EXPORT_OK); +use Irssi::Irc; +use Irssi::TextUI; + +use Data::Dumper; + + +our $VERSION = '0.1'; +our %IRSSI = ( + authors => 'shabble', + contact => 'shabble+irssi@metavore.org', + name => '', + description => '', + license => 'Public Domain', + ); + +command_bind("dosig_r", + sub { + my $ref = \&cmd_oink; + _print("binding oink to $ref"); + signal_add("command oink", $ref); + }); + +command_bind("undosig_r", + sub { + my $ref = \&cmd_oink; + + _print("unbinding oink from $ref"); + + signal_remove("command oink", $ref); + }); + +command_bind("dosig_s", + sub { + signal_add("command oink", 'cmd_oink'); + }); + +command_bind("undosig_s", + sub { + signal_remove("command oink", 'cmd_oink'); + }); + +sub cmd_oink { + Irssi::active_win()->print("Oink:"); +} + +sub _print { + Irssi::active_win()->print($_[0]); +} + +command("dosig_r"); +command("oink"); +command("undosig_r"); +command("oink"); diff --git a/patches/fix-signal-remove-coderef.patch b/patches/fix-signal-remove-coderef.patch new file mode 100644 index 0000000..e2ecd19 --- /dev/null +++ b/patches/fix-signal-remove-coderef.patch @@ -0,0 +1,22 @@ +From f1f66db22e732ca3e5d920c64c8b904e2fb92762 Mon Sep 17 00:00:00 2001 +From: Tom Feist +Date: Fri, 8 Apr 2011 20:28:41 +0100 +Subject: [PATCH] bugfix: allow Irssi::signal_remove to work properly with coderefs + + +diff --git a/src/perl/perl-signals.c b/src/perl/perl-signals.c +index a455cfd..1652d09 100644 +--- a/src/perl/perl-signals.c ++++ b/src/perl/perl-signals.c +@@ -434,8 +434,9 @@ static void perl_signal_remove_list_one(GSList **siglist, PERL_SIGNAL_REC *rec) + } + + #define sv_func_cmp(f1, f2) \ +- (f1 == f2 || (SvPOK(f1) && SvPOK(f2) && \ +- strcmp((char *) SvPV_nolen(f1), (char *) SvPV_nolen(f2)) == 0)) ++ ((SvROK(f1) && SvROK(f2) && SvRV(f1) == SvRV(f2)) || \ ++ (SvPOK(f1) && SvPOK(f2) && \ ++ strcmp((char *) SvPV_nolen(f1), (char *) SvPV_nolen(f2)) == 0)) + + static void perl_signal_remove_list(GSList **list, SV *func) + { -- cgit v1.2.3