# Same as pstore(), but network order is used for integers and doubles are
# emitted as strings.
-void
+SV *
pstore(f,obj)
OutputStream f
SV * obj
ALIAS:
net_pstore = 1
PPCODE:
- ST(0) = do_store(aTHX_ f, obj, 0, ix, (SV **)0) ? &PL_sv_yes : &PL_sv_undef;
+ RETVAL = do_store(aTHX_ f, obj, 0, ix, (SV **)0) ? &PL_sv_yes : &PL_sv_undef;
+ /* do_store() can reallocate the stack, so need a sequence point to ensure
+ that ST(0) knows about it. Hence using two statements. */
+ ST(0) = RETVAL;
XSRETURN(1);
# mstore
sub ok;
-use Storable qw(freeze thaw);
+use Storable qw(freeze thaw store retrieve);
%::immortals
= (u => \undef,
);
my $test = 12;
-my $tests = $test + 10 + 2 * 6 * keys %::immortals;
+my $tests = $test + 22 + 2 * 6 * keys %::immortals;
print "1..$tests\n";
package SHORT_NAME;
ok ++$test, $HAS_HOOK::thawed_count == 2;
ok ++$test, $t;
ok ++$test, ref $t eq 'HAS_HOOK';
+
+{
+ package STRESS_THE_STACK;
+
+ my $stress;
+ sub make {
+ bless [];
+ }
+
+ sub no_op {
+ 0;
+ }
+
+ sub STORABLE_freeze {
+ my $self = shift;
+ ++$freeze_count;
+ return no_op(1..(++$stress * 2000)) ? die "can't happen" : '';
+ }
+
+ sub STORABLE_thaw {
+ my $self = shift;
+ ++$thaw_count;
+ no_op(1..(++$stress * 2000)) && die "can't happen";
+ return;
+ }
+}
+
+$STRESS_THE_STACK::freeze_count = 0;
+$STRESS_THE_STACK::thaw_count = 0;
+
+$f = freeze (STRESS_THE_STACK->make);
+
+ok ++$test, $STRESS_THE_STACK::freeze_count == 1;
+ok ++$test, $STRESS_THE_STACK::thaw_count == 0;
+
+$t = thaw $f;
+ok ++$test, $STRESS_THE_STACK::freeze_count == 1;
+ok ++$test, $STRESS_THE_STACK::thaw_count == 1;
+ok ++$test, $t;
+ok ++$test, ref $t eq 'STRESS_THE_STACK';
+
+my $file = "storable-testfile.$$";
+die "Temporary file '$file' already exists" if -e $file;
+
+END { while (-f $file) {unlink $file or die "Can't unlink '$file': $!" }}
+
+$STRESS_THE_STACK::freeze_count = 0;
+$STRESS_THE_STACK::thaw_count = 0;
+
+store (STRESS_THE_STACK->make, $file);
+
+ok ++$test, $STRESS_THE_STACK::freeze_count == 1;
+ok ++$test, $STRESS_THE_STACK::thaw_count == 0;
+
+$t = retrieve ($file);
+ok ++$test, $STRESS_THE_STACK::freeze_count == 1;
+ok ++$test, $STRESS_THE_STACK::thaw_count == 1;
+ok ++$test, $t;
+ok ++$test, ref $t eq 'STRESS_THE_STACK';