Update to Storable 1.0, from Raphael Manfredi.
Jarkko Hietaniemi [Fri, 1 Sep 2000 21:06:54 +0000 (21:06 +0000)]
p4raw-id: //depot/perl@6993

19 files changed:
ext/Storable/ChangeLog
ext/Storable/Makefile.PL
ext/Storable/README
ext/Storable/Storable.pm
ext/Storable/Storable.xs
t/lib/st-06compat.t
t/lib/st-blessed.t
t/lib/st-canonical.t
t/lib/st-dclone.t
t/lib/st-dump.pl
t/lib/st-forgive.t
t/lib/st-freeze.t
t/lib/st-overload.t
t/lib/st-recurse.t
t/lib/st-retrieve.t
t/lib/st-store.t
t/lib/st-tied.t
t/lib/st-tiedhook.t
t/lib/st-tieditems.t

index db04bf7..bb24eb7 100644 (file)
@@ -1,3 +1,8 @@
+Thu Aug 31 23:06:06 MEST 2000   Raphael Manfredi <Raphael_Manfredi@pobox.com>
+
+       First official release Storable 1.0, for inclusion in perl 5.7.0.
+       The license scheme is now compatible with Perl's.
+
 Thu Aug 24 01:02:02 MEST 2000   Raphael Manfredi <Raphael_Manfredi@pobox.com>
 
 . Description:
index f9e37a5..7ed71e6 100644 (file)
@@ -1,16 +1,13 @@
-# $Id: Makefile.PL,v 0.7.1.1 2000/08/23 22:49:18 ram Exp $
+# $Id: Makefile.PL,v 1.0 2000/09/01 19:40:41 ram Exp $
 #
 #  Copyright (c) 1995-2000, Raphael Manfredi
 #  
-#  You may redistribute only under the terms of the Artistic License,
-#  as specified in the README file that comes with the distribution.
+#  You may redistribute only under the same terms as Perl 5, as specified
+#  in the README file that comes with the distribution.
 #
 # $Log: Makefile.PL,v $
-# Revision 0.7.1.1  2000/08/23 22:49:18  ram
-# patch3: added MAN3PODS
-#
-# Revision 0.7  2000/08/03 22:04:44  ram
-# Baseline for second beta release.
+# Revision 1.0  2000/09/01 19:40:41  ram
+# Baseline for first official release.
 #
 
 use ExtUtils::MakeMaker;
