From: Peter Rabbitson Date: Mon, 11 Oct 2010 07:34:48 +0000 (+0000) Subject: Backcompat is tough business :) X-Git-Tag: v0.09008~2 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=cfed50f29bcf6d80bb6e72146c5a051a3f36f656;p=p5sagit%2FClass-Accessor-Grouped.git Backcompat is tough business :) --- diff --git a/Changes b/Changes index d93fdf9..3a8f14b 100644 --- a/Changes +++ b/Changes @@ -1,5 +1,7 @@ Revision history for Class::Accessor::Grouped. + - Fix corner case segfaults with C::XSA and old 5.8 perls + 0.09007 Sat Oct 9 10:22:56 2010 - Fix corner case when get/set_simple overrides are circumvented iff Class::XSAccessor is present diff --git a/lib/Class/Accessor/Grouped.pm b/lib/Class/Accessor/Grouped.pm index 0bb627b..5f9c300 100644 --- a/lib/Class/Accessor/Grouped.pm +++ b/lib/Class/Accessor/Grouped.pm @@ -129,6 +129,10 @@ my $add_xs_accessor = sub { *$fq_meth = Sub::Name::subname($fq_meth, $final_cref); + # older perls segfault if the cref behind the goto throws + # http://rt.perl.org/rt3/Public/Bug/Display.html?id=35878 + return $final_cref->(@_) if ($] < 5.008009); + goto $final_cref; }; }; diff --git a/t/accessors_xs.t b/t/accessors_xs.t index 258e273..fdd251e 100644 --- a/t/accessors_xs.t +++ b/t/accessors_xs.t @@ -2,6 +2,7 @@ use strict; use warnings; use FindBin qw($Bin); use File::Spec::Functions; +use File::Spec::Unix (); # need this for %INC munging use Test::More; use lib 't/lib'; @@ -18,8 +19,21 @@ BEGIN { # rerun the regular 3 tests under XSAccessor $Class::Accessor::Grouped::USE_XS = 1; -for (qw/accessors.t accessors_ro.t accessors_wo.t/) { - subtest "$_ with USE_XS" => sub { require( catfile($Bin, $_) ) } +for my $tname (qw/accessors.t accessors_ro.t accessors_wo.t/) { + + subtest "$tname with USE_XS (pass $_)" => sub { + my $tfn = catfile($Bin, $tname); + + delete $INC{$_} for ( + qw/AccessorGroups.pm AccessorGroupsRO.pm AccessorGroupsSubclass.pm AccessorGroupsWO.pm/, + File::Spec::Unix->catfile ($tfn), + ); + + local $SIG{__WARN__} = sub { warn @_ unless $_[0] =~ /subroutine .+ redefined/i }; + + do($tfn); + + } for (1 .. 2); } done_testing;