summaryrefslogtreecommitdiff
path: root/lib/Parse
diff options
context:
space:
mode:
authorKenichi Ishigaki <ishigaki@cpan.org>2014-12-13 11:19:08 +0900
committerKenichi Ishigaki <ishigaki@cpan.org>2014-12-13 11:19:08 +0900
commit5db87d71a66ec44a0aa19024b18f177037068958 (patch)
treee80ce620123ad90fe8abaf39abc6317f36fe7f7f /lib/Parse
parent3c37c66109521a3f7f2e8ddf8212f2f915d9b4f1 (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.pm76
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;
}
}