@@ -19,7 +16,7 @@ use Config;
 WriteMakefile(
     'NAME'                     => 'Storable',
     'DISTNAME'         => "Storable",
-    'MAN3PODS'         => {},
+       'MAN3PODS'              => {},
     'VERSION_FROM'     => 'Storable.pm',
     'dist'                     => { SUFFIX => 'gz', COMPRESS => 'gzip -f' },
     'clean'                    => {'FILES' => '*%'},
index 4c574a0..6dfa689 100644 (file)
@@ -1,34 +1,21 @@
-                         Storable 0.7
+                         Storable 1.0
                Copyright (c) 1995-2000, Raphael Manfredi
 
 ------------------------------------------------------------------------
     This program is free software; you can redistribute it and/or modify
-    it under the terms of the Artistic License, a copy of which can be
-    found with perl.
+    it under the same terms as Perl 5 itself.
 
     This program is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    Artistic License for more details.
+    Perl 5 License schemes for more details.
 ------------------------------------------------------------------------
 
-       *** This is beta software -- use at your own risks ***
-
 +=======================================================================
-|                     PLEASE NOTE CAREFULLY
-|
-|   The serialization format changed between 0.5 and 0.6, and the module
-|   is NOT backward compatible.  Think about it when upgrading from a
-|   pre-0.5@9 version -- images from versions 0.5@9 could still be read
-|   by 0.6, but have not been tested with 0.7.
-|
-|   The next release (0.8 or 1.0) will DROP support for pre-0.6 format.
-|
-|   The serialization format changed between 0.6 and 0.7, and the module
-|   is fully backward compatible, meaning 0.7 can read binary images from
-|   0.6, although it only generates new ones.  If you encounter a situation
-|   where  it is not AND can duplicate it via a small test case, please
-|   send it to me, along with a patch to fix the problem if you can.
+| Storable is distributed as a module, but is also part of the official
+| Perl core distribution.  Maintenance is still done by the Author,
+| whilst the perl5-porters ensure that no change to the Perl internals
+| can break the version of Storable distributed with it.
 +=======================================================================
 
 The Storable extension brings persistency to your data.
@@ -61,7 +48,7 @@ There is an embeded POD manual page in Storable.pm.
 Raphael Manfredi <Raphael_Manfredi@pobox.com>
 
 ------------------------------------------------------------------------
-Thanks to:
+Thanks to (in chronological order):
 
     Jarkko Hietaniemi <jhi@iki.fi>
     Ulrich Pfeifer <pfeifer@charly.informatik.uni-dortmund.de>
@@ -72,6 +59,8 @@ Thanks to:
     Murray Nesbitt <murray@activestate.com>
     Albert N. Micheev <Albert.N.Micheev@f80.n5049.z2.fidonet.org>
     Marc Lehmann <pcg@opengroup.org>
+       Justin Banks <justinb@wamnet.com>
+       Jarkko Hietaniemi <jhi@iki.fi> (AGAIN, as perl 5.7.0 Pumpkin!)
 
 for their contributions.
 
index e8eb076..9960dc8 100644 (file)
@@ -1,24 +1,13 @@
-;# $Id: Storable.pm,v 0.7.1.3 2000/08/23 22:49:25 ram Exp $
+;# $Id: Storable.pm,v 1.0 2000/09/01 19:40:41 ram Exp $
 ;#
 ;#  Copyright (c) 1995-2000, Raphael Manfredi
 ;#  
-;#  You may redistribute only under the terms of the Artistic License,
-;#  as specified in the README file that comes with the distribution.
+;#  You may redistribute only under the same terms as Perl 5, as specified
+;#  in the README file that comes with the distribution.
 ;#
 ;# $Log: Storable.pm,v $
-;# Revision 0.7.1.3  2000/08/23 22:49:25  ram
-;# patch3: updated version number
-;#
-;# Revision 0.7.1.2  2000/08/14 07:18:40  ram
-;# patch2: increased version number
-;#
-;# Revision 0.7.1.1  2000/08/13 20:08:58  ram
-;# patch1: mention new Clone(3) extension in SEE ALSO
-;# patch1: contributor Marc Lehmann added overloading and ref to tied items
-;# patch1: updated e-mail from Benjamin Holzman
-;#
-;# Revision 0.7  2000/08/03 22:04:44  ram
-;# Baseline for second beta release.
+;# Revision 1.0  2000/09/01 19:40:41  ram
+;# Baseline for first official release.
 ;#
 
 require DynaLoader;
@@ -27,15 +16,16 @@ package Storable; @ISA = qw(Exporter DynaLoader);
 
 @EXPORT = qw(store retrieve);
 @EXPORT_OK = qw(
-       nstore store_fd nstore_fd retrieve_fd
+       nstore store_fd nstore_fd fd_retrieve
        freeze nfreeze thaw
        dclone
+       retrieve_fd
 );
 
 use AutoLoader;
 use vars qw($forgive_me $VERSION);
 
-$VERSION = '0.703';
+$VERSION = '1.000';
 *AUTOLOAD = \&AutoLoader::AUTOLOAD;            # Grrr...
 
 #
@@ -55,8 +45,7 @@ unless (defined @Log::Agent::EXPORT) {
 
 sub logcroak;
 
-# 8.3 limitation avoidance trickery.  --mjtguy
-sub retrieve_fd { goto &fdretrieve };
+sub retrieve_fd { &fd_retrieve }               # Backward compatibility
 
 bootstrap Storable;
 1;
@@ -197,11 +186,11 @@ sub retrieve {
 }
 
 #
-# fdretrieve
+# fd_retrieve
 #
 # Same as retrieve, but perform from an already opened file descriptor instead.
 #
-sub fdretrieve {
+sub fd_retrieve {
        my ($file) = @_;
        my $fd = fileno($file);
        logcroak "not a valid file descriptor" unless defined $fd;
@@ -249,8 +238,8 @@ Storable - persistency for perl data structures
  # Storing to and retrieving from an already opened file
  store_fd \@array, \*STDOUT;
  nstore_fd \%table, \*STDOUT;
- $aryref = retrieve_fd(\*SOCKET);
- $hashref = retrieve_fd(\*SOCKET);
+ $aryref = fd_retrieve(\*SOCKET);
+ $hashref = fd_retrieve(\*SOCKET);
 
  # Serializing to memory
  $serialized = freeze \%table;
@@ -284,13 +273,13 @@ whole thing, the objects will continue to share what they originally shared.
 
 At the cost of a slight header overhead, you may store to an already
 opened file descriptor using the C<store_fd> routine, and retrieve
-from a file via C<retrieve_fd>. Those names aren't imported by default,
+from a file via C<fd_retrieve>. Those names aren't imported by default,
 so you will have to do that explicitely if you need those routines.
 The file descriptor you supply must be already opened, for read
 if you're going to retrieve and for write if you wish to store.
 
        store_fd(\%table, *STDOUT) || die "can't store to stdout\n";
-       $hashref = retrieve_fd(*STDIN);
+       $hashref = fd_retrieve(*STDIN);
 
 You can also store data in network order to allow easy sharing across
 multiple platforms, or when storing on a socket known to be remotely
@@ -299,7 +288,7 @@ as in C<nstore> and C<nstore_fd>. At retrieval time, your data will be
 correctly restored so you don't have to know whether you're restoring
 from native or network ordered data.
 
-When using C<retrieve_fd>, objects are retrieved in sequence, one
+When using C<fd_retrieve>, objects are retrieved in sequence, one
 object (i.e. one recursive tree) per associated C<store_fd>.
 
 If you're more from the object-oriented camp, you can inherit from
@@ -585,11 +574,6 @@ if you happen to use your numbers as strings between two freezing
 operations on the same data structures, you will get different
 results.
 
-Due to the aforementionned optimizations, Storable is at the mercy
-of perl's internal redesign or structure changes. If that bothers
-you, you can try convincing Larry that what is used in Storable
-should be documented and consistently kept in future revisions.
-
 =head1 CREDITS
 
 Thank you to (in chronological order):
@@ -602,6 +586,8 @@ Thank you to (in chronological order):
        Jeff Gresham <gresham_jeffrey@jpmorgan.com>
        Murray Nesbitt <murray@activestate.com>
        Marc Lehmann <pcg@opengroup.org>
+       Justin Banks <justinb@wamnet.com>
+       Jarkko Hietaniemi <jhi@iki.fi> (AGAIN, as perl 5.7.0 Pumpkin!)
 
 for their bug reports, suggestions and contributions.
 
index cd2a76b..bb830a9 100644 (file)
@@ -3,29 +3,16 @@
  */
 
 /*
- * $Id: Storable.xs,v 0.7.1.3 2000/08/23 23:00:41 ram Exp $
+ * $Id: Storable.xs,v 1.0 2000/09/01 19:40:41 ram Exp $
  *
  *  Copyright (c) 1995-2000, Raphael Manfredi
  *  
- *  You may redistribute only under the terms of the Artistic License,
- *  as specified in the README file that comes with the distribution.
+ *  You may redistribute only under the same terms as Perl 5, as specified
+ *  in the README file that comes with the distribution.
  *
  * $Log: Storable.xs,v $
- * Revision 0.7.1.3  2000/08/23 23:00:41  ram
- * patch3: ANSI-fied most of the code, preparing for Perl core integration
- * patch3: dispatch tables moved upfront to relieve some compilers
- * patch3: merged 64-bit fixes from perl5-porters
- *
- * Revision 0.7.1.2  2000/08/14 07:19:27  ram
- * patch2: added a refcnt dec in retrieve_tied_key()
- *
- * Revision 0.7.1.1  2000/08/13 20:10:06  ram
- * patch1: was wrongly optimizing for "undef" values in hashes
- * patch1: added support for ref to tied items in hash/array
- * patch1: added overloading support
- *
- * Revision 0.7  2000/08/03 22:04:44  ram
- * Baseline for second beta release.
+ * Revision 1.0  2000/09/01 19:40:41  ram
+ * Baseline for first official release.
  *
  */
 
 #include <patchlevel.h>                /* Perl's one, needed since 5.6 */
 #include <XSUB.h>
 
-/*#define DEBUGME /* Debug mode, turns assertions on as well */
-/*#define DASSERT /* Assertion mode */
+#if 0
+#define DEBUGME /* Debug mode, turns assertions on as well */
+#define DASSERT /* Assertion mode */
+#endif
 
 /*
  * Pre PerlIO time when none of USE_PERLIO and PERLIO_IS_STDIO is defined
@@ -82,12 +71,12 @@ typedef double NV;                  /* Older perls lack the NV type */
 #endif                                         /* PERL_VERSION -- perls < 5.6 */
 
 #ifndef NVef                           /* The following were not part of perl 5.6 */
-#if defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE) && defined(PERL_PRIfldbl)
-#define        NVef            PERL_PRIeldbl
-#define        NVff            PERL_PRIfldbl
-#define        NVgf            PERL_PRIgldbl
-#endif
-#ifndef NVef
+#if defined(USE_LONG_DOUBLE) && \
+       defined(HAS_LONG_DOUBLE) && defined(PERL_PRIfldbl)
+#define NVef           PERL_PRIeldbl
+#define NVff           PERL_PRIfldbl
+#define NVgf           PERL_PRIgldbl
+#else
 #define        NVef            "e"
 #define        NVff            "f"
 #define        NVgf            "g"
@@ -266,8 +255,8 @@ typedef struct stcxt {
 #endif /* < perl5.004_68 */
 
 #define dSTCXT_PTR(T,name)                                                     \
-       T name = (T)(perinterp_sv && SvIOK(perinterp_sv)\
-                               ? INT2PTR(T, SvIVX(perinterp_sv)) : NULL)
+       T name = (perinterp_sv && SvIOK(perinterp_sv)   \
+                               ? INT2PTR(T, SvIVX(perinterp_sv)) : (T) 0)
 #define dSTCXT                                                                         \
        dSTCXT_SV;                                                                              \
        dSTCXT_PTR(stcxt_t *, cxt)
@@ -316,6 +305,37 @@ static stcxt_t *Context_ptr = &Context;
  */
 
 /*
+ * LOW_32BITS
+ *
+ * Keep only the low 32 bits of a pointer (used for tags, which are not
+ * really pointers).
+ */
+
+#if PTRSIZE <= 4
+#define LOW_32BITS(x)  ((I32) (x))
+#else
+#define LOW_32BITS(x)  ((I32) ((unsigned long) (x) & 0xffffffffUL))
+#endif
+
+/*
+ * oI, oS, oC
+ *
+ * Hack for Crays, where sizeof(I32) == 8, and which are big-endians.
+ * Used in the WLEN and RLEN macros.
+ */
+
+#if INTSIZE > 4
+#define oI(x)  ((I32 *) ((char *) (x) + 4))
+#define oS(x)  ((x) - 4)
+#define oC(x)  (x = 0)
+#define CRAY_HACK
+#else
+#define oI(x)  (x)
+#define oS(x)  (x)
+#define oC(x)
+#endif
+
+/*
  * key buffer handling
  */
 #define kbuf   (cxt->keybuf).arena
@@ -402,6 +422,16 @@ static stcxt_t *Context_ptr = &Context;
                return (SV *) 0;                        \
 } while (0)
 
+#ifdef CRAY_HACK
+#define MBUF_GETINT(x) do {                            \
+       oC(x);                                                          \
+       if ((mptr + 4) <= mend) {                       \
+               memcpy(oI(&x), mptr, 4);                \
+               mptr += 4;                                              \
+       } else                                                          \
+               return (SV *) 0;                                \
+} while (0)
+#else
 #define MBUF_GETINT(x) do {                            \
        if ((mptr + sizeof(int)) <= mend) {     \
                if (int_aligned(mptr))                  \
@@ -412,6 +442,7 @@ static stcxt_t *Context_ptr = &Context;
        } else                                                          \
                return (SV *) 0;                                \
 } while (0)
+#endif
 
 #define MBUF_READ(x,s) do {                    \
        if ((mptr + (s)) <= mend) {             \
@@ -440,6 +471,13 @@ static stcxt_t *Context_ptr = &Context;
        }                                                               \
 } while (0)
 
+#ifdef CRAY_HACK
+#define MBUF_PUTINT(i) do {                    \
+       MBUF_CHK(4);                                    \
+       memcpy(mptr, oI(&i), 4);                \
+       mptr += 4;                                              \
+} while (0)
+#else
 #define MBUF_PUTINT(i) do {                    \
        MBUF_CHK(sizeof(int));                  \
        if (int_aligned(mptr))                  \
