diff options
author | Kenichi Ishigaki <ishigaki@cpan.org> | 2014-12-13 11:19:08 +0900 |
---|---|---|
committer | Kenichi Ishigaki <ishigaki@cpan.org> | 2014-12-13 11:19:08 +0900 |
commit | 5db87d71a66ec44a0aa19024b18f177037068958 (patch) | |
tree | e80ce620123ad90fe8abaf39abc6317f36fe7f7f /lib/Parse | |
parent | 3c37c66109521a3f7f2e8ddf8212f2f915d9b4f1 (diff) |
Revert "restore what are actually overloaded", which seems to have caused segfaults under some environments.
This reverts commit ebba1f6486ce1662e55c23a311ed73140f809d13.
Conflicts:
lib/Parse/PMFile.pm
Diffstat (limited to 'lib/Parse')
-rw-r--r-- | lib/Parse/PMFile.pm | 76 |
1 files changed, 52 insertions, 24 deletions
diff --git a/lib/Parse/PMFile.pm b/lib/Parse/PMFile.pm index fb5cec3..4702b82 100644 --- a/lib/Parse/PMFile.pm +++ b/lib/Parse/PMFile.pm @@ -216,7 +216,6 @@ sub _parse_version { $comp->deny(qw/enteriter iter unstack goto/); # minimum protection against Acme::BadExample version->import('qv') if $self->{UNSAFE} || $UNSAFE; - $self->_store_overloaded_stuff; { no strict; $v = ($self->{UNSAFE} || $UNSAFE) ? eval $eval : $comp->reval($eval); @@ -266,19 +265,6 @@ sub _parse_version { return $self->_normalize_version($v); } -sub _store_overloaded_stuff { - my $self = shift; - my %overloaded; - no strict 'refs'; - for my $package (qw/version version::vpp charstar/) { - for my $op (qw/"" 0+ cmp <=> bool ++ -- + - * =/) { - my $key = "$package\::($op"; - $overloaded{$key} = *{$key} if defined *{$key}; - } - } - $self->{overloaded} = \%overloaded; -} - sub _restore_overloaded_stuff { my ($self, $used_version_in_safe) = @_; return if $self->{UNSAFE} || $UNSAFE; @@ -286,18 +272,60 @@ sub _restore_overloaded_stuff { no strict 'refs'; no warnings 'redefine'; - for my $key (%{ $self->{overloaded} || {} }) { - *{$key} = $self->{overloaded}{$key} if $self->{overloaded}{$key}; + # version XS in CPAN + my $restored; + if ($INC{'version/vxs.pm'}) { + *{'version::(""'} = \&version::vxs::stringify; + *{'version::(0+'} = \&version::vxs::numify; + *{'version::(cmp'} = \&version::vxs::VCMP; + *{'version::(<=>'} = \&version::vxs::VCMP; + *{'version::(bool'} = \&version::vxs::boolean; + $restored = 1; } - if ($self->{overloaded}{'charstar::(""'}) { - package # - charstar; - overload->import; + # version PP in CPAN + if ($INC{'version/vpp.pm'}) { + { + package # hide from PAUSE + charstar; + overload->import; + } + if (!$used_version_in_safe) { + package # hide from PAUSE + version::vpp; + overload->import; + } + unless ($restored) { + *{'version::(""'} = \&version::vpp::stringify; + *{'version::(0+'} = \&version::vpp::numify; + *{'version::(cmp'} = \&version::vpp::vcmp; + *{'version::(<=>'} = \&version::vpp::vcmp; + *{'version::(bool'} = \&version::vpp::vbool; + } + *{'version::vpp::(""'} = \&version::vpp::stringify; + *{'version::vpp::(0+'} = \&version::vpp::numify; + *{'version::vpp::(cmp'} = \&version::vpp::vcmp; + *{'version::vpp::(<=>'} = \&version::vpp::vcmp; + *{'version::vpp::(bool'} = \&version::vpp::vbool; + *{'charstar::(""'} = \&charstar::thischar; + *{'charstar::(0+'} = \&charstar::thischar; + *{'charstar::(++'} = \&charstar::increment; + *{'charstar::(--'} = \&charstar::decrement; + *{'charstar::(+'} = \&charstar::plus; + *{'charstar::(-'} = \&charstar::minus; + *{'charstar::(*'} = \&charstar::multiply; + *{'charstar::(cmp'} = \&charstar::cmp; + *{'charstar::(<=>'} = \&charstar::spaceship; + *{'charstar::(bool'} = \&charstar::thischar; + *{'charstar::(='} = \&charstar::clone; + $restored = 1; } - if ($self->{overloaded}{'version::vpp::(""'} && !$used_version_in_safe) { - package # - version::vpp; - overload->import; + # version in core + if (!$restored) { + *{'version::(""'} = \&version::stringify; + *{'version::(0+'} = \&version::numify; + *{'version::(cmp'} = \&version::vcmp; + *{'version::(<=>'} = \&version::vcmp; + *{'version::(bool'} = \&version::boolean; } } |