22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fang#!./perl
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer#
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fang# Copyright (c) 1995-2000, Raphael Manfredi
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fang#
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fang# You may redistribute only under the same terms as Perl 5, as specified
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fang# in the README file that comes with the distribution.
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fang#
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fang
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fangsub BEGIN {
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fang if ($ENV{PERL_CORE}){
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fang chdir('t') if -d 't';
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fang @INC = ('.', '../lib', '../ext/Storable/t');
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fang } else {
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fang unshift @INC, 't';
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fang }
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fang require Config; import Config;
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fang if ($ENV{PERL_CORE} and $Config{'extensions'} !~ /\bStorable\b/) {
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fang print "1..0 # Skip: Storable was not built\n";
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fang exit 0;
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fang }
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fang require 'st-dump.pl';
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fang}
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fang
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fangsub ok;
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fang
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fanguse Storable qw(freeze thaw);
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fang
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fangprint "1..16\n";
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fang
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fangpackage OVERLOADED;
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fang
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fanguse overload
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fang '""' => sub { $_[0][0] };
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fang
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fangpackage main;
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fang
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fang$a = bless [77], OVERLOADED;
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fang
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fang$b = thaw freeze $a;
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fangok 1, ref $b eq 'OVERLOADED';
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fangok 2, "$b" eq "77";
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fang
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fang$c = thaw freeze \$a;
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fangok 3, ref $c eq 'REF';
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fangok 4, ref $$c eq 'OVERLOADED';
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fangok 5, "$$c" eq "77";
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fang
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fang$d = thaw freeze [$a, $a];
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fangok 6, "$d->[0]" eq "77";
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fang$d->[0][0]++;
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fangok 7, "$d->[1]" eq "78";
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fang
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fangpackage REF_TO_OVER;
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fang
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fangsub make {
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fang my $self = bless {}, shift;
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fang my ($over) = @_;
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fang $self->{over} = $over;
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fang return $self;
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fang}
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fang
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fangpackage OVER;
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fang
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fanguse overload
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fang '+' => \&plus,
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fang '""' => sub { ref $_[0] };
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fang
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fangsub plus {
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fang return 314;
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fang}
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fang
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fangsub make {
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fang my $self = bless {}, shift;
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fang my $ref = REF_TO_OVER->make($self);
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fang $self->{ref} = $ref;
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fang return $self;
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fang}
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fang
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fangpackage main;
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fang
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fang$a = OVER->make();
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fang$b = thaw freeze $a;
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fang
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fangok 8, ref $b eq 'OVER';
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fangok 9, $a + $a == 314;
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fangok 10, ref $b->{ref} eq 'REF_TO_OVER';
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fangok 11, "$b->{ref}->{over}" eq "$b";
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fangok 12, $b + $b == 314;
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fang
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fang# nfreeze data generated by make_overload.pl
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fangmy $f = unpack 'u', q{7!084$0Q(05-?3U9%4DQ/040*!'-N;W<`};
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fang
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fang# see note at the end of do_retrieve in Storable.xs about why this test has to
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fang# use a reference to an overloaded reference, rather than just a reference.
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fangmy $t = eval {thaw $f};
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fangprint "# $@" if $@;
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fangok 13, $@ eq "";
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fangok 14, ref ($t) eq 'REF';
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fangok 15, ref ($$t) eq 'HAS_OVERLOAD';
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fangok 16, $$$t eq 'snow';
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fang1;
22a84b8d79248a611e4ba663a268d3c4bed054acQuaker Fang