@@ -448,6 +486,7 @@ static stcxt_t *Context_ptr = &Context;
                memcpy(mptr, &i, sizeof(int));  \
        mptr += sizeof(int);                    \
 } while (0)
+#endif
 
 #define MBUF_WRITE(x,s) do {           \
        MBUF_CHK(s);                                    \
@@ -456,19 +495,6 @@ static stcxt_t *Context_ptr = &Context;
 } while (0)
 
 /*
- * LOW_32BITS
- *
- * Keep only the low 32 bits of a pointer (used for tags, which are not
- * really pointers).
- */
-
-#if PTRSIZE <= 4
-#define LOW_32BITS(x)  ((I32) (x))
-#else
-#define LOW_32BITS(x)  ((I32) ((unsigned long) (x) & 0xffffffffUL))
-#endif
-
-/*
  * Possible return values for sv_type().
  */
 
@@ -520,7 +546,7 @@ static char old_magicstr[] = "perl-store";  /* Magic number before 0.6 */
 static char magicstr[] = "pst0";                       /* Used as a magic number */
 
 #define STORABLE_BIN_MAJOR     2                               /* Binary major "version" */
-#define STORABLE_BIN_MINOR     1                               /* Binary minor "version" */
+#define STORABLE_BIN_MINOR     2                               /* Binary minor "version" */
 
 /*
  * Useful store shortcuts...
@@ -533,28 +559,31 @@ static char magicstr[] = "pst0";                  /* Used as a magic number */
                return -1;                                                      \
 } while (0)
 
