in reply to Re^4: Storable- long integer size
in thread Storable- long integer size

I take it that ivtype does *not* have to match.

That may be so, but it seems that longsize also has to match - because that's apparently what Storable stipulates(and for no good reason, AFAICT).
On an Ubuntu box using a perl whose ivsize was 8 and byteorder was 12345678, I ran:
use strict; use warnings; use Storable; my $val = 12345678; my $file = 'store.ubu'; store (\$val, $file); my $valref = retrieve($file); print "$val $$valref\n";
Then I copied (via scp) the generated 'store.ubu' over to a Windows box. (The file does not get changed by the transfer.) Using a compatible Windows perl (ivsize of 8 and byteorder of 12345678) I ran this script to retrieve the value:
use strict; use warnings; use Storable; my $file = 'store.ubu'; print "Retrieving $file\n"; my $r = retrieve($file); print $$r, "\n";
It output:
Retrieving store.ubu Long integer size is not compatible at C:/_64/perl522_492/lib/Storable +.pm line 383, at retrieve.pl line 9.
I then went into the Storable-2.51 source and changed line 6037 of Storable.xs from:
if ((int) *current++ != sizeof(long)) to if ((int) *current++ != sizeof(IV))
(That's the condition that terminates the script and emits the "Long integer size is not compatible" error message.)
I then rebuilt and installed this modified Storable-2.51 and re-ran the retrieval script. This time I got exactly what (I think) I should have been getting all along:
Retrieving store.ubu 12345678
Storable is actively disabling retrieval when it's not necessary to do that.
Is that the way it's supposed to behave ?
Why is it effectively insisting that longsize be the same - especially given that longsize typically differs between linux and windows ?

Cheers,
Rob

Replies are listed 'Best First'.
Re^6: Storable- long integer size
by BrowserUk (Patriarch) on Oct 22, 2015 at 06:35 UTC
    Why is it effectively insisting that longsize be the same - especially given that longsize typically differs between linux and windows ?

    My guess is that its because no one who appreciates the difference between LP64 & LLP64 programming models has really looked at the code since it was ported to 64-bit.

    The code simply makes no attempt at differentiation. The magic_check function from Storable.xs :

    (The comment could be read to suggest another, less generous, interpretation.)


    With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
    Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
    "Science is about questioning the status quo. Questioning authority". I knew I was on the right track :)
    In the absence of evidence, opinion is indistinguishable from prejudice.
      I really didn't expect that Storable would be so fragile over a cross-platform network.

      I can now clearly see that the posts advising the OP to "do it another way" are well founded.
      (Of course, at no stage did I think those posts would prove to be otherwise ;-)

      Cheers,
      Rob

        Whilst it wouldn't be too hard to fix this particular problem; in general it's probably not worth the effort.

        Storable, as the name suggests, is a fast, memory dump&retrieve format, not a data interchange format.

        As such, whilst it would be possible to fix-up this problem; and that could be extended to deal with mismatching byte-orders and 32/64-bit mismatches; that would inevitably make the module slower for its intended purpose.

        In the end that would be another case of feature creep ruining yet another module, by compromising its core function.

        Perhaps the module's biggest mistake is in not making clear its intended purpose and its unsuitability as an interchange format.


        With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
        Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
        "Science is about questioning the status quo. Questioning authority". I knew I was on the right track :)
        In the absence of evidence, opinion is indistinguishable from prejudice.