+#define WRITE_I32(x)   do {                    \
+       ASSERT(sizeof(x) == sizeof(I32), ("writing an I32"));   \
+       if (!cxt->fio)                                          \
+               MBUF_PUTINT(x);                                 \
+       else if (PerlIO_write(cxt->fio, oI(&x), oS(sizeof(x))) != oS(sizeof(x))) \
+               return -1;                                      \
+       } while (0)
+
 #ifdef HAS_HTONL
 #define WLEN(x)        do {                            \
        if (cxt->netorder) {                    \
                int y = (int) htonl(x);         \
                if (!cxt->fio)                          \
                        MBUF_PUTINT(y);                 \
-               else if (PerlIO_write(cxt->fio, &y, sizeof(y)) != sizeof(y))    \
+               else if (PerlIO_write(cxt->fio,oI(&y),oS(sizeof(y))) != oS(sizeof(y))) \
                        return -1;                              \
        } else {                                                \
                if (!cxt->fio)                          \
                        MBUF_PUTINT(x);                 \
-               else if (PerlIO_write(cxt->fio, &x, sizeof(x)) != sizeof(x))    \
+               else if (PerlIO_write(cxt->fio,oI(&x),oS(sizeof(x))) != oS(sizeof(x))) \
                        return -1;                              \
        }                                                               \
 } while (0)
 #else
-#define WLEN(x)        do {                            \
-       if (!cxt->fio)                                  \
-               MBUF_PUTINT(x);                         \
-       else if (PerlIO_write(cxt->fio, &x, sizeof(x)) != sizeof(x))    \
-               return -1;                                      \
-       } while (0)
+#define WLEN(x)        WRITE_I32(x)
 #endif
 
 #define WRITE(x,y) do {                                                \
@@ -600,22 +629,27 @@ static char magicstr[] = "pst0";                  /* Used as a magic number */
                return (SV *) 0;                                                \
 } while (0)
 
-#ifdef HAS_NTOHL
-#define RLEN(x)        do {                                    \
+#define READ_I32(x)    do {                            \
+       ASSERT(sizeof(x) == sizeof(I32), ("reading an I32"));   \
+       oC(x);                                                          \
        if (!cxt->fio)                                          \
                MBUF_GETINT(x);                                 \
-       else if (PerlIO_read(cxt->fio, &x, sizeof(x)) != sizeof(x))     \
+       else if (PerlIO_read(cxt->fio, oI(&x), oS(sizeof(x))) != oS(sizeof(x))) \
                return (SV *) 0;                                \
-       if (cxt->netorder)                                      \
-               x = (int) ntohl(x);                             \
 } while (0)
-#else
+
+#ifdef HAS_NTOHL
 #define RLEN(x)        do {                                    \
+       oC(x);                                                          \
        if (!cxt->fio)                                          \
                MBUF_GETINT(x);                                 \
-       else if (PerlIO_read(cxt->fio, &x, sizeof(x)) != sizeof(x))     \
+       else if (PerlIO_read(cxt->fio, oI(&x), oS(sizeof(x))) != oS(sizeof(x))) \
                return (SV *) 0;                                \
+       if (cxt->netorder)                                      \
+               x = (int) ntohl(x);                             \
 } while (0)
+#else
+#define RLEN(x) READ_I32(x)
 #endif
 
 #define READ(x,y) do {                                         \
@@ -1127,9 +1161,7 @@ static SV *pkg_fetchmeth(
        gv = gv_fetchmethod_autoload(pkg, method, FALSE);
        if (gv && isGV(gv)) {
                sv = newRV((SV*) GvCV(gv));
-               TRACEME(("%s->%s: 0x%"UVxf,
-                        HvNAME(pkg), method,
-                        PTR2UV(sv)));
+               TRACEME(("%s->%s: 0x%"UVxf, HvNAME(pkg), method, PTR2UV(sv)));
        } else {
                sv = newSVsv(&PL_sv_undef);
                TRACEME(("%s->%s: not found", HvNAME(pkg), method));
@@ -1193,8 +1225,7 @@ static SV *pkg_can(
                        return (SV *) 0;
                } else {
                        TRACEME(("cached %s->%s: 0x%"UVxf,
-                                HvNAME(pkg), method,
-                                PTR2UV(sv)));
+                               HvNAME(pkg), method, PTR2UV(sv)));
                        return sv;
                }
        }
@@ -1367,8 +1398,7 @@ static int store_ref(stcxt_t *cxt, SV *sv)
        if (SvOBJECT(sv)) {
                HV *stash = (HV *) SvSTASH(sv);
                if (stash && Gv_AMG(stash)) {
-                       TRACEME(("ref (0x%"UVxf") is overloaded",
-                                PTR2UV(sv)));
+                       TRACEME(("ref (0x%"UVxf") is overloaded", PTR2UV(sv)));
                        PUTMARK(SX_OVERLOAD);
                } else
                        PUTMARK(SX_REF);
@@ -1468,7 +1498,8 @@ static int store_scalar(stcxt_t *cxt, SV *sv)
                 */
        string:
 
-               STORE_SCALAR(pv, len);
+               wlen = (I32) len;                               /* WLEN via STORE_SCALAR expects I32 */
+               STORE_SCALAR(pv, wlen);
                TRACEME(("ok (scalar 0x%"UVxf" '%s', length = %"IVdf")",
                         PTR2UV(sv), SvPVX(sv), (IV)len));
 
@@ -1479,8 +1510,7 @@ static int store_scalar(stcxt_t *cxt, SV *sv)
                 * Watch for number being an integer in disguise.
                 */
                if (nv == (NV) (iv = I_V(nv))) {
-                       TRACEME(("double %"NVff" is actually integer %"IVdf,
-                                nv, iv));
+                       TRACEME(("double %"NVff" is actually integer %"IVdf, nv, iv));
                        goto integer;           /* Share code below */
                }
 
@@ -1493,8 +1523,7 @@ static int store_scalar(stcxt_t *cxt, SV *sv)
                PUTMARK(SX_DOUBLE);
                WRITE(&nv, sizeof(nv));
 
-               TRACEME(("ok (double 0x%"UVxf", value = %"NVff")",
-                        PTR2UV(sv), nv));
+               TRACEME(("ok (double 0x%"UVxf", value = %"NVff")", PTR2UV(sv), nv));
 
        } else if (flags & SVp_IOK) {           /* SvIOKp(sv) => integer */
                iv = SvIV(sv);
@@ -1515,23 +1544,22 @@ static int store_scalar(stcxt_t *cxt, SV *sv)
                        PUTMARK(siv);
                        TRACEME(("small integer stored as %d", siv));
                } else if (cxt->netorder) {
-                       int niv;
+                       I32 niv;
 #ifdef HAS_HTONL
-                       niv = (int) htonl(iv);
+                       niv = (I32) htonl(iv);
                        TRACEME(("using network order"));
 #else
-                       niv = (int) iv;
+                       niv = (I32) iv;
                        TRACEME(("as-is for network order"));
 #endif
                        PUTMARK(SX_NETINT);
-                       WRITE(&niv, sizeof(niv));
+                       WRITE_I32(niv);
                } else {
                        PUTMARK(SX_INTEGER);
                        WRITE(&iv, sizeof(iv));
                }
 
-               TRACEME(("ok (integer 0x%"UVxf", value = %"IVdf")",
-                        PTR2UV(sv), iv));
+               TRACEME(("ok (integer 0x%"UVxf", value = %"IVdf")", PTR2UV(sv), iv));
 
        } else
                CROAK(("Can't determine type of %s(0x%"UVxf")",
@@ -1684,8 +1712,7 @@ static int store_hash(stcxt_t *cxt, HV *hv)
                         * Store value first.
                         */
                        
-                       TRACEME(("(#%d) value 0x%"UVxf,
-                                i, PTR2UV(val)));
+                       TRACEME(("(#%d) value 0x%"UVxf, i, PTR2UV(val)));
 
                        if (ret = store(cxt, val))
                                goto out;
@@ -1731,8 +1758,7 @@ static int store_hash(stcxt_t *cxt, HV *hv)
                         * Store value first.
                         */
 
-                       TRACEME(("(#%d) value 0x%"UVxf,
-                                i, PTR2UV(val)));
+                       TRACEME(("(#%d) value 0x%"UVxf, i, PTR2UV(val)));
 
                        if (ret = store(cxt, val))
                                goto out;
@@ -1854,14 +1880,12 @@ static int store_tied_item(stcxt_t *cxt, SV *sv)
        if (mg->mg_ptr) {
                TRACEME(("store_tied_item: storing a ref to a tied hash item"));
                PUTMARK(SX_TIED_KEY);
-               TRACEME(("store_tied_item: storing OBJ 0x%"UVxf,
-                        PTR2UV(mg->mg_obj)));
+               TRACEME(("store_tied_item: storing OBJ 0x%"UVxf, PTR2UV(mg->mg_obj)));
 
                if (ret = store(cxt, mg->mg_obj))
                        return ret;
 
-               TRACEME(("store_tied_item: storing PTR 0x%"UVxf,
-                        PTR2UV(mg->mg_ptr)));
+               TRACEME(("store_tied_item: storing PTR 0x%"UVxf, PTR2UV(mg->mg_ptr)));
 
                if (ret = store(cxt, (SV *) mg->mg_ptr))
                        return ret;
@@ -1870,8 +1894,7 @@ static int store_tied_item(stcxt_t *cxt, SV *sv)
 
                TRACEME(("store_tied_item: storing a ref to a tied array item "));
                PUTMARK(SX_TIED_IDX);
-               TRACEME(("store_tied_item: storing OBJ 0x%"UVxf,
-                        PTR2UV(mg->mg_obj)));
+               TRACEME(("store_tied_item: storing OBJ 0x%"UVxf, PTR2UV(mg->mg_obj)));
 
                if (ret = store(cxt, mg->mg_obj))
                        return ret;
@@ -2064,8 +2087,7 @@ static int store_hook(
                if (svh = hv_fetch(cxt->hseen, (char *) &xsv, sizeof(xsv), FALSE))
                        goto sv_seen;           /* Avoid moving code too far to the right */
 
-               TRACEME(("listed object %d at 0x%"UVxf" is unknown",
-                       i-1, PTR2UV(xsv)));
+               TRACEME(("listed object %d at 0x%"UVxf" is unknown", i-1, PTR2UV(xsv)));
 
                /*
                 * We need to recurse to store that object and get it to be known
@@ -2126,7 +2148,8 @@ static int store_hook(
         * If we recursed, the SX_HOOK has already been emitted.
         */
 
-       TRACEME(("SX_HOOK (recursed=%d) flags=0x%x class=%"IVdf" len=%"IVdf" len2=%"IVdf" len3=%d",
+       TRACEME(("SX_HOOK (recursed=%d) flags=0x%x "
+                       "class=%"IVdf" len=%"IVdf" len2=%"IVdf" len3=%d",
                 recursed, flags, (IV)classnum, (IV)len, (IV)len2, count-1));
 
        /* SX_HOOK <flags> */
@@ -2180,7 +2203,7 @@ static int store_hook(
 
                for (i = 1; i < count; i++) {
                        I32 tagval = htonl(LOW_32BITS(ary[i]));
-                       WRITE(&tagval, sizeof(I32));
+                       WRITE_I32(tagval);
                        TRACEME(("object %d, tag #%d", i-1, ntohl(tagval)));
                }
        }
@@ -2434,11 +2457,10 @@ static int store(stcxt_t *cxt, SV *sv)
        if (svh) {
                I32 tagval = htonl(LOW_32BITS(*svh));
 
-               TRACEME(("object 0x%"UVxf" seen as #%d",
-                        PTR2UV(sv), ntohl(tagval)));
+               TRACEME(("object 0x%"UVxf" seen as #%d", PTR2UV(sv), ntohl(tagval)));
 
                PUTMARK(SX_OBJECT);
-               WRITE(&tagval, sizeof(I32));
+               WRITE_I32(tagval);
                return 0;
        }
 
@@ -2531,10 +2553,12 @@ static int magic_write(stcxt_t *cxt)
        PUTMARK((unsigned char) sizeof(int));
        PUTMARK((unsigned char) sizeof(long));
        PUTMARK((unsigned char) sizeof(char *));
+       PUTMARK((unsigned char) sizeof(NV));
 
-       TRACEME(("ok (magic_write byteorder = 0x%lx [%d], I%d L%d P%d)",
+       TRACEME(("ok (magic_write byteorder = 0x%lx [%d], I%d L%d P%d D%d)",
                 (unsigned long) BYTEORDER, (int) c,
-                (int) sizeof(int), (int) sizeof(long), (int) sizeof(char *)));
+                (int) sizeof(int), (int) sizeof(long),
+                (int) sizeof(char *), (int) sizeof(NV)));
 
        return 0;
 }
@@ -3051,7 +3075,7 @@ static SV *retrieve_hook(stcxt_t *cxt)
                        SV **svh;
                        SV *xsv;
 
-                       READ(&tag, sizeof(I32));
+                       READ_I32(tag);
                        tag = ntohl(tag);
                        svh = av_fetch(cxt->aseen, tag, FALSE);
                        if (!svh)
@@ -3379,7 +3403,7 @@ static SV *retrieve_tied_idx(stcxt_t *cxt)
  */
 static SV *retrieve_lscalar(stcxt_t *cxt)
 {
-       STRLEN len;
+       I32 len;
        SV *sv;
 
        RLEN(len);
@@ -3502,11 +3526,11 @@ static SV *retrieve_integer(stcxt_t *cxt)
 static SV *retrieve_netint(stcxt_t *cxt)
 {
        SV *sv;
-       int iv;
+       I32 iv;
 
        TRACEME(("retrieve_netint (#%d)", cxt->tagnum));
 
-       READ(&iv, sizeof(iv));
+       READ_I32(iv);
 #ifdef HAS_NTOHL
        sv = newSViv((int) ntohl(iv));
        TRACEME(("network integer %d", (int) ntohl(iv)));
@@ -4028,6 +4052,12 @@ magic_ok:
        if ((int) c != sizeof(char *))
                CROAK(("Pointer integer size is not compatible"));
 
+       if (version_major >= 2 && version_minor >= 2) {
+               GETMARK(c);             /* sizeof(NV) */
+               if ((int) c != sizeof(NV))
+                       CROAK(("Double size is not compatible"));
+       }
+
        return &PL_sv_undef;    /* OK */
 }
 
@@ -4116,7 +4146,7 @@ again:
 
        if (type == SX_OBJECT) {
                I32 tag;
-               READ(&tag, sizeof(I32));
+               READ_I32(tag);
                tag = ntohl(tag);
                svh = av_fetch(cxt->aseen, tag, FALSE);
                if (!svh)
index 82c04f7..e1a0780 100644 (file)
@@ -1,15 +1,15 @@
 #!./perl
 
-# $Id: compat-0.6.t,v 0.7 2000/08/03 22:04:44 ram Exp $
+# $Id: compat-0.6.t,v 1.0 2000/09/01 19:40:41 ram Exp $
 #
 #  Copyright (c) 1995-2000, Raphael Manfredi
 #  
-#  You may redistribute only under the terms of the Artistic License,
-#  as specified in the README file that comes with the distribution.
+#  You may redistribute only under the same terms as Perl 5, as specified
+#  in the README file that comes with the distribution.
 #
 # $Log: compat-0.6.t,v $
-# Revision 0.7  2000/08/03 22:04:44  ram
-# Baseline for second beta release.
+# Revision 1.0  2000/09/01 19:40:41  ram
+# Baseline for first official release.
 #
 
 BEGIN {
index 284df4d..b1a18e6 100644 (file)
@@ -1,15 +1,15 @@
 #!./perl
 
-# $Id: blessed.t,v 0.7 2000/08/03 22:04:44 ram Exp $
+# $Id: blessed.t,v 1.0 2000/09/01 19:40:41 ram Exp $
 #
 #  Copyright (c) 1995-2000, Raphael Manfredi
 #  
-#  You may redistribute only under the terms of the Artistic License,
-#  as specified in the README file that comes with the distribution.
+#  You may redistribute only under the same terms as Perl 5, as specified
+#  in the README file that comes with the distribution.
 #
 # $Log: blessed.t,v $
-# Revision 0.7  2000/08/03 22:04:44  ram
-# Baseline for second beta release.
+# Revision 1.0  2000/09/01 19:40:41  ram
+# Baseline for first official release.
 #
 
 sub BEGIN {
index 75abb84..b55669b 100644 (file)
@@ -1,15 +1,15 @@
 #!./perl
 
-# $Id: canonical.t,v 0.7 2000/08/03 22:04:44 ram Exp $
+# $Id: canonical.t,v 1.0 2000/09/01 19:40:41 ram Exp $
 #
 #  Copyright (c) 1995-2000, Raphael Manfredi
 #  
-#  You may redistribute only under the terms of the Artistic License,
-#  as specified in the README file that comes with the distribution.
+#  You may redistribute only under the same terms as Perl 5, as specified
+#  in the README file that comes with the distribution.
 #  
 # $Log: canonical.t,v $
-# Revision 0.7  2000/08/03 22:04:44  ram
-# Baseline for second beta release.
+# Revision 1.0  2000/09/01 19:40:41  ram
+# Baseline for first official release.
 #
 
 sub BEGIN {
index 231b70f..38c82eb 100644 (file)
@@ -1,15 +1,15 @@
 #!./perl
 
-# $Id: dclone.t,v 0.7 2000/08/03 22:04:44 ram Exp $
+# $Id: dclone.t,v 1.0 2000/09/01 19:40:41 ram Exp $
 #
 #  Copyright (c) 1995-2000, Raphael Manfredi
 #  
-#  You may redistribute only under the terms of the Artistic License,
-#  as specified in the README file that comes with the distribution.
+#  You may redistribute only under the same terms as Perl 5, as specified
+#  in the README file that comes with the distribution.
 #
 # $Log: dclone.t,v $
-# Revision 0.7  2000/08/03 22:04:44  ram
-# Baseline for second beta release.
+# Revision 1.0  2000/09/01 19:40:41  ram
+# Baseline for first official release.
 #
 
 sub BEGIN {
index b9f64a4..9b1f3d1 100644 (file)
@@ -1,13 +1,13 @@
-;# $Id: dump.pl,v 0.7 2000/08/03 22:04:45 ram Exp $
+;# $Id: dump.pl,v 1.0 2000/09/01 19:40:41 ram Exp $
 ;#
 ;#  Copyright (c) 1995-2000, Raphael Manfredi
 ;#  
-;#  You may redistribute only under the terms of the Artistic License,
-;#  as specified in the README file that comes with the distribution.
+;#  You may redistribute only under the same terms as Perl 5, as specified
+;#  in the README file that comes with the distribution.
 ;#
 ;# $Log: dump.pl,v $
-;# Revision 0.7  2000/08/03 22:04:45  ram
-;# Baseline for second beta release.
+;# Revision 1.0  2000/09/01 19:40:41  ram
+;# Baseline for first official release.
 ;#
 
 sub ok {
index e707b3e..5881098 100644 (file)
@@ -1,21 +1,21 @@
 #!./perl
 
-# $Id: forgive.t,v 0.7.1.1 2000/08/03 22:04:45 ram Exp $
+# $Id: forgive.t,v 1.0.1.1 2000/09/01 19:40:42 ram Exp $
 #
 #  Copyright (c) 1995-2000, Raphael Manfredi
 #  
-#  You may redistribute only under the terms of the Artistic License,
-#  as specified in the README file that comes with the distribution.
+#  You may redistribute only under the same terms as Perl 5, as specified
+#  in the README file that comes with the distribution.
 #
 # Original Author: Ulrich Pfeifer
 # (C) Copyright 1997, Universitat Dortmund, all rights reserved.
 #
 # $Log: forgive.t,v $
-# Revision 0.7.1.1  2000/08/03 22:04:45  ram
-# Baseline for second beta release.
+# Revision 1.0.1.1  2000/09/01 19:40:42  ram
+# Baseline for first official release.
 #
-# Revision 0.7  2000/08/03 22:04:45  ram
-# Baseline for second beta release.
+# Revision 1.0  2000/09/01 19:40:41  ram
+# Baseline for first official release.
 #
 
 sub BEGIN {
index 0b2d1bc..37631ed 100644 (file)
@@ -1,15 +1,15 @@
 #!./perl
 
-# $Id: freeze.t,v 0.7 2000/08/03 22:04:45 ram Exp $
+# $Id: freeze.t,v 1.0 2000/09/01 19:40:41 ram Exp $
 #
 #  Copyright (c) 1995-2000, Raphael Manfredi
 #  
-#  You may redistribute only under the terms of the Artistic License,
-#  as specified in the README file that comes with the distribution.
+#  You may redistribute only under the same terms as Perl 5, as specified
+#  in the README file that comes with the distribution.
 #
 # $Log: freeze.t,v $
-# Revision 0.7  2000/08/03 22:04:45  ram
-# Baseline for second beta release.
+# Revision 1.0  2000/09/01 19:40:41  ram
+# Baseline for first official release.
 #
 
 sub BEGIN {
index 6083faf..8224a05 100644 (file)
@@ -1,15 +1,15 @@
 #!./perl
 
-# $Id: overload.t,v 0.7.1.1 2000/08/13 20:10:10 ram Exp $
+# $Id: overload.t,v 1.0 2000/09/01 19:40:42 ram Exp $
 #
 #  Copyright (c) 1995-2000, Raphael Manfredi
 #  
-#  You may redistribute only under the terms of the Artistic License,
-#  as specified in the README file that comes with the distribution.
+#  You may redistribute only under the same terms as Perl 5, as specified
+#  in the README file that comes with the distribution.
 #  
 # $Log: overload.t,v $
-# Revision 0.7.1.1  2000/08/13 20:10:10  ram
-# patch1: created
+# Revision 1.0  2000/09/01 19:40:42  ram
+# Baseline for first official release.
 #
 
 sub BEGIN {
index 0cec4ee..5bd8e24 100644 (file)
@@ -1,15 +1,15 @@
 #!./perl
 
-# $Id: recurse.t,v 0.7 2000/08/03 22:04:45 ram Exp $
+# $Id: recurse.t,v 1.0 2000/09/01 19:40:42 ram Exp $
 #
 #  Copyright (c) 1995-2000, Raphael Manfredi
 #  
-#  You may redistribute only under the terms of the Artistic License,
-#  as specified in the README file that comes with the distribution.
+#  You may redistribute only under the same terms as Perl 5, as specified
+#  in the README file that comes with the distribution.
 #  
 # $Log: recurse.t,v $
-# Revision 0.7  2000/08/03 22:04:45  ram
-# Baseline for second beta release.
+# Revision 1.0  2000/09/01 19:40:42  ram
+# Baseline for first official release.
 #
 
 sub BEGIN {
index ee5c5a4..c968485 100644 (file)
@@ -1,15 +1,15 @@
 #!./perl
 
-# $Id: retrieve.t,v 0.7 2000/08/03 22:04:45 ram Exp $
+# $Id: retrieve.t,v 1.0 2000/09/01 19:40:42 ram Exp $
 #
 #  Copyright (c) 1995-2000, Raphael Manfredi
 #  
-#  You may redistribute only under the terms of the Artistic License,
-#  as specified in the README file that comes with the distribution.
+#  You may redistribute only under the same terms as Perl 5, as specified
+#  in the README file that comes with the distribution.
 #
 # $Log: retrieve.t,v $
-# Revision 0.7  2000/08/03 22:04:45  ram
-# Baseline for second beta release.
+# Revision 1.0  2000/09/01 19:40:42  ram
+# Baseline for first official release.
 #
 
 sub BEGIN {
index 9966143..d26755f 100644 (file)
@@ -1,15 +1,15 @@
 #!./perl
 
-# $Id: store.t,v 0.7 2000/08/03 22:04:45 ram Exp $
+# $Id: store.t,v 1.0 2000/09/01 19:40:42 ram Exp $
 #
 #  Copyright (c) 1995-2000, Raphael Manfredi
 #  
-#  You may redistribute only under the terms of the Artistic License,
-#  as specified in the README file that comes with the distribution.
+#  You may redistribute only under the same terms as Perl 5, as specified
+#  in the README file that comes with the distribution.
 #
 # $Log: store.t,v $
-# Revision 0.7  2000/08/03 22:04:45  ram
-# Baseline for second beta release.
+# Revision 1.0  2000/09/01 19:40:42  ram
+# Baseline for first official release.
 #
 
 sub BEGIN {
@@ -24,8 +24,7 @@ sub BEGIN {
     require 'lib/st-dump.pl';
 }
 
-
-use Storable qw(store retrieve store_fd nstore_fd retrieve_fd);
+use Storable qw(store retrieve store_fd nstore_fd fd_retrieve);
 
 print "1..20\n";
 
@@ -86,31 +85,31 @@ print "ok 11\n";
 print "not " unless open(OUT, 'store');
 binmode OUT;
 
-$r = retrieve_fd(::OUT);
+$r = fd_retrieve(::OUT);
 print "not " unless defined $r;
 print "ok 12\n";
 print "not " unless &dump($foo) eq &dump($r);
 print "ok 13\n";
 
-$r = retrieve_fd(::OUT);
+$r = fd_retrieve(::OUT);
 print "not " unless defined $r;
 print "ok 14\n";
 print "not " unless &dump(\@a) eq &dump($r);
 print "ok 15\n";
 
-$r = retrieve_fd(main::OUT);
+$r = fd_retrieve(main::OUT);
 print "not " unless defined $r;
 print "ok 16\n";
 print "not " unless &dump($foo) eq &dump($r);
 print "ok 17\n";
 
-$r = retrieve_fd(::OUT);
+$r = fd_retrieve(::OUT);
 print "not " unless defined $r;
 print "ok 18\n";
 print "not " unless &dump(\%a) eq &dump($r);
 print "ok 19\n";
 
-eval { $r = retrieve_fd(::OUT); };
+eval { $r = fd_retrieve(::OUT); };
 print "not " unless $@;
 print "ok 20\n";
 
index 0abbac4..88131fe 100644 (file)
@@ -1,18 +1,15 @@
 #!./perl
 
-# $Id: tied.t,v 0.7.1.1 2000/08/13 20:10:27 ram Exp $
+# $Id: tied.t,v 1.0 2000/09/01 19:40:42 ram Exp $
 #
 #  Copyright (c) 1995-2000, Raphael Manfredi
 #  
-#  You may redistribute only under the terms of the Artistic License,
-#  as specified in the README file that comes with the distribution.
+#  You may redistribute only under the same terms as Perl 5, as specified
+#  in the README file that comes with the distribution.
 #
 # $Log: tied.t,v $
-# Revision 0.7.1.1  2000/08/13 20:10:27  ram
-# patch1: added test case for "undef" in hashes
-#
-# Revision 0.7  2000/08/03 22:04:45  ram
-# Baseline for second beta release.
+# Revision 1.0  2000/09/01 19:40:42  ram
+# Baseline for first official release.
 #
 
 sub BEGIN {
index a8a8158..455cb05 100644 (file)
@@ -1,15 +1,15 @@
 #!./perl
 
-# $Id: tied_hook.t,v 0.7 2000/08/03 22:04:45 ram Exp $
+# $Id: tied_hook.t,v 1.0 2000/09/01 19:40:42 ram Exp $
 #
 #  Copyright (c) 1995-2000, Raphael Manfredi
 #  
-#  You may redistribute only under the terms of the Artistic License,
-#  as specified in the README file that comes with the distribution.
+#  You may redistribute only under the same terms as Perl 5, as specified
+#  in the README file that comes with the distribution.
 #
 # $Log: tied_hook.t,v $
-# Revision 0.7  2000/08/03 22:04:45  ram
-# Baseline for second beta release.
+# Revision 1.0  2000/09/01 19:40:42  ram
+# Baseline for first official release.
 #
 
 sub BEGIN {
index 44e4f5c..3d0abf7 100644 (file)
@@ -1,18 +1,15 @@
 #!./perl
 
-# $Id: tied_items.t,v 0.7.1.2 2000/08/14 07:20:35 ram Exp $
+# $Id: tied_items.t,v 1.0 2000/09/01 19:40:42 ram Exp $
 #
 #  Copyright (c) 1995-2000, Raphael Manfredi
 #  
-#  You may redistribute only under the terms of the Artistic License,
-#  as specified in the README file that comes with the distribution.
+#  You may redistribute only under the same terms as Perl 5, as specified
+#  in the README file that comes with the distribution.
 #
 # $Log: tied_items.t,v $
-# Revision 0.7.1.2  2000/08/14 07:20:35  ram
-# patch2: removed spurious dependency to Devel::Peek, used for testing only
-#
-# Revision 0.7.1.1  2000/08/13 20:10:31  ram
-# patch1: created
+# Revision 1.0  2000/09/01 19:40:42  ram
+# Baseline for first official release.
 #
 
 #