This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
lib/unicode relic.
[perl5.git] / ext / Storable / Storable.xs
1 /*
2  * Store and retrieve mechanism.
3  */
4
5 /*
6  * $Id: Storable.xs,v 1.0.1.10 2001/08/28 21:52:14 ram Exp $
7  *
8  *  Copyright (c) 1995-2000, Raphael Manfredi
9  *  
10  *  You may redistribute only under the same terms as Perl 5, as specified
11  *  in the README file that comes with the distribution.
12  *
13  * $Log: Storable.xs,v $
14  * Revision 1.0.1.10  2001/08/28 21:52:14  ram
15  * patch13: removed spurious debugging messages
16  *
17  * Revision 1.0.1.9  2001/07/01 11:25:02  ram
18  * patch12: fixed memory corruption on croaks during thaw()
19  * patch12: made code compile cleanly with -Wall (Jarkko Hietaniemi)
20  * patch12: changed tagnum and classnum from I32 to IV in context
21  *
22  * Revision 1.0.1.8  2001/03/15 00:20:55  ram
23  * patch11: last version was wrongly compiling with assertions on
24  *
25  * Revision 1.0.1.7  2001/02/17 12:25:26  ram
26  * patch8: now bless objects ASAP at retrieve time
27  * patch8: added support for blessed ref to tied structures
28  *
29  * Revision 1.0.1.6  2001/01/03 09:40:40  ram
30  * patch7: prototype and casting cleanup
31  * patch7: trace offending package when overloading cannot be restored
32  * patch7: made context cleanup safer to avoid dup freeing
33  *
34  * Revision 1.0.1.5  2000/11/05 17:21:24  ram
35  * patch6: fixed severe "object lost" bug for STORABLE_freeze returns
36  *
37  * Revision 1.0.1.4  2000/10/26 17:11:04  ram
38  * patch5: auto requires module of blessed ref when STORABLE_thaw misses
39  *
40  * Revision 1.0.1.3  2000/09/29 19:49:57  ram
41  * patch3: avoid using "tainted" and "dirty" since Perl remaps them via cpp
42  *
43  * Revision 1.0.1.2  2000/09/28 21:43:10  ram
44  * patch2: perls before 5.004_04 lack newSVpvn
45  *
46  * Revision 1.0.1.1  2000/09/17 16:47:49  ram
47  * patch1: now only taint retrieved data when source was tainted
48  * patch1: added support for UTF-8 strings
49  * patch1: fixed store hook bug: was allocating class id too soon
50  *
51  * Revision 1.0  2000/09/01 19:40:41  ram
52  * Baseline for first official release.
53  *
54  */
55
56 #include <EXTERN.h>
57 #include <perl.h>
58 #include <patchlevel.h>         /* Perl's one, needed since 5.6 */
59 #include <XSUB.h>
60
61 #if 0
62 #define DEBUGME /* Debug mode, turns assertions on as well */
63 #define DASSERT /* Assertion mode */
64 #endif
65
66 /*
67  * Pre PerlIO time when none of USE_PERLIO and PERLIO_IS_STDIO is defined
68  * Provide them with the necessary defines so they can build with pre-5.004.
69  */
70 #ifndef USE_PERLIO
71 #ifndef PERLIO_IS_STDIO
72 #define PerlIO FILE
73 #define PerlIO_getc(x) getc(x)
74 #define PerlIO_putc(f,x) putc(x,f)
75 #define PerlIO_read(x,y,z) fread(y,1,z,x)
76 #define PerlIO_write(x,y,z) fwrite(y,1,z,x)
77 #define PerlIO_stdoutf printf
78 #endif  /* PERLIO_IS_STDIO */
79 #endif  /* USE_PERLIO */
80
81 /*
82  * Earlier versions of perl might be used, we can't assume they have the latest!
83  */
84
85 #ifndef PERL_VERSION            /* For perls < 5.6 */
86 #define PERL_VERSION PATCHLEVEL
87 #ifndef newRV_noinc
88 #define newRV_noinc(sv)         ((Sv = newRV(sv)), --SvREFCNT(SvRV(Sv)), Sv)
89 #endif
90 #if (PATCHLEVEL <= 4)           /* Older perls (<= 5.004) lack PL_ namespace */
91 #define PL_sv_yes       sv_yes
92 #define PL_sv_no        sv_no
93 #define PL_sv_undef     sv_undef
94 #if (SUBVERSION <= 4)           /* 5.004_04 has been reported to lack newSVpvn */
95 #define newSVpvn newSVpv
96 #endif
97 #endif                                          /* PATCHLEVEL <= 4 */
98 #ifndef HvSHAREKEYS_off
99 #define HvSHAREKEYS_off(hv)     /* Ignore */
100 #endif
101 #ifndef AvFILLp                         /* Older perls (<=5.003) lack AvFILLp */
102 #define AvFILLp AvFILL
103 #endif
104 typedef double NV;                      /* Older perls lack the NV type */
105 #define IVdf            "ld"    /* Various printf formats for Perl types */
106 #define UVuf            "lu"
107 #define UVof            "lo"
108 #define UVxf            "lx"
109 #define INT2PTR(t,v) (t)(IV)(v)
110 #define PTR2UV(v)    (unsigned long)(v)
111 #endif                                          /* PERL_VERSION -- perls < 5.6 */
112
113 #ifndef NVef                            /* The following were not part of perl 5.6 */
114 #if defined(USE_LONG_DOUBLE) && \
115         defined(HAS_LONG_DOUBLE) && defined(PERL_PRIfldbl)
116 #define NVef            PERL_PRIeldbl
117 #define NVff            PERL_PRIfldbl
118 #define NVgf            PERL_PRIgldbl
119 #else
120 #define NVef            "e"
121 #define NVff            "f"
122 #define NVgf            "g"
123 #endif
124 #endif
125
126 #ifdef DEBUGME
127
128 #ifndef DASSERT
129 #define DASSERT
130 #endif
131
132 /*
133  * TRACEME() will only output things when the $Storable::DEBUGME is true.
134  */
135
136 #define TRACEME(x)      do {                                                                    \
137         if (SvTRUE(perl_get_sv("Storable::DEBUGME", TRUE)))     \
138                 { PerlIO_stdoutf x; PerlIO_stdoutf("\n"); }                     \
139 } while (0)
140 #else
141 #define TRACEME(x)
142 #endif  /* DEBUGME */
143
144 #ifdef DASSERT
145 #define ASSERT(x,y)     do {                                                                    \
146         if (!(x)) {                                                                                             \
147                 PerlIO_stdoutf("ASSERT FAILED (\"%s\", line %d): ",     \
148                         __FILE__, __LINE__);                                                    \
149                 PerlIO_stdoutf y; PerlIO_stdoutf("\n");                         \
150         }                                                                                                               \
151 } while (0)
152 #else
153 #define ASSERT(x,y)
154 #endif
155
156 /*
157  * Type markers.
158  */
159
160 #define C(x) ((char) (x))       /* For markers with dynamic retrieval handling */
161
162 #define SX_OBJECT       C(0)    /* Already stored object */
163 #define SX_LSCALAR      C(1)    /* Scalar (large binary) follows (length, data) */
164 #define SX_ARRAY        C(2)    /* Array forthcominng (size, item list) */
165 #define SX_HASH         C(3)    /* Hash forthcoming (size, key/value pair list) */
166 #define SX_REF          C(4)    /* Reference to object forthcoming */
167 #define SX_UNDEF        C(5)    /* Undefined scalar */
168 #define SX_INTEGER      C(6)    /* Integer forthcoming */
169 #define SX_DOUBLE       C(7)    /* Double forthcoming */
170 #define SX_BYTE         C(8)    /* (signed) byte forthcoming */
171 #define SX_NETINT       C(9)    /* Integer in network order forthcoming */
172 #define SX_SCALAR       C(10)   /* Scalar (binary, small) follows (length, data) */
173 #define SX_TIED_ARRAY  C(11)  /* Tied array forthcoming */
174 #define SX_TIED_HASH   C(12)  /* Tied hash forthcoming */
175 #define SX_TIED_SCALAR C(13)  /* Tied scalar forthcoming */
176 #define SX_SV_UNDEF     C(14)   /* Perl's immortal PL_sv_undef */
177 #define SX_SV_YES       C(15)   /* Perl's immortal PL_sv_yes */
178 #define SX_SV_NO        C(16)   /* Perl's immortal PL_sv_no */
179 #define SX_BLESS        C(17)   /* Object is blessed */
180 #define SX_IX_BLESS     C(18)   /* Object is blessed, classname given by index */
181 #define SX_HOOK         C(19)   /* Stored via hook, user-defined */
182 #define SX_OVERLOAD     C(20)   /* Overloaded reference */
183 #define SX_TIED_KEY C(21)   /* Tied magic key forthcoming */
184 #define SX_TIED_IDX C(22)   /* Tied magic index forthcoming */
185 #define SX_UTF8STR      C(23)   /* UTF-8 string forthcoming (small) */
186 #define SX_LUTF8STR     C(24)   /* UTF-8 string forthcoming (large) */
187 #define SX_ERROR        C(25)   /* Error */
188
189 /*
190  * Those are only used to retrieve "old" pre-0.6 binary images.
191  */
192 #define SX_ITEM         'i'             /* An array item introducer */
193 #define SX_IT_UNDEF     'I'             /* Undefined array item */
194 #define SX_KEY          'k'             /* An hash key introducer */
195 #define SX_VALUE        'v'             /* An hash value introducer */
196 #define SX_VL_UNDEF     'V'             /* Undefined hash value */
197
198 /*
199  * Those are only used to retrieve "old" pre-0.7 binary images
200  */
201
202 #define SX_CLASS        'b'             /* Object is blessed, class name length <255 */
203 #define SX_LG_CLASS 'B'         /* Object is blessed, class name length >255 */
204 #define SX_STORED       'X'             /* End of object */
205
206 /*
207  * Limits between short/long length representation.
208  */
209
210 #define LG_SCALAR       255             /* Large scalar length limit */
211 #define LG_BLESS        127             /* Large classname bless limit */
212
213 /*
214  * Operation types
215  */
216
217 #define ST_STORE        0x1             /* Store operation */
218 #define ST_RETRIEVE     0x2             /* Retrieval operation */
219 #define ST_CLONE        0x4             /* Deep cloning operation */
220
221 /*
222  * The following structure is used for hash table key retrieval. Since, when
223  * retrieving objects, we'll be facing blessed hash references, it's best
224  * to pre-allocate that buffer once and resize it as the need arises, never
225  * freeing it (keys will be saved away someplace else anyway, so even large
226  * keys are not enough a motivation to reclaim that space).
227  *
228  * This structure is also used for memory store/retrieve operations which
229  * happen in a fixed place before being malloc'ed elsewhere if persistency
230  * is required. Hence the aptr pointer.
231  */
232 struct extendable {
233         char *arena;            /* Will hold hash key strings, resized as needed */
234         STRLEN asiz;            /* Size of aforementionned buffer */
235         char *aptr;                     /* Arena pointer, for in-place read/write ops */
236         char *aend;                     /* First invalid address */
237 };
238
239 /*
240  * At store time:
241  * An hash table records the objects which have already been stored.
242  * Those are referred to as SX_OBJECT in the file, and their "tag" (i.e.
243  * an arbitrary sequence number) is used to identify them.
244  *
245  * At retrieve time:
246  * An array table records the objects which have already been retrieved,
247  * as seen by the tag determind by counting the objects themselves. The
248  * reference to that retrieved object is kept in the table, and is returned
249  * when an SX_OBJECT is found bearing that same tag.
250  *
251  * The same processing is used to record "classname" for blessed objects:
252  * indexing by a hash at store time, and via an array at retrieve time.
253  */
254
255 typedef unsigned long stag_t;   /* Used by pre-0.6 binary format */
256
257 /*
258  * The following "thread-safe" related defines were contributed by
259  * Murray Nesbitt <murray@activestate.com> and integrated by RAM, who
260  * only renamed things a little bit to ensure consistency with surrounding
261  * code.        -- RAM, 14/09/1999
262  *
263  * The original patch suffered from the fact that the stcxt_t structure
264  * was global.  Murray tried to minimize the impact on the code as much as
265  * possible.
266  *
267  * Starting with 0.7, Storable can be re-entrant, via the STORABLE_xxx hooks
268  * on objects.  Therefore, the notion of context needs to be generalized,
269  * threading or not.
270  */
271
272 #define MY_VERSION "Storable(" XS_VERSION ")"
273
274 /*
275  * Fields s_tainted and s_dirty are prefixed with s_ because Perl's include
276  * files remap tainted and dirty when threading is enabled.  That's bad for
277  * perl to remap such common words.     -- RAM, 29/09/00
278  */
279
280 typedef struct stcxt {
281         int entry;                      /* flags recursion */
282         int optype;                     /* type of traversal operation */
283         HV *hseen;                      /* which objects have been seen, store time */
284         AV *hook_seen;          /* which SVs were returned by STORABLE_freeze() */
285         AV *aseen;                      /* which objects have been seen, retrieve time */
286         HV *hclass;                     /* which classnames have been seen, store time */
287         AV *aclass;                     /* which classnames have been seen, retrieve time */
288         HV *hook;                       /* cache for hook methods per class name */
289         IV tagnum;                      /* incremented at store time for each seen object */
290         IV classnum;            /* incremented at store time for each seen classname */
291         int netorder;           /* true if network order used */
292         int s_tainted;          /* true if input source is tainted, at retrieve time */
293         int forgive_me;         /* whether to be forgiving... */
294         int canonical;          /* whether to store hashes sorted by key */
295         int s_dirty;            /* context is dirty due to CROAK() -- can be cleaned */
296         int membuf_ro;          /* true means membuf is read-only and msaved is rw */
297         struct extendable keybuf;       /* for hash key retrieval */
298         struct extendable membuf;       /* for memory store/retrieve operations */
299         struct extendable msaved;       /* where potentially valid mbuf is saved */
300         PerlIO *fio;            /* where I/O are performed, NULL for memory */
301         int ver_major;          /* major of version for retrieved object */
302         int ver_minor;          /* minor of version for retrieved object */
303         SV *(**retrieve_vtbl)();        /* retrieve dispatch table */
304         struct stcxt *prev;     /* contexts chained backwards in real recursion */
305 } stcxt_t;
306
307 #if defined(MULTIPLICITY) || defined(PERL_OBJECT) || defined(PERL_CAPI)
308
309 #if (PATCHLEVEL <= 4) && (SUBVERSION < 68)
310 #define dSTCXT_SV                                                                       \
311         SV *perinterp_sv = perl_get_sv(MY_VERSION, FALSE)
312 #else   /* >= perl5.004_68 */
313 #define dSTCXT_SV                                                                       \
314         SV *perinterp_sv = *hv_fetch(PL_modglobal,              \
315                 MY_VERSION, sizeof(MY_VERSION)-1, TRUE)
316 #endif  /* < perl5.004_68 */
317
318 #define dSTCXT_PTR(T,name)                                                      \
319         T name = (perinterp_sv && SvIOK(perinterp_sv)   \
320                                 ? INT2PTR(T, SvIVX(perinterp_sv)) : (T) 0)
321 #define dSTCXT                                                                          \
322         dSTCXT_SV;                                                                              \
323         dSTCXT_PTR(stcxt_t *, cxt)
324
325 #define INIT_STCXT                                                                      \
326       dSTCXT;                                                                           \
327       Newz(0, cxt, 1, stcxt_t);                                         \
328       sv_setiv(perinterp_sv, PTR2IV(cxt))
329
330 #define SET_STCXT(x) do {                                                       \
331         dSTCXT_SV;                                                                              \
332         sv_setiv(perinterp_sv, PTR2IV(x));                              \
333 } while (0)
334
335 #else /* !MULTIPLICITY && !PERL_OBJECT && !PERL_CAPI */
336
337 static stcxt_t Context;
338 static stcxt_t *Context_ptr = &Context;
339 #define dSTCXT                  stcxt_t *cxt = Context_ptr
340 #define INIT_STCXT              dSTCXT
341 #define SET_STCXT(x)    Context_ptr = x
342
343 #endif /* MULTIPLICITY || PERL_OBJECT || PERL_CAPI */
344
345 /*
346  * KNOWN BUG:
347  *   Croaking implies a memory leak, since we don't use setjmp/longjmp
348  *   to catch the exit and free memory used during store or retrieve
349  *   operations.  This is not too difficult to fix, but I need to understand
350  *   how Perl does it, and croaking is exceptional anyway, so I lack the
351  *   motivation to do it.
352  *
353  * The current workaround is to mark the context as dirty when croaking,
354  * so that data structures can be freed whenever we renter Storable code
355  * (but only *then*: it's a workaround, not a fix).
356  *
357  * This is also imperfect, because we don't really know how far they trapped
358  * the croak(), and when we were recursing, we won't be able to clean anything
359  * but the topmost context stacked.
360  */
361
362 #define CROAK(x)        do { cxt->s_dirty = 1; croak x; } while (0)
363
364 /*
365  * End of "thread-safe" related definitions.
366  */
367
368 /*
369  * LOW_32BITS
370  *
371  * Keep only the low 32 bits of a pointer (used for tags, which are not
372  * really pointers).
373  */
374
375 #if PTRSIZE <= 4
376 #define LOW_32BITS(x)   ((I32) (x))
377 #else
378 #define LOW_32BITS(x)   ((I32) ((unsigned long) (x) & 0xffffffffUL))
379 #endif
380
381 /*
382  * oI, oS, oC
383  *
384  * Hack for Crays, where sizeof(I32) == 8, and which are big-endians.
385  * Used in the WLEN and RLEN macros.
386  */
387
388 #if INTSIZE > 4
389 #define oI(x)   ((I32 *) ((char *) (x) + 4))
390 #define oS(x)   ((x) - 4)
391 #define oC(x)   (x = 0)
392 #define CRAY_HACK
393 #else
394 #define oI(x)   (x)
395 #define oS(x)   (x)
396 #define oC(x)
397 #endif
398
399 /*
400  * key buffer handling
401  */
402 #define kbuf    (cxt->keybuf).arena
403 #define ksiz    (cxt->keybuf).asiz
404 #define KBUFINIT() do {                                 \
405         if (!kbuf) {                                            \
406                 TRACEME(("** allocating kbuf of 128 bytes")); \
407                 New(10003, kbuf, 128, char);    \
408                 ksiz = 128;                                             \
409         }                                                                       \
410 } while (0)
411 #define KBUFCHK(x) do {                 \
412         if (x >= ksiz) {                        \
413                 TRACEME(("** extending kbuf to %d bytes (had %d)", x+1, ksiz)); \
414                 Renew(kbuf, x+1, char); \
415                 ksiz = x+1;                             \
416         }                                                       \
417 } while (0)
418
419 /*
420  * memory buffer handling
421  */
422 #define mbase   (cxt->membuf).arena
423 #define msiz    (cxt->membuf).asiz
424 #define mptr    (cxt->membuf).aptr
425 #define mend    (cxt->membuf).aend
426
427 #define MGROW   (1 << 13)
428 #define MMASK   (MGROW - 1)
429
430 #define round_mgrow(x)  \
431         ((unsigned long) (((unsigned long) (x) + MMASK) & ~MMASK))
432 #define trunc_int(x)    \
433         ((unsigned long) ((unsigned long) (x) & ~(sizeof(int)-1)))
434 #define int_aligned(x)  \
435         ((unsigned long) (x) == trunc_int(x))
436
437 #define MBUF_INIT(x) do {                               \
438         if (!mbase) {                                           \
439                 TRACEME(("** allocating mbase of %d bytes", MGROW)); \
440                 New(10003, mbase, MGROW, char); \
441                 msiz = MGROW;                                   \
442         }                                                                       \
443         mptr = mbase;                                           \
444         if (x)                                                          \
445                 mend = mbase + x;                               \
446         else                                                            \
447                 mend = mbase + msiz;                    \
448 } while (0)
449
450 #define MBUF_TRUNC(x)   mptr = mbase + x
451 #define MBUF_SIZE()             (mptr - mbase)
452
453 /*
454  * MBUF_SAVE_AND_LOAD
455  * MBUF_RESTORE
456  *
457  * Those macros are used in do_retrieve() to save the current memory
458  * buffer into cxt->msaved, before MBUF_LOAD() can be used to retrieve
459  * data from a string.
460  */
461 #define MBUF_SAVE_AND_LOAD(in) do {             \
462         ASSERT(!cxt->membuf_ro, ("mbase not already saved")); \
463         cxt->membuf_ro = 1;                                     \
464         TRACEME(("saving mbuf"));                       \
465         StructCopy(&cxt->membuf, &cxt->msaved, struct extendable); \
466         MBUF_LOAD(in);                                          \
467 } while (0)
468
469 #define MBUF_RESTORE() do {                             \
470         ASSERT(cxt->membuf_ro, ("mbase is read-only")); \
471         cxt->membuf_ro = 0;                                     \
472         TRACEME(("restoring mbuf"));            \
473         StructCopy(&cxt->msaved, &cxt->membuf, struct extendable); \
474 } while (0)
475
476 /*
477  * Use SvPOKp(), because SvPOK() fails on tainted scalars.
478  * See store_scalar() for other usage of this workaround.
479  */
480 #define MBUF_LOAD(v) do {                               \
481         ASSERT(cxt->membuf_ro, ("mbase is read-only")); \
482         if (!SvPOKp(v))                                         \
483                 CROAK(("Not a scalar string")); \
484         mptr = mbase = SvPV(v, msiz);           \
485         mend = mbase + msiz;                            \
486 } while (0)
487
488 #define MBUF_XTEND(x) do {                      \
489         int nsz = (int) round_mgrow((x)+msiz);  \
490         int offset = mptr - mbase;              \
491         ASSERT(!cxt->membuf_ro, ("mbase is not read-only")); \
492         TRACEME(("** extending mbase from %d to %d bytes (wants %d new)", \
493                 msiz, nsz, (x)));                       \
494         Renew(mbase, nsz, char);                \
495         msiz = nsz;                                             \
496         mptr = mbase + offset;                  \
497         mend = mbase + nsz;                             \
498 } while (0)
499
500 #define MBUF_CHK(x) do {                        \
501         if ((mptr + (x)) > mend)                \
502                 MBUF_XTEND(x);                          \
503 } while (0)
504
505 #define MBUF_GETC(x) do {                       \
506         if (mptr < mend)                                \
507                 x = (int) (unsigned char) *mptr++;      \
508         else                                                    \
509                 return (SV *) 0;                        \
510 } while (0)
511
512 #ifdef CRAY_HACK
513 #define MBUF_GETINT(x) do {                             \
514         oC(x);                                                          \
515         if ((mptr + 4) <= mend) {                       \
516                 memcpy(oI(&x), mptr, 4);                \
517                 mptr += 4;                                              \
518         } else                                                          \
519                 return (SV *) 0;                                \
520 } while (0)
521 #else
522 #define MBUF_GETINT(x) do {                             \
523         if ((mptr + sizeof(int)) <= mend) {     \
524                 if (int_aligned(mptr))                  \
525                         x = *(int *) mptr;                      \
526                 else                                                    \
527                         memcpy(&x, mptr, sizeof(int));  \
528                 mptr += sizeof(int);                    \
529         } else                                                          \
530                 return (SV *) 0;                                \
531 } while (0)
532 #endif
533
534 #define MBUF_READ(x,s) do {                     \
535         if ((mptr + (s)) <= mend) {             \
536                 memcpy(x, mptr, s);                     \
537                 mptr += s;                                      \
538         } else                                                  \
539                 return (SV *) 0;                        \
540 } while (0)
541
542 #define MBUF_SAFEREAD(x,s,z) do {       \
543         if ((mptr + (s)) <= mend) {             \
544                 memcpy(x, mptr, s);                     \
545                 mptr += s;                                      \
546         } else {                                                \
547                 sv_free(z);                                     \
548                 return (SV *) 0;                        \
549         }                                                               \
550 } while (0)
551
552 #define MBUF_PUTC(c) do {                       \
553         if (mptr < mend)                                \
554                 *mptr++ = (char) c;                     \
555         else {                                                  \
556                 MBUF_XTEND(1);                          \
557                 *mptr++ = (char) c;                     \
558         }                                                               \
559 } while (0)
560
561 #ifdef CRAY_HACK
562 #define MBUF_PUTINT(i) do {                     \
563         MBUF_CHK(4);                                    \
564         memcpy(mptr, oI(&i), 4);                \
565         mptr += 4;                                              \
566 } while (0)
567 #else
568 #define MBUF_PUTINT(i) do {                     \
569         MBUF_CHK(sizeof(int));                  \
570         if (int_aligned(mptr))                  \
571                 *(int *) mptr = i;                      \
572         else                                                    \
573                 memcpy(mptr, &i, sizeof(int));  \
574         mptr += sizeof(int);                    \
575 } while (0)
576 #endif
577
578 #define MBUF_WRITE(x,s) do {            \
579         MBUF_CHK(s);                                    \
580         memcpy(mptr, x, s);                             \
581         mptr += s;                                              \
582 } while (0)
583
584 /*
585  * Possible return values for sv_type().
586  */
587
588 #define svis_REF                0
589 #define svis_SCALAR             1
590 #define svis_ARRAY              2
591 #define svis_HASH               3
592 #define svis_TIED               4
593 #define svis_TIED_ITEM  5
594 #define svis_OTHER              6
595
596 /*
597  * Flags for SX_HOOK.
598  */
599
600 #define SHF_TYPE_MASK           0x03
601 #define SHF_LARGE_CLASSLEN      0x04
602 #define SHF_LARGE_STRLEN        0x08
603 #define SHF_LARGE_LISTLEN       0x10
604 #define SHF_IDX_CLASSNAME       0x20
605 #define SHF_NEED_RECURSE        0x40
606 #define SHF_HAS_LIST            0x80
607
608 /*
609  * Types for SX_HOOK (last 2 bits in flags).
610  */
611
612 #define SHT_SCALAR                      0
613 #define SHT_ARRAY                       1
614 #define SHT_HASH                        2
615 #define SHT_EXTRA                       3               /* Read extra byte for type */
616
617 /*
618  * The following are held in the "extra byte"...
619  */
620
621 #define SHT_TSCALAR                     4               /* 4 + 0 -- tied scalar */
622 #define SHT_TARRAY                      5               /* 4 + 1 -- tied array */
623 #define SHT_THASH                       6               /* 4 + 2 -- tied hash */
624
625 /*
626  * Before 0.6, the magic string was "perl-store" (binary version number 0).
627  *
628  * Since 0.6 introduced many binary incompatibilities, the magic string has
629  * been changed to "pst0" to allow an old image to be properly retrieved by
630  * a newer Storable, but ensure a newer image cannot be retrieved with an
631  * older version.
632  *
633  * At 0.7, objects are given the ability to serialize themselves, and the
634  * set of markers is extended, backward compatibility is not jeopardized,
635  * so the binary version number could have remained unchanged.  To correctly
636  * spot errors if a file making use of 0.7-specific extensions is given to
637  * 0.6 for retrieval, the binary version was moved to "2".  And I'm introducing
638  * a "minor" version, to better track this kind of evolution from now on.
639  * 
640  */
641 static char old_magicstr[] = "perl-store";      /* Magic number before 0.6 */
642 static char magicstr[] = "pst0";                        /* Used as a magic number */
643
644 #define STORABLE_BIN_MAJOR      2                               /* Binary major "version" */
645 #define STORABLE_BIN_MINOR      4                               /* Binary minor "version" */
646
647 /*
648  * Useful store shortcuts...
649  */
650
651 #define PUTMARK(x) do {                                         \
652         if (!cxt->fio)                                                  \
653                 MBUF_PUTC(x);                                           \
654         else if (PerlIO_putc(cxt->fio, x) == EOF)       \
655                 return -1;                                                      \
656 } while (0)
657
658 #define WRITE_I32(x)    do {                    \
659         ASSERT(sizeof(x) == sizeof(I32), ("writing an I32"));   \
660         if (!cxt->fio)                                          \
661                 MBUF_PUTINT(x);                                 \
662         else if (PerlIO_write(cxt->fio, oI(&x), oS(sizeof(x))) != oS(sizeof(x))) \
663                 return -1;                                      \
664         } while (0)
665
666 #ifdef HAS_HTONL
667 #define WLEN(x) do {                            \
668         if (cxt->netorder) {                    \
669                 int y = (int) htonl(x);         \
670                 if (!cxt->fio)                          \
671                         MBUF_PUTINT(y);                 \
672                 else if (PerlIO_write(cxt->fio,oI(&y),oS(sizeof(y))) != oS(sizeof(y))) \
673                         return -1;                              \
674         } else {                                                \
675                 if (!cxt->fio)                          \
676                         MBUF_PUTINT(x);                 \
677                 else if (PerlIO_write(cxt->fio,oI(&x),oS(sizeof(x))) != oS(sizeof(x))) \
678                         return -1;                              \
679         }                                                               \
680 } while (0)
681 #else
682 #define WLEN(x) WRITE_I32(x)
683 #endif
684
685 #define WRITE(x,y) do {                                         \
686         if (!cxt->fio)                                                  \
687                 MBUF_WRITE(x,y);                                        \
688         else if (PerlIO_write(cxt->fio, x, y) != y)     \
689                 return -1;                                                      \
690         } while (0)
691
692 #define STORE_PV_LEN(pv, len, small, large) do {        \
693         if (len <= LG_SCALAR) {                         \
694                 unsigned char clen = (unsigned char) len;       \
695                 PUTMARK(small);                                 \
696                 PUTMARK(clen);                                  \
697                 if (len)                                                \
698                         WRITE(pv, len);                         \
699         } else {                                                        \
700                 PUTMARK(large);                                 \
701                 WLEN(len);                                              \
702                 WRITE(pv, len);                                 \
703         }                                                                       \
704 } while (0)
705
706 #define STORE_SCALAR(pv, len)   STORE_PV_LEN(pv, len, SX_SCALAR, SX_LSCALAR)
707
708 /*
709  * Conditional UTF8 support.
710  * On non-UTF8 perls, UTF8 strings are returned as normal strings.
711  *
712  */
713 #ifdef SvUTF8_on
714 #define STORE_UTF8STR(pv, len)  STORE_PV_LEN(pv, len, SX_UTF8STR, SX_LUTF8STR)
715 #else
716 #define SvUTF8(sv) 0
717 #define STORE_UTF8STR(pv, len) CROAK(("panic: storing UTF8 in non-UTF8 perl"))
718 #define SvUTF8_on(sv) CROAK(("Cannot retrieve UTF8 data in non-UTF8 perl"))
719 #endif
720
721 /*
722  * Store undef in arrays and hashes without recursing through store().
723  */
724 #define STORE_UNDEF() do {                              \
725         cxt->tagnum++;                                          \
726         PUTMARK(SX_UNDEF);                                      \
727 } while (0)
728
729 /*
730  * Useful retrieve shortcuts...
731  */
732
733 #define GETCHAR() \
734         (cxt->fio ? PerlIO_getc(cxt->fio) : (mptr >= mend ? EOF : (int) *mptr++))
735
736 #define GETMARK(x) do {                                                 \
737         if (!cxt->fio)                                                          \
738                 MBUF_GETC(x);                                                   \
739         else if ((int) (x = PerlIO_getc(cxt->fio)) == EOF)      \
740                 return (SV *) 0;                                                \
741 } while (0)
742
743 #define READ_I32(x)     do {                            \
744         ASSERT(sizeof(x) == sizeof(I32), ("reading an I32"));   \
745         oC(x);                                                          \
746         if (!cxt->fio)                                          \
747                 MBUF_GETINT(x);                                 \
748         else if (PerlIO_read(cxt->fio, oI(&x), oS(sizeof(x))) != oS(sizeof(x))) \
749                 return (SV *) 0;                                \
750 } while (0)
751
752 #ifdef HAS_NTOHL
753 #define RLEN(x) do {                                    \
754         oC(x);                                                          \
755         if (!cxt->fio)                                          \
756                 MBUF_GETINT(x);                                 \
757         else if (PerlIO_read(cxt->fio, oI(&x), oS(sizeof(x))) != oS(sizeof(x))) \
758                 return (SV *) 0;                                \
759         if (cxt->netorder)                                      \
760                 x = (int) ntohl(x);                             \
761 } while (0)
762 #else
763 #define RLEN(x) READ_I32(x)
764 #endif
765
766 #define READ(x,y) do {                                          \
767         if (!cxt->fio)                                                  \
768                 MBUF_READ(x, y);                                        \
769         else if (PerlIO_read(cxt->fio, x, y) != y)      \
770                 return (SV *) 0;                                        \
771 } while (0)
772
773 #define SAFEREAD(x,y,z) do {                                    \
774         if (!cxt->fio)                                                          \
775                 MBUF_SAFEREAD(x,y,z);                                   \
776         else if (PerlIO_read(cxt->fio, x, y) != y)       {      \
777                 sv_free(z);                                                             \
778                 return (SV *) 0;                                                \
779         }                                                                                       \
780 } while (0)
781
782 /*
783  * This macro is used at retrieve time, to remember where object 'y', bearing a
784  * given tag 'tagnum', has been retrieved. Next time we see an SX_OBJECT marker,
785  * we'll therefore know where it has been retrieved and will be able to
786  * share the same reference, as in the original stored memory image.
787  *
788  * We also need to bless objects ASAP for hooks (which may compute "ref $x"
789  * on the objects given to STORABLE_thaw and expect that to be defined), and
790  * also for overloaded objects (for which we might not find the stash if the
791  * object is not blessed yet--this might occur for overloaded objects that
792  * refer to themselves indirectly: if we blessed upon return from a sub
793  * retrieve(), the SX_OBJECT marker we'd found could not have overloading
794  * restored on it because the underlying object would not be blessed yet!).
795  *
796  * To achieve that, the class name of the last retrieved object is passed down
797  * recursively, and the first SEEN() call for which the class name is not NULL
798  * will bless the object.
799  */
800 #define SEEN(y,c) do {                                          \
801         if (!y)                                                                 \
802                 return (SV *) 0;                                        \
803         if (av_store(cxt->aseen, cxt->tagnum++, SvREFCNT_inc(y)) == 0) \
804                 return (SV *) 0;                                        \
805         TRACEME(("aseen(#%d) = 0x%"UVxf" (refcnt=%d)", cxt->tagnum-1, \
806                  PTR2UV(y), SvREFCNT(y)-1));            \
807         if (c)                                                                  \
808                 BLESS((SV *) (y), c);                           \
809 } while (0)
810
811 /*
812  * Bless `s' in `p', via a temporary reference, required by sv_bless().
813  */
814 #define BLESS(s,p) do {                                 \
815         SV *ref;                                                                \
816         HV *stash;                                                              \
817         TRACEME(("blessing 0x%"UVxf" in %s", PTR2UV(s), (p))); \
818         stash = gv_stashpv((p), TRUE);                  \
819         ref = newRV_noinc(s);                                   \
820         (void) sv_bless(ref, stash);                    \
821         SvRV(ref) = 0;                                                  \
822         SvREFCNT_dec(ref);                                              \
823 } while (0)
824
825 static int store();
826 static SV *retrieve(stcxt_t *cxt, char *cname);
827
828 /*
829  * Dynamic dispatching table for SV store.
830  */
831
832 static int store_ref(stcxt_t *cxt, SV *sv);
833 static int store_scalar(stcxt_t *cxt, SV *sv);
834 static int store_array(stcxt_t *cxt, AV *av);
835 static int store_hash(stcxt_t *cxt, HV *hv);
836 static int store_tied(stcxt_t *cxt, SV *sv);
837 static int store_tied_item(stcxt_t *cxt, SV *sv);
838 static int store_other(stcxt_t *cxt, SV *sv);
839 static int store_blessed(stcxt_t *cxt, SV *sv, int type, HV *pkg);
840
841 static int (*sv_store[])(stcxt_t *cxt, SV *sv) = {
842         store_ref,                                                                              /* svis_REF */
843         store_scalar,                                                                   /* svis_SCALAR */
844         (int (*)(stcxt_t *cxt, SV *sv)) store_array,    /* svis_ARRAY */
845         (int (*)(stcxt_t *cxt, SV *sv)) store_hash,             /* svis_HASH */
846         store_tied,                                                                             /* svis_TIED */
847         store_tied_item,                                                                /* svis_TIED_ITEM */
848         store_other,                                                                    /* svis_OTHER */
849 };
850
851 #define SV_STORE(x)     (*sv_store[x])
852
853 /*
854  * Dynamic dispatching tables for SV retrieval.
855  */
856
857 static SV *retrieve_lscalar(stcxt_t *cxt, char *cname);
858 static SV *retrieve_lutf8str(stcxt_t *cxt, char *cname);
859 static SV *old_retrieve_array(stcxt_t *cxt, char *cname);
860 static SV *old_retrieve_hash(stcxt_t *cxt, char *cname);
861 static SV *retrieve_ref(stcxt_t *cxt, char *cname);
862 static SV *retrieve_undef(stcxt_t *cxt, char *cname);
863 static SV *retrieve_integer(stcxt_t *cxt, char *cname);
864 static SV *retrieve_double(stcxt_t *cxt, char *cname);
865 static SV *retrieve_byte(stcxt_t *cxt, char *cname);
866 static SV *retrieve_netint(stcxt_t *cxt, char *cname);
867 static SV *retrieve_scalar(stcxt_t *cxt, char *cname);
868 static SV *retrieve_utf8str(stcxt_t *cxt, char *cname);
869 static SV *retrieve_tied_array(stcxt_t *cxt, char *cname);
870 static SV *retrieve_tied_hash(stcxt_t *cxt, char *cname);
871 static SV *retrieve_tied_scalar(stcxt_t *cxt, char *cname);
872 static SV *retrieve_other(stcxt_t *cxt, char *cname);
873
874 static SV *(*sv_old_retrieve[])(stcxt_t *cxt, char *cname) = {
875         0,                      /* SX_OBJECT -- entry unused dynamically */
876         retrieve_lscalar,               /* SX_LSCALAR */
877         old_retrieve_array,             /* SX_ARRAY -- for pre-0.6 binaries */
878         old_retrieve_hash,              /* SX_HASH -- for pre-0.6 binaries */
879         retrieve_ref,                   /* SX_REF */
880         retrieve_undef,                 /* SX_UNDEF */
881         retrieve_integer,               /* SX_INTEGER */
882         retrieve_double,                /* SX_DOUBLE */
883         retrieve_byte,                  /* SX_BYTE */
884         retrieve_netint,                /* SX_NETINT */
885         retrieve_scalar,                /* SX_SCALAR */
886         retrieve_tied_array,    /* SX_ARRAY */
887         retrieve_tied_hash,             /* SX_HASH */
888         retrieve_tied_scalar,   /* SX_SCALAR */
889         retrieve_other,                 /* SX_SV_UNDEF not supported */
890         retrieve_other,                 /* SX_SV_YES not supported */
891         retrieve_other,                 /* SX_SV_NO not supported */
892         retrieve_other,                 /* SX_BLESS not supported */
893         retrieve_other,                 /* SX_IX_BLESS not supported */
894         retrieve_other,                 /* SX_HOOK not supported */
895         retrieve_other,                 /* SX_OVERLOADED not supported */
896         retrieve_other,                 /* SX_TIED_KEY not supported */
897         retrieve_other,                 /* SX_TIED_IDX not supported */
898         retrieve_other,                 /* SX_UTF8STR not supported */
899         retrieve_other,                 /* SX_LUTF8STR not supported */
900         retrieve_other,                 /* SX_ERROR */
901 };
902
903 static SV *retrieve_array(stcxt_t *cxt, char *cname);
904 static SV *retrieve_hash(stcxt_t *cxt, char *cname);
905 static SV *retrieve_sv_undef(stcxt_t *cxt, char *cname);
906 static SV *retrieve_sv_yes(stcxt_t *cxt, char *cname);
907 static SV *retrieve_sv_no(stcxt_t *cxt, char *cname);
908 static SV *retrieve_blessed(stcxt_t *cxt, char *cname);
909 static SV *retrieve_idx_blessed(stcxt_t *cxt, char *cname);
910 static SV *retrieve_hook(stcxt_t *cxt, char *cname);
911 static SV *retrieve_overloaded(stcxt_t *cxt, char *cname);
912 static SV *retrieve_tied_key(stcxt_t *cxt, char *cname);
913 static SV *retrieve_tied_idx(stcxt_t *cxt, char *cname);
914
915 static SV *(*sv_retrieve[])(stcxt_t *cxt, char *cname) = {
916         0,                      /* SX_OBJECT -- entry unused dynamically */
917         retrieve_lscalar,               /* SX_LSCALAR */
918         retrieve_array,                 /* SX_ARRAY */
919         retrieve_hash,                  /* SX_HASH */
920         retrieve_ref,                   /* SX_REF */
921         retrieve_undef,                 /* SX_UNDEF */
922         retrieve_integer,               /* SX_INTEGER */
923         retrieve_double,                /* SX_DOUBLE */
924         retrieve_byte,                  /* SX_BYTE */
925         retrieve_netint,                /* SX_NETINT */
926         retrieve_scalar,                /* SX_SCALAR */
927         retrieve_tied_array,    /* SX_ARRAY */
928         retrieve_tied_hash,             /* SX_HASH */
929         retrieve_tied_scalar,   /* SX_SCALAR */
930         retrieve_sv_undef,              /* SX_SV_UNDEF */
931         retrieve_sv_yes,                /* SX_SV_YES */
932         retrieve_sv_no,                 /* SX_SV_NO */
933         retrieve_blessed,               /* SX_BLESS */
934         retrieve_idx_blessed,   /* SX_IX_BLESS */
935         retrieve_hook,                  /* SX_HOOK */
936         retrieve_overloaded,    /* SX_OVERLOAD */
937         retrieve_tied_key,              /* SX_TIED_KEY */
938         retrieve_tied_idx,              /* SX_TIED_IDX */
939         retrieve_utf8str,               /* SX_UTF8STR  */
940         retrieve_lutf8str,              /* SX_LUTF8STR */
941         retrieve_other,                 /* SX_ERROR */
942 };
943
944 #define RETRIEVE(c,x) (*(c)->retrieve_vtbl[(x) >= SX_ERROR ? SX_ERROR : (x)])
945
946 static SV *mbuf2sv(void);
947
948 /***
949  *** Context management.
950  ***/
951
952 /*
953  * init_perinterp
954  *
955  * Called once per "thread" (interpreter) to initialize some global context.
956  */
957 static void init_perinterp(void)
958 {
959     INIT_STCXT;
960
961     cxt->netorder = 0;          /* true if network order used */
962     cxt->forgive_me = -1;       /* whether to be forgiving... */
963 }
964
965 /*
966  * reset_context
967  *
968  * Called at the end of every context cleaning, to perform common reset
969  * operations.
970  */
971 static void reset_context(stcxt_t *cxt)
972 {
973         cxt->entry = 0;
974         cxt->s_dirty = 0;
975         cxt->optype &= ~(ST_STORE|ST_RETRIEVE);         /* Leave ST_CLONE alone */
976 }
977
978 /*
979  * init_store_context
980  *
981  * Initialize a new store context for real recursion.
982  */
983 static void init_store_context(
984         stcxt_t *cxt,
985         PerlIO *f,
986         int optype,
987         int network_order)
988 {
989         TRACEME(("init_store_context"));
990
991         cxt->netorder = network_order;
992         cxt->forgive_me = -1;                   /* Fetched from perl if needed */
993         cxt->canonical = -1;                    /* Idem */
994         cxt->tagnum = -1;                               /* Reset tag numbers */
995         cxt->classnum = -1;                             /* Reset class numbers */
996         cxt->fio = f;                                   /* Where I/O are performed */
997         cxt->optype = optype;                   /* A store, or a deep clone */
998         cxt->entry = 1;                                 /* No recursion yet */
999
1000         /*
1001          * The `hseen' table is used to keep track of each SV stored and their
1002          * associated tag numbers is special. It is "abused" because the
1003          * values stored are not real SV, just integers cast to (SV *),
1004          * which explains the freeing below.
1005          *
1006          * It is also one possible bottlneck to achieve good storing speed,
1007          * so the "shared keys" optimization is turned off (unlikely to be
1008          * of any use here), and the hash table is "pre-extended". Together,
1009          * those optimizations increase the throughput by 12%.
1010          */
1011
1012         cxt->hseen = newHV();                   /* Table where seen objects are stored */
1013         HvSHAREKEYS_off(cxt->hseen);
1014
1015         /*
1016          * The following does not work well with perl5.004_04, and causes
1017          * a core dump later on, in a completely unrelated spot, which
1018          * makes me think there is a memory corruption going on.
1019          *
1020          * Calling hv_ksplit(hseen, HBUCKETS) instead of manually hacking
1021          * it below does not make any difference. It seems to work fine
1022          * with perl5.004_68 but given the probable nature of the bug,
1023          * that does not prove anything.
1024          *
1025          * It's a shame because increasing the amount of buckets raises
1026          * store() throughput by 5%, but until I figure this out, I can't
1027          * allow for this to go into production.
1028          *
1029          * It is reported fixed in 5.005, hence the #if.
1030          */
1031 #if PERL_VERSION >= 5
1032 #define HBUCKETS        4096                            /* Buckets for %hseen */
1033         HvMAX(cxt->hseen) = HBUCKETS - 1;       /* keys %hseen = $HBUCKETS; */
1034 #endif
1035
1036         /*
1037          * The `hclass' hash uses the same settings as `hseen' above, but it is
1038          * used to assign sequential tags (numbers) to class names for blessed
1039          * objects.
1040          *
1041          * We turn the shared key optimization on.
1042          */
1043
1044         cxt->hclass = newHV();                  /* Where seen classnames are stored */
1045
1046 #if PERL_VERSION >= 5
1047         HvMAX(cxt->hclass) = HBUCKETS - 1;      /* keys %hclass = $HBUCKETS; */
1048 #endif
1049
1050         /*
1051          * The `hook' hash table is used to keep track of the references on
1052          * the STORABLE_freeze hook routines, when found in some class name.
1053          *
1054          * It is assumed that the inheritance tree will not be changed during
1055          * storing, and that no new method will be dynamically created by the
1056          * hooks.
1057          */
1058
1059         cxt->hook = newHV();                    /* Table where hooks are cached */
1060
1061         /*
1062          * The `hook_seen' array keeps track of all the SVs returned by
1063          * STORABLE_freeze hooks for us to serialize, so that they are not
1064          * reclaimed until the end of the serialization process.  Each SV is
1065          * only stored once, the first time it is seen.
1066          */
1067
1068         cxt->hook_seen = newAV();               /* Lists SVs returned by STORABLE_freeze */
1069 }
1070
1071 /*
1072  * clean_store_context
1073  *
1074  * Clean store context by
1075  */
1076 static void clean_store_context(stcxt_t *cxt)
1077 {
1078         HE *he;
1079
1080         TRACEME(("clean_store_context"));
1081
1082         ASSERT(cxt->optype & ST_STORE, ("was performing a store()"));
1083
1084         /*
1085          * Insert real values into hashes where we stored faked pointers.
1086          */
1087
1088         if (cxt->hseen) {
1089                 hv_iterinit(cxt->hseen);
1090                 while ((he = hv_iternext(cxt->hseen)))  /* Extra () for -Wall, grr.. */
1091                         HeVAL(he) = &PL_sv_undef;
1092         }
1093
1094         if (cxt->hclass) {
1095                 hv_iterinit(cxt->hclass);
1096                 while ((he = hv_iternext(cxt->hclass))) /* Extra () for -Wall, grr.. */
1097                         HeVAL(he) = &PL_sv_undef;
1098         }
1099
1100         /*
1101          * And now dispose of them...
1102          *
1103          * The surrounding if() protection has been added because there might be
1104          * some cases where this routine is called more than once, during
1105          * exceptionnal events.  This was reported by Marc Lehmann when Storable
1106          * is executed from mod_perl, and the fix was suggested by him.
1107          *              -- RAM, 20/12/2000
1108          */
1109
1110         if (cxt->hseen) {
1111                 HV *hseen = cxt->hseen;
1112                 cxt->hseen = 0;
1113                 hv_undef(hseen);
1114                 sv_free((SV *) hseen);
1115         }
1116
1117         if (cxt->hclass) {
1118                 HV *hclass = cxt->hclass;
1119                 cxt->hclass = 0;
1120                 hv_undef(hclass);
1121                 sv_free((SV *) hclass);
1122         }
1123
1124         if (cxt->hook) {
1125                 HV *hook = cxt->hook;
1126                 cxt->hook = 0;
1127                 hv_undef(hook);
1128                 sv_free((SV *) hook);
1129         }
1130
1131         if (cxt->hook_seen) {
1132                 AV *hook_seen = cxt->hook_seen;
1133                 cxt->hook_seen = 0;
1134                 av_undef(hook_seen);
1135                 sv_free((SV *) hook_seen);
1136         }
1137
1138         reset_context(cxt);
1139 }
1140
1141 /*
1142  * init_retrieve_context
1143  *
1144  * Initialize a new retrieve context for real recursion.
1145  */
1146 static void init_retrieve_context(stcxt_t *cxt, int optype, int is_tainted)
1147 {
1148         TRACEME(("init_retrieve_context"));
1149
1150         /*
1151          * The hook hash table is used to keep track of the references on
1152          * the STORABLE_thaw hook routines, when found in some class name.
1153          *
1154          * It is assumed that the inheritance tree will not be changed during
1155          * storing, and that no new method will be dynamically created by the
1156          * hooks.
1157          */
1158
1159         cxt->hook  = newHV();                   /* Caches STORABLE_thaw */
1160
1161         /*
1162          * If retrieving an old binary version, the cxt->retrieve_vtbl variable
1163          * was set to sv_old_retrieve. We'll need a hash table to keep track of
1164          * the correspondance between the tags and the tag number used by the
1165          * new retrieve routines.
1166          */
1167
1168         cxt->hseen = (cxt->retrieve_vtbl == sv_old_retrieve) ? newHV() : 0;
1169
1170         cxt->aseen = newAV();                   /* Where retrieved objects are kept */
1171         cxt->aclass = newAV();                  /* Where seen classnames are kept */
1172         cxt->tagnum = 0;                                /* Have to count objects... */
1173         cxt->classnum = 0;                              /* ...and class names as well */
1174         cxt->optype = optype;
1175         cxt->s_tainted = is_tainted;
1176         cxt->entry = 1;                                 /* No recursion yet */
1177 }
1178
1179 /*
1180  * clean_retrieve_context
1181  *
1182  * Clean retrieve context by
1183  */
1184 static void clean_retrieve_context(stcxt_t *cxt)
1185 {
1186         TRACEME(("clean_retrieve_context"));
1187
1188         ASSERT(cxt->optype & ST_RETRIEVE, ("was performing a retrieve()"));
1189
1190         if (cxt->aseen) {
1191                 AV *aseen = cxt->aseen;
1192                 cxt->aseen = 0;
1193                 av_undef(aseen);
1194                 sv_free((SV *) aseen);
1195         }
1196
1197         if (cxt->aclass) {
1198                 AV *aclass = cxt->aclass;
1199                 cxt->aclass = 0;
1200                 av_undef(aclass);
1201                 sv_free((SV *) aclass);
1202         }
1203
1204         if (cxt->hook) {
1205                 HV *hook = cxt->hook;
1206                 cxt->hook = 0;
1207                 hv_undef(hook);
1208                 sv_free((SV *) hook);
1209         }
1210
1211         if (cxt->hseen) {
1212                 HV *hseen = cxt->hseen;
1213                 cxt->hseen = 0;
1214                 hv_undef(hseen);
1215                 sv_free((SV *) hseen);          /* optional HV, for backward compat. */
1216         }
1217
1218         reset_context(cxt);
1219 }
1220
1221 /*
1222  * clean_context
1223  *
1224  * A workaround for the CROAK bug: cleanup the last context.
1225  */
1226 static void clean_context(stcxt_t *cxt)
1227 {
1228         TRACEME(("clean_context"));
1229
1230         ASSERT(cxt->s_dirty, ("dirty context"));
1231
1232         if (cxt->membuf_ro)
1233                 MBUF_RESTORE();
1234
1235         ASSERT(!cxt->membuf_ro, ("mbase is not read-only"));
1236
1237         if (cxt->optype & ST_RETRIEVE)
1238                 clean_retrieve_context(cxt);
1239         else if (cxt->optype & ST_STORE)
1240                 clean_store_context(cxt);
1241         else
1242                 reset_context(cxt);
1243
1244         ASSERT(!cxt->s_dirty, ("context is clean"));
1245         ASSERT(cxt->entry == 0, ("context is reset"));
1246 }
1247
1248 /*
1249  * allocate_context
1250  *
1251  * Allocate a new context and push it on top of the parent one.
1252  * This new context is made globally visible via SET_STCXT().
1253  */
1254 static stcxt_t *allocate_context(parent_cxt)
1255 stcxt_t *parent_cxt;
1256 {
1257         stcxt_t *cxt;
1258
1259         TRACEME(("allocate_context"));
1260
1261         ASSERT(!parent_cxt->s_dirty, ("parent context clean"));
1262
1263         Newz(0, cxt, 1, stcxt_t);
1264         cxt->prev = parent_cxt;
1265         SET_STCXT(cxt);
1266
1267         ASSERT(!cxt->s_dirty, ("clean context"));
1268
1269         return cxt;
1270 }
1271
1272 /*
1273  * free_context
1274  *
1275  * Free current context, which cannot be the "root" one.
1276  * Make the context underneath globally visible via SET_STCXT().
1277  */
1278 static void free_context(cxt)
1279 stcxt_t *cxt;
1280 {
1281         stcxt_t *prev = cxt->prev;
1282
1283         TRACEME(("free_context"));
1284
1285         ASSERT(!cxt->s_dirty, ("clean context"));
1286         ASSERT(prev, ("not freeing root context"));
1287
1288         if (kbuf)
1289                 Safefree(kbuf);
1290         if (mbase)
1291                 Safefree(mbase);
1292
1293         Safefree(cxt);
1294         SET_STCXT(prev);
1295
1296         ASSERT(cxt, ("context not void"));
1297 }
1298
1299 /***
1300  *** Predicates.
1301  ***/
1302
1303 /*
1304  * is_storing
1305  *
1306  * Tells whether we're in the middle of a store operation.
1307  */
1308 int is_storing(void)
1309 {
1310         dSTCXT;
1311
1312         return cxt->entry && (cxt->optype & ST_STORE);
1313 }
1314
1315 /*
1316  * is_retrieving
1317  *
1318  * Tells whether we're in the middle of a retrieve operation.
1319  */
1320 int is_retrieving(void)
1321 {
1322         dSTCXT;
1323
1324         return cxt->entry && (cxt->optype & ST_RETRIEVE);
1325 }
1326
1327 /*
1328  * last_op_in_netorder
1329  *
1330  * Returns whether last operation was made using network order.
1331  *
1332  * This is typically out-of-band information that might prove useful
1333  * to people wishing to convert native to network order data when used.
1334  */
1335 int last_op_in_netorder(void)
1336 {
1337         dSTCXT;
1338
1339         return cxt->netorder;
1340 }
1341
1342 /***
1343  *** Hook lookup and calling routines.
1344  ***/
1345
1346 /*
1347  * pkg_fetchmeth
1348  *
1349  * A wrapper on gv_fetchmethod_autoload() which caches results.
1350  *
1351  * Returns the routine reference as an SV*, or null if neither the package
1352  * nor its ancestors know about the method.
1353  */
1354 static SV *pkg_fetchmeth(
1355         HV *cache,
1356         HV *pkg,
1357         char *method)
1358 {
1359         GV *gv;
1360         SV *sv;
1361
1362         /*
1363          * The following code is the same as the one performed by UNIVERSAL::can
1364          * in the Perl core.
1365          */
1366
1367         gv = gv_fetchmethod_autoload(pkg, method, FALSE);
1368         if (gv && isGV(gv)) {
1369                 sv = newRV((SV*) GvCV(gv));
1370                 TRACEME(("%s->%s: 0x%"UVxf, HvNAME(pkg), method, PTR2UV(sv)));
1371         } else {
1372                 sv = newSVsv(&PL_sv_undef);
1373                 TRACEME(("%s->%s: not found", HvNAME(pkg), method));
1374         }
1375
1376         /*
1377          * Cache the result, ignoring failure: if we can't store the value,
1378          * it just won't be cached.
1379          */
1380
1381         (void) hv_store(cache, HvNAME(pkg), strlen(HvNAME(pkg)), sv, 0);
1382
1383         return SvOK(sv) ? sv : (SV *) 0;
1384 }
1385
1386 /*
1387  * pkg_hide
1388  *
1389  * Force cached value to be undef: hook ignored even if present.
1390  */
1391 static void pkg_hide(
1392         HV *cache,
1393         HV *pkg,
1394         char *method)
1395 {
1396         (void) hv_store(cache,
1397                 HvNAME(pkg), strlen(HvNAME(pkg)), newSVsv(&PL_sv_undef), 0);
1398 }
1399
1400 /*
1401  * pkg_uncache
1402  *
1403  * Discard cached value: a whole fetch loop will be retried at next lookup.
1404  */
1405 static void pkg_uncache(
1406         HV *cache,
1407         HV *pkg,
1408         char *method)
1409 {
1410         (void) hv_delete(cache, HvNAME(pkg), strlen(HvNAME(pkg)), G_DISCARD);
1411 }
1412
1413 /*
1414  * pkg_can
1415  *
1416  * Our own "UNIVERSAL::can", which caches results.
1417  *
1418  * Returns the routine reference as an SV*, or null if the object does not
1419  * know about the method.
1420  */
1421 static SV *pkg_can(
1422         HV *cache,
1423         HV *pkg,
1424         char *method)
1425 {
1426         SV **svh;
1427         SV *sv;
1428
1429         TRACEME(("pkg_can for %s->%s", HvNAME(pkg), method));
1430
1431         /*
1432          * Look into the cache to see whether we already have determined
1433          * where the routine was, if any.
1434          *
1435          * NOTA BENE: we don't use `method' at all in our lookup, since we know
1436          * that only one hook (i.e. always the same) is cached in a given cache.
1437          */
1438
1439         svh = hv_fetch(cache, HvNAME(pkg), strlen(HvNAME(pkg)), FALSE);
1440         if (svh) {
1441                 sv = *svh;
1442                 if (!SvOK(sv)) {
1443                         TRACEME(("cached %s->%s: not found", HvNAME(pkg), method));
1444                         return (SV *) 0;
1445                 } else {
1446                         TRACEME(("cached %s->%s: 0x%"UVxf,
1447                                 HvNAME(pkg), method, PTR2UV(sv)));
1448                         return sv;
1449                 }
1450         }
1451
1452         TRACEME(("not cached yet"));
1453         return pkg_fetchmeth(cache, pkg, method);               /* Fetch and cache */
1454 }
1455
1456 /*
1457  * scalar_call
1458  *
1459  * Call routine as obj->hook(av) in scalar context.
1460  * Propagates the single returned value if not called in void context.
1461  */
1462 static SV *scalar_call(
1463         SV *obj,
1464         SV *hook,
1465         int cloning,
1466         AV *av,
1467         I32 flags)
1468 {
1469         dSP;
1470         int count;
1471         SV *sv = 0;
1472
1473         TRACEME(("scalar_call (cloning=%d)", cloning));
1474
1475         ENTER;
1476         SAVETMPS;
1477
1478         PUSHMARK(sp);
1479         XPUSHs(obj);
1480         XPUSHs(sv_2mortal(newSViv(cloning)));           /* Cloning flag */
1481         if (av) {
1482                 SV **ary = AvARRAY(av);
1483                 int cnt = AvFILLp(av) + 1;
1484                 int i;
1485                 XPUSHs(ary[0]);                                                 /* Frozen string */
1486                 for (i = 1; i < cnt; i++) {
1487                         TRACEME(("pushing arg #%d (0x%"UVxf")...",
1488                                  i, PTR2UV(ary[i])));
1489                         XPUSHs(sv_2mortal(newRV(ary[i])));
1490                 }
1491         }
1492         PUTBACK;
1493
1494         TRACEME(("calling..."));
1495         count = perl_call_sv(hook, flags);              /* Go back to Perl code */
1496         TRACEME(("count = %d", count));
1497
1498         SPAGAIN;
1499
1500         if (count) {
1501                 sv = POPs;
1502                 SvREFCNT_inc(sv);               /* We're returning it, must stay alive! */
1503         }
1504
1505         PUTBACK;
1506         FREETMPS;
1507         LEAVE;
1508
1509         return sv;
1510 }
1511
1512 /*
1513  * array_call
1514  *
1515  * Call routine obj->hook(cloning) in list context.
1516  * Returns the list of returned values in an array.
1517  */
1518 static AV *array_call(
1519         SV *obj,
1520         SV *hook,
1521         int cloning)
1522 {
1523         dSP;
1524         int count;
1525         AV *av;
1526         int i;
1527
1528         TRACEME(("array_call (cloning=%d)", cloning));
1529
1530         ENTER;
1531         SAVETMPS;
1532
1533         PUSHMARK(sp);
1534         XPUSHs(obj);                                                            /* Target object */
1535         XPUSHs(sv_2mortal(newSViv(cloning)));           /* Cloning flag */
1536         PUTBACK;
1537
1538         count = perl_call_sv(hook, G_ARRAY);            /* Go back to Perl code */
1539
1540         SPAGAIN;
1541
1542         av = newAV();
1543         for (i = count - 1; i >= 0; i--) {
1544                 SV *sv = POPs;
1545                 av_store(av, i, SvREFCNT_inc(sv));
1546         }
1547
1548         PUTBACK;
1549         FREETMPS;
1550         LEAVE;
1551
1552         return av;
1553 }
1554
1555 /*
1556  * known_class
1557  *
1558  * Lookup the class name in the `hclass' table and either assign it a new ID
1559  * or return the existing one, by filling in `classnum'.
1560  *
1561  * Return true if the class was known, false if the ID was just generated.
1562  */
1563 static int known_class(
1564         stcxt_t *cxt,
1565         char *name,             /* Class name */
1566         int len,                /* Name length */
1567         I32 *classnum)
1568 {
1569         SV **svh;
1570         HV *hclass = cxt->hclass;
1571
1572         TRACEME(("known_class (%s)", name));
1573
1574         /*
1575          * Recall that we don't store pointers in this hash table, but tags.
1576          * Therefore, we need LOW_32BITS() to extract the relevant parts.
1577          */
1578
1579         svh = hv_fetch(hclass, name, len, FALSE);
1580         if (svh) {
1581                 *classnum = LOW_32BITS(*svh);
1582                 return TRUE;
1583         }
1584
1585         /*
1586          * Unknown classname, we need to record it.
1587          */
1588
1589         cxt->classnum++;
1590         if (!hv_store(hclass, name, len, INT2PTR(SV*, cxt->classnum), 0))
1591                 CROAK(("Unable to record new classname"));
1592
1593         *classnum = cxt->classnum;
1594         return FALSE;
1595 }
1596
1597 /***
1598  *** Sepcific store routines.
1599  ***/
1600
1601 /*
1602  * store_ref
1603  *
1604  * Store a reference.
1605  * Layout is SX_REF <object> or SX_OVERLOAD <object>.
1606  */
1607 static int store_ref(stcxt_t *cxt, SV *sv)
1608 {
1609         TRACEME(("store_ref (0x%"UVxf")", PTR2UV(sv)));
1610
1611         /*
1612          * Follow reference, and check if target is overloaded.
1613          */
1614
1615         sv = SvRV(sv);
1616
1617         if (SvOBJECT(sv)) {
1618                 HV *stash = (HV *) SvSTASH(sv);
1619                 if (stash && Gv_AMG(stash)) {
1620                         TRACEME(("ref (0x%"UVxf") is overloaded", PTR2UV(sv)));
1621                         PUTMARK(SX_OVERLOAD);
1622                 } else
1623                         PUTMARK(SX_REF);
1624         } else
1625                 PUTMARK(SX_REF);
1626
1627         return store(cxt, sv);
1628 }
1629
1630 /*
1631  * store_scalar
1632  *
1633  * Store a scalar.
1634  *
1635  * Layout is SX_LSCALAR <length> <data>, SX_SCALAR <lenght> <data> or SX_UNDEF.
1636  * The <data> section is omitted if <length> is 0.
1637  *
1638  * If integer or double, the layout is SX_INTEGER <data> or SX_DOUBLE <data>.
1639  * Small integers (within [-127, +127]) are stored as SX_BYTE <byte>.
1640  */
1641 static int store_scalar(stcxt_t *cxt, SV *sv)
1642 {
1643         IV iv;
1644         char *pv;
1645         STRLEN len;
1646         U32 flags = SvFLAGS(sv);                        /* "cc -O" may put it in register */
1647
1648         TRACEME(("store_scalar (0x%"UVxf")", PTR2UV(sv)));
1649
1650         /*
1651          * For efficiency, break the SV encapsulation by peaking at the flags
1652          * directly without using the Perl macros to avoid dereferencing
1653          * sv->sv_flags each time we wish to check the flags.
1654          */
1655
1656         if (!(flags & SVf_OK)) {                        /* !SvOK(sv) */
1657                 if (sv == &PL_sv_undef) {
1658                         TRACEME(("immortal undef"));
1659                         PUTMARK(SX_SV_UNDEF);
1660                 } else {
1661                         TRACEME(("undef at 0x%"UVxf, PTR2UV(sv)));
1662                         PUTMARK(SX_UNDEF);
1663                 }
1664                 return 0;
1665         }
1666
1667         /*
1668          * Always store the string representation of a scalar if it exists.
1669          * Gisle Aas provided me with this test case, better than a long speach:
1670          *
1671          *  perl -MDevel::Peek -le '$a="abc"; $a+0; Dump($a)'
1672          *  SV = PVNV(0x80c8520)
1673          *       REFCNT = 1
1674          *       FLAGS = (NOK,POK,pNOK,pPOK)
1675          *       IV = 0
1676          *       NV = 0
1677          *       PV = 0x80c83d0 "abc"\0
1678          *       CUR = 3
1679          *       LEN = 4
1680          *
1681          * Write SX_SCALAR, length, followed by the actual data.
1682          *
1683          * Otherwise, write an SX_BYTE, SX_INTEGER or an SX_DOUBLE as
1684          * appropriate, followed by the actual (binary) data. A double
1685          * is written as a string if network order, for portability.
1686          *
1687          * NOTE: instead of using SvNOK(sv), we test for SvNOKp(sv).
1688          * The reason is that when the scalar value is tainted, the SvNOK(sv)
1689          * value is false.
1690          *
1691          * The test for a read-only scalar with both POK and NOK set is meant
1692          * to quickly detect &PL_sv_yes and &PL_sv_no without having to pay the
1693          * address comparison for each scalar we store.
1694          */
1695
1696 #define SV_MAYBE_IMMORTAL (SVf_READONLY|SVf_POK|SVf_NOK)
1697
1698         if ((flags & SV_MAYBE_IMMORTAL) == SV_MAYBE_IMMORTAL) {
1699                 if (sv == &PL_sv_yes) {
1700                         TRACEME(("immortal yes"));
1701                         PUTMARK(SX_SV_YES);
1702                 } else if (sv == &PL_sv_no) {
1703                         TRACEME(("immortal no"));
1704                         PUTMARK(SX_SV_NO);
1705                 } else {
1706                         pv = SvPV(sv, len);                     /* We know it's SvPOK */
1707                         goto string;                            /* Share code below */
1708                 }
1709         } else if (flags & SVp_POK) {           /* SvPOKp(sv) => string */
1710                 I32 wlen;                                               /* For 64-bit machines */
1711                 pv = SvPV(sv, len);
1712
1713                 /*
1714                  * Will come here from below with pv and len set if double & netorder,
1715                  * or from above if it was readonly, POK and NOK but neither &PL_sv_yes
1716                  * nor &PL_sv_no.
1717                  */
1718         string:
1719
1720                 wlen = (I32) len;                               /* WLEN via STORE_SCALAR expects I32 */
1721                 if (SvUTF8 (sv))
1722                         STORE_UTF8STR(pv, wlen);
1723                 else
1724                         STORE_SCALAR(pv, wlen);
1725                 TRACEME(("ok (scalar 0x%"UVxf" '%s', length = %"IVdf")",
1726                          PTR2UV(sv), SvPVX(sv), (IV)len));
1727
1728         } else if (flags & SVp_NOK) {           /* SvNOKp(sv) => double */
1729                 NV nv = SvNV(sv);
1730
1731                 /*
1732                  * Watch for number being an integer in disguise.
1733                  */
1734                 if (nv == (NV) (iv = I_V(nv))) {
1735                         TRACEME(("double %"NVff" is actually integer %"IVdf, nv, iv));
1736                         goto integer;           /* Share code below */
1737                 }
1738
1739                 if (cxt->netorder) {
1740                         TRACEME(("double %"NVff" stored as string", nv));
1741                         pv = SvPV(sv, len);
1742                         goto string;            /* Share code above */
1743                 }
1744
1745                 PUTMARK(SX_DOUBLE);
1746                 WRITE(&nv, sizeof(nv));
1747
1748                 TRACEME(("ok (double 0x%"UVxf", value = %"NVff")", PTR2UV(sv), nv));
1749
1750         } else if (flags & SVp_IOK) {           /* SvIOKp(sv) => integer */
1751                 iv = SvIV(sv);
1752
1753                 /*
1754                  * Will come here from above with iv set if double is an integer.
1755                  */
1756         integer:
1757
1758                 /*
1759                  * Optimize small integers into a single byte, otherwise store as
1760                  * a real integer (converted into network order if they asked).
1761                  */
1762
1763                 if (iv >= -128 && iv <= 127) {
1764                         unsigned char siv = (unsigned char) (iv + 128); /* [0,255] */
1765                         PUTMARK(SX_BYTE);
1766                         PUTMARK(siv);
1767                         TRACEME(("small integer stored as %d", siv));
1768                 } else if (cxt->netorder) {
1769                         I32 niv;
1770 #ifdef HAS_HTONL
1771                         niv = (I32) htonl(iv);
1772                         TRACEME(("using network order"));
1773 #else
1774                         niv = (I32) iv;
1775                         TRACEME(("as-is for network order"));
1776 #endif
1777                         PUTMARK(SX_NETINT);
1778                         WRITE_I32(niv);
1779                 } else {
1780                         PUTMARK(SX_INTEGER);
1781                         WRITE(&iv, sizeof(iv));
1782                 }
1783
1784                 TRACEME(("ok (integer 0x%"UVxf", value = %"IVdf")", PTR2UV(sv), iv));
1785
1786         } else
1787                 CROAK(("Can't determine type of %s(0x%"UVxf")",
1788                        sv_reftype(sv, FALSE),
1789                        PTR2UV(sv)));
1790
1791         return 0;               /* Ok, no recursion on scalars */
1792 }
1793
1794 /*
1795  * store_array
1796  *
1797  * Store an array.
1798  *
1799  * Layout is SX_ARRAY <size> followed by each item, in increading index order.
1800  * Each item is stored as <object>.
1801  */
1802 static int store_array(stcxt_t *cxt, AV *av)
1803 {
1804         SV **sav;
1805         I32 len = av_len(av) + 1;
1806         I32 i;
1807         int ret;
1808
1809         TRACEME(("store_array (0x%"UVxf")", PTR2UV(av)));
1810
1811         /* 
1812          * Signal array by emitting SX_ARRAY, followed by the array length.
1813          */
1814
1815         PUTMARK(SX_ARRAY);
1816         WLEN(len);
1817         TRACEME(("size = %d", len));
1818
1819         /*
1820          * Now store each item recursively.
1821          */
1822
1823         for (i = 0; i < len; i++) {
1824                 sav = av_fetch(av, i, 0);
1825                 if (!sav) {
1826                         TRACEME(("(#%d) undef item", i));
1827                         STORE_UNDEF();
1828                         continue;
1829                 }
1830                 TRACEME(("(#%d) item", i));
1831                 if ((ret = store(cxt, *sav)))   /* Extra () for -Wall, grr... */
1832                         return ret;
1833         }
1834
1835         TRACEME(("ok (array)"));
1836
1837         return 0;
1838 }
1839
1840 /*
1841  * sortcmp
1842  *
1843  * Sort two SVs
1844  * Borrowed from perl source file pp_ctl.c, where it is used by pp_sort.
1845  */
1846 static int
1847 sortcmp(const void *a, const void *b)
1848 {
1849         return sv_cmp(*(SV * const *) a, *(SV * const *) b);
1850 }
1851
1852
1853 /*
1854  * store_hash
1855  *
1856  * Store an hash table.
1857  *
1858  * Layout is SX_HASH <size> followed by each key/value pair, in random order.
1859  * Values are stored as <object>.
1860  * Keys are stored as <length> <data>, the <data> section being omitted
1861  * if length is 0.
1862  */
1863 static int store_hash(stcxt_t *cxt, HV *hv)
1864 {
1865         I32 len = HvKEYS(hv);
1866         I32 i;
1867         int ret = 0;
1868         I32 riter;
1869         HE *eiter;
1870
1871         TRACEME(("store_hash (0x%"UVxf")", PTR2UV(hv)));
1872
1873         /* 
1874          * Signal hash by emitting SX_HASH, followed by the table length.
1875          */
1876
1877         PUTMARK(SX_HASH);
1878         WLEN(len);
1879         TRACEME(("size = %d", len));
1880
1881         /*
1882          * Save possible iteration state via each() on that table.
1883          */
1884
1885         riter = HvRITER(hv);
1886         eiter = HvEITER(hv);
1887         hv_iterinit(hv);
1888
1889         /*
1890          * Now store each item recursively.
1891          *
1892      * If canonical is defined to some true value then store each
1893      * key/value pair in sorted order otherwise the order is random.
1894          * Canonical order is irrelevant when a deep clone operation is performed.
1895          *
1896          * Fetch the value from perl only once per store() operation, and only
1897          * when needed.
1898          */
1899
1900         if (
1901                 !(cxt->optype & ST_CLONE) && (cxt->canonical == 1 ||
1902                 (cxt->canonical < 0 && (cxt->canonical =
1903                         SvTRUE(perl_get_sv("Storable::canonical", TRUE)) ? 1 : 0)))
1904         ) {
1905                 /*
1906                  * Storing in order, sorted by key.
1907                  * Run through the hash, building up an array of keys in a
1908                  * mortal array, sort the array and then run through the
1909                  * array.  
1910                  */
1911
1912                 AV *av = newAV();
1913
1914                 TRACEME(("using canonical order"));
1915
1916                 for (i = 0; i < len; i++) {
1917                         HE *he = hv_iternext(hv);
1918                         SV *key = hv_iterkeysv(he);
1919                         av_store(av, AvFILLp(av)+1, key);       /* av_push(), really */
1920                 }
1921                         
1922                 qsort((char *) AvARRAY(av), len, sizeof(SV *), sortcmp);
1923
1924                 for (i = 0; i < len; i++) {
1925                         char *keyval;
1926                         I32 keylen;
1927                         SV *key = av_shift(av);
1928                         HE *he  = hv_fetch_ent(hv, key, 0, 0);
1929                         SV *val = HeVAL(he);
1930                         if (val == 0)
1931                                 return 1;               /* Internal error, not I/O error */
1932                         
1933                         /*
1934                          * Store value first.
1935                          */
1936                         
1937                         TRACEME(("(#%d) value 0x%"UVxf, i, PTR2UV(val)));
1938
1939                         if ((ret = store(cxt, val)))    /* Extra () for -Wall, grr... */
1940                                 goto out;
1941
1942                         /*
1943                          * Write key string.
1944                          * Keys are written after values to make sure retrieval
1945                          * can be optimal in terms of memory usage, where keys are
1946                          * read into a fixed unique buffer called kbuf.
1947                          * See retrieve_hash() for details.
1948                          */
1949                          
1950                         keyval = hv_iterkey(he, &keylen);
1951                         TRACEME(("(#%d) key '%s'", i, keyval));
1952                         WLEN(keylen);
1953                         if (keylen)
1954                                 WRITE(keyval, keylen);
1955                 }
1956
1957                 /* 
1958                  * Free up the temporary array
1959                  */
1960
1961                 av_undef(av);
1962                 sv_free((SV *) av);
1963
1964         } else {
1965
1966                 /*
1967                  * Storing in "random" order (in the order the keys are stored
1968                  * within the the hash).  This is the default and will be faster!
1969                  */
1970   
1971                 for (i = 0; i < len; i++) {
1972                         char *key;
1973                         I32 len;
1974                         SV *val = hv_iternextsv(hv, &key, &len);
1975
1976                         if (val == 0)
1977                                 return 1;               /* Internal error, not I/O error */
1978
1979                         /*
1980                          * Store value first.
1981                          */
1982
1983                         TRACEME(("(#%d) value 0x%"UVxf, i, PTR2UV(val)));
1984
1985                         if ((ret = store(cxt, val)))    /* Extra () for -Wall, grr... */
1986                                 goto out;
1987
1988                         /*
1989                          * Write key string.
1990                          * Keys are written after values to make sure retrieval
1991                          * can be optimal in terms of memory usage, where keys are
1992                          * read into a fixed unique buffer called kbuf.
1993                          * See retrieve_hash() for details.
1994                          */
1995
1996                         TRACEME(("(#%d) key '%s'", i, key));
1997                         WLEN(len);
1998                         if (len)
1999                                 WRITE(key, len);
2000                 }
2001     }
2002
2003         TRACEME(("ok (hash 0x%"UVxf")", PTR2UV(hv)));
2004
2005 out:
2006         HvRITER(hv) = riter;            /* Restore hash iterator state */
2007         HvEITER(hv) = eiter;
2008
2009         return ret;
2010 }
2011
2012 /*
2013  * store_tied
2014  *
2015  * When storing a tied object (be it a tied scalar, array or hash), we lay out
2016  * a special mark, followed by the underlying tied object. For instance, when
2017  * dealing with a tied hash, we store SX_TIED_HASH <hash object>, where
2018  * <hash object> stands for the serialization of the tied hash.
2019  */
2020 static int store_tied(stcxt_t *cxt, SV *sv)
2021 {
2022         MAGIC *mg;
2023         int ret = 0;
2024         int svt = SvTYPE(sv);
2025         char mtype = 'P';
2026
2027         TRACEME(("store_tied (0x%"UVxf")", PTR2UV(sv)));
2028
2029         /*
2030          * We have a small run-time penalty here because we chose to factorise
2031          * all tieds objects into the same routine, and not have a store_tied_hash,
2032          * a store_tied_array, etc...
2033          *
2034          * Don't use a switch() statement, as most compilers don't optimize that
2035          * well for 2/3 values. An if() else if() cascade is just fine. We put
2036          * tied hashes first, as they are the most likely beasts.
2037          */
2038
2039         if (svt == SVt_PVHV) {
2040                 TRACEME(("tied hash"));
2041                 PUTMARK(SX_TIED_HASH);                  /* Introduces tied hash */
2042         } else if (svt == SVt_PVAV) {
2043                 TRACEME(("tied array"));
2044                 PUTMARK(SX_TIED_ARRAY);                 /* Introduces tied array */
2045         } else {
2046                 TRACEME(("tied scalar"));
2047                 PUTMARK(SX_TIED_SCALAR);                /* Introduces tied scalar */
2048                 mtype = 'q';
2049         }
2050
2051         if (!(mg = mg_find(sv, mtype)))
2052                 CROAK(("No magic '%c' found while storing tied %s", mtype,
2053                         (svt == SVt_PVHV) ? "hash" :
2054                                 (svt == SVt_PVAV) ? "array" : "scalar"));
2055
2056         /*
2057          * The mg->mg_obj found by mg_find() above actually points to the
2058          * underlying tied Perl object implementation. For instance, if the
2059          * original SV was that of a tied array, then mg->mg_obj is an AV.
2060          *
2061          * Note that we store the Perl object as-is. We don't call its FETCH
2062          * method along the way. At retrieval time, we won't call its STORE
2063          * method either, but the tieing magic will be re-installed. In itself,
2064          * that ensures that the tieing semantics are preserved since futher
2065          * accesses on the retrieved object will indeed call the magic methods...
2066          */
2067
2068         if ((ret = store(cxt, mg->mg_obj)))             /* Extra () for -Wall, grr... */
2069                 return ret;
2070
2071         TRACEME(("ok (tied)"));
2072
2073         return 0;
2074 }
2075
2076 /*
2077  * store_tied_item
2078  *
2079  * Stores a reference to an item within a tied structure:
2080  *
2081  *  . \$h{key}, stores both the (tied %h) object and 'key'.
2082  *  . \$a[idx], stores both the (tied @a) object and 'idx'.
2083  *
2084  * Layout is therefore either:
2085  *     SX_TIED_KEY <object> <key>
2086  *     SX_TIED_IDX <object> <index>
2087  */
2088 static int store_tied_item(stcxt_t *cxt, SV *sv)
2089 {
2090         MAGIC *mg;
2091         int ret;
2092
2093         TRACEME(("store_tied_item (0x%"UVxf")", PTR2UV(sv)));
2094
2095         if (!(mg = mg_find(sv, 'p')))
2096                 CROAK(("No magic 'p' found while storing reference to tied item"));
2097
2098         /*
2099          * We discriminate between \$h{key} and \$a[idx] via mg_ptr.
2100          */
2101
2102         if (mg->mg_ptr) {
2103                 TRACEME(("store_tied_item: storing a ref to a tied hash item"));
2104                 PUTMARK(SX_TIED_KEY);
2105                 TRACEME(("store_tied_item: storing OBJ 0x%"UVxf, PTR2UV(mg->mg_obj)));
2106
2107                 if ((ret = store(cxt, mg->mg_obj)))             /* Extra () for -Wall, grr... */
2108                         return ret;
2109
2110                 TRACEME(("store_tied_item: storing PTR 0x%"UVxf, PTR2UV(mg->mg_ptr)));
2111
2112                 if ((ret = store(cxt, (SV *) mg->mg_ptr)))      /* Idem, for -Wall */
2113                         return ret;
2114         } else {
2115                 I32 idx = mg->mg_len;
2116
2117                 TRACEME(("store_tied_item: storing a ref to a tied array item "));
2118                 PUTMARK(SX_TIED_IDX);
2119                 TRACEME(("store_tied_item: storing OBJ 0x%"UVxf, PTR2UV(mg->mg_obj)));
2120
2121                 if ((ret = store(cxt, mg->mg_obj)))             /* Idem, for -Wall */
2122                         return ret;
2123
2124                 TRACEME(("store_tied_item: storing IDX %d", idx));
2125
2126                 WLEN(idx);
2127         }
2128
2129         TRACEME(("ok (tied item)"));
2130
2131         return 0;
2132 }
2133
2134 /*
2135  * store_hook           -- dispatched manually, not via sv_store[]
2136  *
2137  * The blessed SV is serialized by a hook.
2138  *
2139  * Simple Layout is:
2140  *
2141  *     SX_HOOK <flags> <len> <classname> <len2> <str> [<len3> <object-IDs>]
2142  *
2143  * where <flags> indicates how long <len>, <len2> and <len3> are, whether
2144  * the trailing part [] is present, the type of object (scalar, array or hash).
2145  * There is also a bit which says how the classname is stored between:
2146  *
2147  *     <len> <classname>
2148  *     <index>
2149  *
2150  * and when the <index> form is used (classname already seen), the "large
2151  * classname" bit in <flags> indicates how large the <index> is.
2152  * 
2153  * The serialized string returned by the hook is of length <len2> and comes
2154  * next.  It is an opaque string for us.
2155  *
2156  * Those <len3> object IDs which are listed last represent the extra references
2157  * not directly serialized by the hook, but which are linked to the object.
2158  *
2159  * When recursion is mandated to resolve object-IDs not yet seen, we have
2160  * instead, with <header> being flags with bits set to indicate the object type
2161  * and that recursion was indeed needed:
2162  *
2163  *     SX_HOOK <header> <object> <header> <object> <flags>
2164  *
2165  * that same header being repeated between serialized objects obtained through
2166  * recursion, until we reach flags indicating no recursion, at which point
2167  * we know we've resynchronized with a single layout, after <flags>.
2168  *
2169  * When storing a blessed ref to a tied variable, the following format is
2170  * used:
2171  *
2172  *     SX_HOOK <flags> <extra> ... [<len3> <object-IDs>] <magic object>
2173  *
2174  * The first <flags> indication carries an object of type SHT_EXTRA, and the
2175  * real object type is held in the <extra> flag.  At the very end of the
2176  * serialization stream, the underlying magic object is serialized, just like
2177  * any other tied variable.
2178  */
2179 static int store_hook(
2180         stcxt_t *cxt,
2181         SV *sv,
2182         int type,
2183         HV *pkg,
2184         SV *hook)
2185 {
2186         I32 len;
2187         char *class;
2188         STRLEN len2;
2189         SV *ref;
2190         AV *av;
2191         SV **ary;
2192         int count;                              /* really len3 + 1 */
2193         unsigned char flags;
2194         char *pv;
2195         int i;
2196         int recursed = 0;               /* counts recursion */
2197         int obj_type;                   /* object type, on 2 bits */
2198         I32 classnum;
2199         int ret;
2200         int clone = cxt->optype & ST_CLONE;
2201         char mtype = '\0';                              /* for blessed ref to tied structures */
2202         unsigned char eflags = '\0';    /* used when object type is SHT_EXTRA */
2203
2204         TRACEME(("store_hook, class \"%s\", tagged #%d", HvNAME(pkg), cxt->tagnum));
2205
2206         /*
2207          * Determine object type on 2 bits.
2208          */
2209
2210         switch (type) {
2211         case svis_SCALAR:
2212                 obj_type = SHT_SCALAR;
2213                 break;
2214         case svis_ARRAY:
2215                 obj_type = SHT_ARRAY;
2216                 break;
2217         case svis_HASH:
2218                 obj_type = SHT_HASH;
2219                 break;
2220         case svis_TIED:
2221                 /*
2222                  * Produced by a blessed ref to a tied data structure, $o in the
2223                  * following Perl code.
2224                  *
2225                  *      my %h;
2226                  *  tie %h, 'FOO';
2227                  *      my $o = bless \%h, 'BAR';
2228                  *
2229                  * Signal the tie-ing magic by setting the object type as SHT_EXTRA
2230                  * (since we have only 2 bits in <flags> to store the type), and an
2231                  * <extra> byte flag will be emitted after the FIRST <flags> in the
2232                  * stream, carrying what we put in `eflags'.
2233                  */
2234                 obj_type = SHT_EXTRA;
2235                 switch (SvTYPE(sv)) {
2236                 case SVt_PVHV:
2237                         eflags = (unsigned char) SHT_THASH;
2238                         mtype = 'P';
2239                         break;
2240                 case SVt_PVAV:
2241                         eflags = (unsigned char) SHT_TARRAY;
2242                         mtype = 'P';
2243                         break;
2244                 default:
2245                         eflags = (unsigned char) SHT_TSCALAR;
2246                         mtype = 'q';
2247                         break;
2248                 }
2249                 break;
2250         default:
2251                 CROAK(("Unexpected object type (%d) in store_hook()", type));
2252         }
2253         flags = SHF_NEED_RECURSE | obj_type;
2254
2255         class = HvNAME(pkg);
2256         len = strlen(class);
2257
2258         /*
2259          * To call the hook, we need to fake a call like:
2260          *
2261          *    $object->STORABLE_freeze($cloning);
2262          *
2263          * but we don't have the $object here.  For instance, if $object is
2264          * a blessed array, what we have in `sv' is the array, and we can't
2265          * call a method on those.
2266          *
2267          * Therefore, we need to create a temporary reference to the object and
2268          * make the call on that reference.
2269          */
2270
2271         TRACEME(("about to call STORABLE_freeze on class %s", class));
2272
2273         ref = newRV_noinc(sv);                          /* Temporary reference */
2274         av = array_call(ref, hook, clone);      /* @a = $object->STORABLE_freeze($c) */
2275         SvRV(ref) = 0;
2276         SvREFCNT_dec(ref);                                      /* Reclaim temporary reference */
2277
2278         count = AvFILLp(av) + 1;
2279         TRACEME(("store_hook, array holds %d items", count));
2280
2281         /*
2282          * If they return an empty list, it means they wish to ignore the
2283          * hook for this class (and not just this instance -- that's for them
2284          * to handle if they so wish).
2285          *
2286          * Simply disable the cached entry for the hook (it won't be recomputed
2287          * since it's present in the cache) and recurse to store_blessed().
2288          */
2289
2290         if (!count) {
2291                 /*
2292                  * They must not change their mind in the middle of a serialization.
2293                  */
2294
2295                 if (hv_fetch(cxt->hclass, class, len, FALSE))
2296                         CROAK(("Too late to ignore hooks for %s class \"%s\"",
2297                                 (cxt->optype & ST_CLONE) ? "cloning" : "storing", class));
2298         
2299                 pkg_hide(cxt->hook, pkg, "STORABLE_freeze");
2300
2301                 ASSERT(!pkg_can(cxt->hook, pkg, "STORABLE_freeze"), ("hook invisible"));
2302                 TRACEME(("ignoring STORABLE_freeze in class \"%s\"", class));
2303
2304                 return store_blessed(cxt, sv, type, pkg);
2305         }
2306
2307         /*
2308          * Get frozen string.
2309          */
2310
2311         ary = AvARRAY(av);
2312         pv = SvPV(ary[0], len2);
2313
2314         /*
2315          * If they returned more than one item, we need to serialize some
2316          * extra references if not already done.
2317          *
2318          * Loop over the array, starting at postion #1, and for each item,
2319          * ensure it is a reference, serialize it if not already done, and
2320          * replace the entry with the tag ID of the corresponding serialized
2321          * object.
2322          *
2323          * We CHEAT by not calling av_fetch() and read directly within the
2324          * array, for speed.
2325          */
2326
2327         for (i = 1; i < count; i++) {
2328                 SV **svh;
2329                 SV *rsv = ary[i];
2330                 SV *xsv;
2331                 AV *av_hook = cxt->hook_seen;
2332
2333                 if (!SvROK(rsv))
2334                         CROAK(("Item #%d returned by STORABLE_freeze "
2335                                 "for %s is not a reference", i, class));
2336                 xsv = SvRV(rsv);                /* Follow ref to know what to look for */
2337
2338                 /*
2339                  * Look in hseen and see if we have a tag already.
2340                  * Serialize entry if not done already, and get its tag.
2341                  */
2342
2343                 if ((svh = hv_fetch(cxt->hseen, (char *) &xsv, sizeof(xsv), FALSE)))
2344                         goto sv_seen;           /* Avoid moving code too far to the right */
2345
2346                 TRACEME(("listed object %d at 0x%"UVxf" is unknown", i-1, PTR2UV(xsv)));
2347
2348                 /*
2349                  * We need to recurse to store that object and get it to be known
2350                  * so that we can resolve the list of object-IDs at retrieve time.
2351                  *
2352                  * The first time we do this, we need to emit the proper header
2353                  * indicating that we recursed, and what the type of object is (the
2354                  * object we're storing via a user-hook).  Indeed, during retrieval,
2355                  * we'll have to create the object before recursing to retrieve the
2356                  * others, in case those would point back at that object.
2357                  */
2358
2359                 /* [SX_HOOK] <flags> [<extra>] <object>*/
2360                 if (!recursed++) {
2361                         PUTMARK(SX_HOOK);
2362                         PUTMARK(flags);
2363                         if (obj_type == SHT_EXTRA)
2364                                 PUTMARK(eflags);
2365                 } else
2366                         PUTMARK(flags);
2367
2368                 if ((ret = store(cxt, xsv)))    /* Given by hook for us to store */
2369                         return ret;
2370
2371                 svh = hv_fetch(cxt->hseen, (char *) &xsv, sizeof(xsv), FALSE);
2372                 if (!svh)
2373                         CROAK(("Could not serialize item #%d from hook in %s", i, class));
2374
2375                 /*
2376                  * It was the first time we serialized `xsv'.
2377                  *
2378                  * Keep this SV alive until the end of the serialization: if we
2379                  * disposed of it right now by decrementing its refcount, and it was
2380                  * a temporary value, some next temporary value allocated during
2381                  * another STORABLE_freeze might take its place, and we'd wrongly
2382                  * assume that new SV was already serialized, based on its presence
2383                  * in cxt->hseen.
2384                  *
2385                  * Therefore, push it away in cxt->hook_seen.
2386                  */
2387
2388                 av_store(av_hook, AvFILLp(av_hook)+1, SvREFCNT_inc(xsv));
2389
2390         sv_seen:
2391                 /*
2392                  * Dispose of the REF they returned.  If we saved the `xsv' away
2393                  * in the array of returned SVs, that will not cause the underlying
2394                  * referenced SV to be reclaimed.
2395                  */
2396
2397                 ASSERT(SvREFCNT(xsv) > 1, ("SV will survive disposal of its REF"));
2398                 SvREFCNT_dec(rsv);                      /* Dispose of reference */
2399
2400                 /*
2401                  * Replace entry with its tag (not a real SV, so no refcnt increment)
2402                  */
2403
2404                 ary[i] = *svh;
2405                 TRACEME(("listed object %d at 0x%"UVxf" is tag #%"UVuf,
2406                          i-1, PTR2UV(xsv), PTR2UV(*svh)));
2407         }
2408
2409         /*
2410          * Allocate a class ID if not already done.
2411          *
2412          * This needs to be done after the recursion above, since at retrieval
2413          * time, we'll see the inner objects first.  Many thanks to
2414          * Salvador Ortiz Garcia <sog@msg.com.mx> who spot that bug and
2415          * proposed the right fix.  -- RAM, 15/09/2000
2416          */
2417
2418         if (!known_class(cxt, class, len, &classnum)) {
2419                 TRACEME(("first time we see class %s, ID = %d", class, classnum));
2420                 classnum = -1;                          /* Mark: we must store classname */
2421         } else {
2422                 TRACEME(("already seen class %s, ID = %d", class, classnum));
2423         }
2424
2425         /*
2426          * Compute leading flags.
2427          */
2428
2429         flags = obj_type;
2430         if (((classnum == -1) ? len : classnum) > LG_SCALAR)
2431                 flags |= SHF_LARGE_CLASSLEN;
2432         if (classnum != -1)
2433                 flags |= SHF_IDX_CLASSNAME;
2434         if (len2 > LG_SCALAR)
2435                 flags |= SHF_LARGE_STRLEN;
2436         if (count > 1)
2437                 flags |= SHF_HAS_LIST;
2438         if (count > (LG_SCALAR + 1))
2439                 flags |= SHF_LARGE_LISTLEN;
2440
2441         /* 
2442          * We're ready to emit either serialized form:
2443          *
2444          *   SX_HOOK <flags> <len> <classname> <len2> <str> [<len3> <object-IDs>]
2445          *   SX_HOOK <flags> <index>           <len2> <str> [<len3> <object-IDs>]
2446          *
2447          * If we recursed, the SX_HOOK has already been emitted.
2448          */
2449
2450         TRACEME(("SX_HOOK (recursed=%d) flags=0x%x "
2451                         "class=%"IVdf" len=%"IVdf" len2=%"IVdf" len3=%d",
2452                  recursed, flags, (IV)classnum, (IV)len, (IV)len2, count-1));
2453
2454         /* SX_HOOK <flags> [<extra>] */
2455         if (!recursed) {
2456                 PUTMARK(SX_HOOK);
2457                 PUTMARK(flags);
2458                 if (obj_type == SHT_EXTRA)
2459                         PUTMARK(eflags);
2460         } else
2461                 PUTMARK(flags);
2462
2463         /* <len> <classname> or <index> */
2464         if (flags & SHF_IDX_CLASSNAME) {
2465                 if (flags & SHF_LARGE_CLASSLEN)
2466                         WLEN(classnum);
2467                 else {
2468                         unsigned char cnum = (unsigned char) classnum;
2469                         PUTMARK(cnum);
2470                 }
2471         } else {
2472                 if (flags & SHF_LARGE_CLASSLEN)
2473                         WLEN(len);
2474                 else {
2475                         unsigned char clen = (unsigned char) len;
2476                         PUTMARK(clen);
2477                 }
2478                 WRITE(class, len);              /* Final \0 is omitted */
2479         }
2480
2481         /* <len2> <frozen-str> */
2482         if (flags & SHF_LARGE_STRLEN) {
2483                 I32 wlen2 = len2;               /* STRLEN might be 8 bytes */
2484                 WLEN(wlen2);                    /* Must write an I32 for 64-bit machines */
2485         } else {
2486                 unsigned char clen = (unsigned char) len2;
2487                 PUTMARK(clen);
2488         }
2489         if (len2)
2490                 WRITE(pv, len2);        /* Final \0 is omitted */
2491
2492         /* [<len3> <object-IDs>] */
2493         if (flags & SHF_HAS_LIST) {
2494                 int len3 = count - 1;
2495                 if (flags & SHF_LARGE_LISTLEN)
2496                         WLEN(len3);
2497                 else {
2498                         unsigned char clen = (unsigned char) len3;
2499                         PUTMARK(clen);
2500                 }
2501
2502                 /*
2503                  * NOTA BENE, for 64-bit machines: the ary[i] below does not yield a
2504                  * real pointer, rather a tag number, well under the 32-bit limit.
2505                  */
2506
2507                 for (i = 1; i < count; i++) {
2508                         I32 tagval = htonl(LOW_32BITS(ary[i]));
2509                         WRITE_I32(tagval);
2510                         TRACEME(("object %d, tag #%d", i-1, ntohl(tagval)));
2511                 }
2512         }
2513
2514         /*
2515          * Free the array.  We need extra care for indices after 0, since they
2516          * don't hold real SVs but integers cast.
2517          */
2518
2519         if (count > 1)
2520                 AvFILLp(av) = 0;        /* Cheat, nothing after 0 interests us */
2521         av_undef(av);
2522         sv_free((SV *) av);
2523
2524         /*
2525          * If object was tied, need to insert serialization of the magic object.
2526          */
2527
2528         if (obj_type == SHT_EXTRA) {
2529                 MAGIC *mg;
2530
2531                 if (!(mg = mg_find(sv, mtype))) {
2532                         int svt = SvTYPE(sv);
2533                         CROAK(("No magic '%c' found while storing ref to tied %s with hook",
2534                                 mtype, (svt == SVt_PVHV) ? "hash" :
2535                                         (svt == SVt_PVAV) ? "array" : "scalar"));
2536                 }
2537
2538                 TRACEME(("handling the magic object 0x%"UVxf" part of 0x%"UVxf,
2539                         PTR2UV(mg->mg_obj), PTR2UV(sv)));
2540
2541                 /*
2542                  * [<magic object>]
2543                  */
2544
2545                 if ((ret = store(cxt, mg->mg_obj)))     /* Extra () for -Wall, grr... */
2546                         return ret;
2547         }
2548
2549         return 0;
2550 }
2551
2552 /*
2553  * store_blessed        -- dispatched manually, not via sv_store[]
2554  *
2555  * Check whether there is a STORABLE_xxx hook defined in the class or in one
2556  * of its ancestors.  If there is, then redispatch to store_hook();
2557  *
2558  * Otherwise, the blessed SV is stored using the following layout:
2559  *
2560  *    SX_BLESS <flag> <len> <classname> <object>
2561  *
2562  * where <flag> indicates whether <len> is stored on 0 or 4 bytes, depending
2563  * on the high-order bit in flag: if 1, then length follows on 4 bytes.
2564  * Otherwise, the low order bits give the length, thereby giving a compact
2565  * representation for class names less than 127 chars long.
2566  *
2567  * Each <classname> seen is remembered and indexed, so that the next time
2568  * an object in the blessed in the same <classname> is stored, the following
2569  * will be emitted:
2570  *
2571  *    SX_IX_BLESS <flag> <index> <object>
2572  *
2573  * where <index> is the classname index, stored on 0 or 4 bytes depending
2574  * on the high-order bit in flag (same encoding as above for <len>).
2575  */
2576 static int store_blessed(
2577         stcxt_t *cxt,
2578         SV *sv,
2579         int type,
2580         HV *pkg)
2581 {
2582         SV *hook;
2583         I32 len;
2584         char *class;
2585         I32 classnum;
2586
2587         TRACEME(("store_blessed, type %d, class \"%s\"", type, HvNAME(pkg)));
2588
2589         /*
2590          * Look for a hook for this blessed SV and redirect to store_hook()
2591          * if needed.
2592          */
2593
2594         hook = pkg_can(cxt->hook, pkg, "STORABLE_freeze");
2595         if (hook)
2596                 return store_hook(cxt, sv, type, pkg, hook);
2597
2598         /*
2599          * This is a blessed SV without any serialization hook.
2600          */
2601
2602         class = HvNAME(pkg);
2603         len = strlen(class);
2604
2605         TRACEME(("blessed 0x%"UVxf" in %s, no hook: tagged #%d",
2606                  PTR2UV(sv), class, cxt->tagnum));
2607
2608         /*
2609          * Determine whether it is the first time we see that class name (in which
2610          * case it will be stored in the SX_BLESS form), or whether we already
2611          * saw that class name before (in which case the SX_IX_BLESS form will be
2612          * used).
2613          */
2614
2615         if (known_class(cxt, class, len, &classnum)) {
2616                 TRACEME(("already seen class %s, ID = %d", class, classnum));
2617                 PUTMARK(SX_IX_BLESS);
2618                 if (classnum <= LG_BLESS) {
2619                         unsigned char cnum = (unsigned char) classnum;
2620                         PUTMARK(cnum);
2621                 } else {
2622                         unsigned char flag = (unsigned char) 0x80;
2623                         PUTMARK(flag);
2624                         WLEN(classnum);
2625                 }
2626         } else {
2627                 TRACEME(("first time we see class %s, ID = %d", class, classnum));
2628                 PUTMARK(SX_BLESS);
2629                 if (len <= LG_BLESS) {
2630                         unsigned char clen = (unsigned char) len;
2631                         PUTMARK(clen);
2632                 } else {
2633                         unsigned char flag = (unsigned char) 0x80;
2634                         PUTMARK(flag);
2635                         WLEN(len);                                      /* Don't BER-encode, this should be rare */
2636                 }
2637                 WRITE(class, len);                              /* Final \0 is omitted */
2638         }
2639
2640         /*
2641          * Now emit the <object> part.
2642          */
2643
2644         return SV_STORE(type)(cxt, sv);
2645 }
2646
2647 /*
2648  * store_other
2649  *
2650  * We don't know how to store the item we reached, so return an error condition.
2651  * (it's probably a GLOB, some CODE reference, etc...)
2652  *
2653  * If they defined the `forgive_me' variable at the Perl level to some
2654  * true value, then don't croak, just warn, and store a placeholder string
2655  * instead.
2656  */
2657 static int store_other(stcxt_t *cxt, SV *sv)
2658 {
2659         I32 len;
2660         static char buf[80];
2661
2662         TRACEME(("store_other"));
2663
2664         /*
2665          * Fetch the value from perl only once per store() operation.
2666          */
2667
2668         if (
2669                 cxt->forgive_me == 0 ||
2670                 (cxt->forgive_me < 0 && !(cxt->forgive_me =
2671                         SvTRUE(perl_get_sv("Storable::forgive_me", TRUE)) ? 1 : 0))
2672         )
2673                 CROAK(("Can't store %s items", sv_reftype(sv, FALSE)));
2674
2675         warn("Can't store item %s(0x%"UVxf")",
2676                 sv_reftype(sv, FALSE), PTR2UV(sv));
2677
2678         /*
2679          * Store placeholder string as a scalar instead...
2680          */
2681
2682         (void) sprintf(buf, "You lost %s(0x%"UVxf")%c", sv_reftype(sv, FALSE),
2683                        PTR2UV(sv), (char) 0);
2684
2685         len = strlen(buf);
2686         STORE_SCALAR(buf, len);
2687         TRACEME(("ok (dummy \"%s\", length = %"IVdf")", buf, len));
2688
2689         return 0;
2690 }
2691
2692 /***
2693  *** Store driving routines
2694  ***/
2695
2696 /*
2697  * sv_type
2698  *
2699  * WARNING: partially duplicates Perl's sv_reftype for speed.
2700  *
2701  * Returns the type of the SV, identified by an integer. That integer
2702  * may then be used to index the dynamic routine dispatch table.
2703  */
2704 static int sv_type(SV *sv)
2705 {
2706         switch (SvTYPE(sv)) {
2707         case SVt_NULL:
2708         case SVt_IV:
2709         case SVt_NV:
2710                 /*
2711                  * No need to check for ROK, that can't be set here since there
2712                  * is no field capable of hodling the xrv_rv reference.
2713                  */
2714                 return svis_SCALAR;
2715         case SVt_PV:
2716         case SVt_RV:
2717         case SVt_PVIV:
2718         case SVt_PVNV:
2719                 /*
2720                  * Starting from SVt_PV, it is possible to have the ROK flag
2721                  * set, the pointer to the other SV being either stored in
2722                  * the xrv_rv (in the case of a pure SVt_RV), or as the
2723                  * xpv_pv field of an SVt_PV and its heirs.
2724                  *
2725                  * However, those SV cannot be magical or they would be an
2726                  * SVt_PVMG at least.
2727                  */
2728                 return SvROK(sv) ? svis_REF : svis_SCALAR;
2729         case SVt_PVMG:
2730         case SVt_PVLV:          /* Workaround for perl5.004_04 "LVALUE" bug */
2731                 if (SvRMAGICAL(sv) && (mg_find(sv, 'p')))
2732                         return svis_TIED_ITEM;
2733                 /* FALL THROUGH */
2734         case SVt_PVBM:
2735                 if (SvRMAGICAL(sv) && (mg_find(sv, 'q')))
2736                         return svis_TIED;
2737                 return SvROK(sv) ? svis_REF : svis_SCALAR;
2738         case SVt_PVAV:
2739                 if (SvRMAGICAL(sv) && (mg_find(sv, 'P')))
2740                         return svis_TIED;
2741                 return svis_ARRAY;
2742         case SVt_PVHV:
2743                 if (SvRMAGICAL(sv) && (mg_find(sv, 'P')))
2744                         return svis_TIED;
2745                 return svis_HASH;
2746         default:
2747                 break;
2748         }
2749
2750         return svis_OTHER;
2751 }
2752
2753 /*
2754  * store
2755  *
2756  * Recursively store objects pointed to by the sv to the specified file.
2757  *
2758  * Layout is <content> or SX_OBJECT <tagnum> if we reach an already stored
2759  * object (one for which storage has started -- it may not be over if we have
2760  * a self-referenced structure). This data set forms a stored <object>.
2761  */
2762 static int store(stcxt_t *cxt, SV *sv)
2763 {
2764         SV **svh;
2765         int ret;
2766         int type;
2767         HV *hseen = cxt->hseen;
2768
2769         TRACEME(("store (0x%"UVxf")", PTR2UV(sv)));
2770
2771         /*
2772          * If object has already been stored, do not duplicate data.
2773          * Simply emit the SX_OBJECT marker followed by its tag data.
2774          * The tag is always written in network order.
2775          *
2776          * NOTA BENE, for 64-bit machines: the "*svh" below does not yield a
2777          * real pointer, rather a tag number (watch the insertion code below).
2778          * That means it pobably safe to assume it is well under the 32-bit limit,
2779          * and makes the truncation safe.
2780          *              -- RAM, 14/09/1999
2781          */
2782
2783         svh = hv_fetch(hseen, (char *) &sv, sizeof(sv), FALSE);
2784         if (svh) {
2785                 I32 tagval = htonl(LOW_32BITS(*svh));
2786
2787                 TRACEME(("object 0x%"UVxf" seen as #%d", PTR2UV(sv), ntohl(tagval)));
2788
2789                 PUTMARK(SX_OBJECT);
2790                 WRITE_I32(tagval);
2791                 return 0;
2792         }
2793
2794         /*
2795          * Allocate a new tag and associate it with the address of the sv being
2796          * stored, before recursing...
2797          *
2798          * In order to avoid creating new SvIVs to hold the tagnum we just
2799          * cast the tagnum to a SV pointer and store that in the hash.  This
2800          * means that we must clean up the hash manually afterwards, but gives
2801          * us a 15% throughput increase.
2802          *
2803          */
2804
2805         cxt->tagnum++;
2806         if (!hv_store(hseen,
2807                         (char *) &sv, sizeof(sv), INT2PTR(SV*, cxt->tagnum), 0))
2808                 return -1;
2809
2810         /*
2811          * Store `sv' and everything beneath it, using appropriate routine.
2812          * Abort immediately if we get a non-zero status back.
2813          */
2814
2815         type = sv_type(sv);
2816
2817         TRACEME(("storing 0x%"UVxf" tag #%d, type %d...",
2818                  PTR2UV(sv), cxt->tagnum, type));
2819
2820         if (SvOBJECT(sv)) {
2821                 HV *pkg = SvSTASH(sv);
2822                 ret = store_blessed(cxt, sv, type, pkg);
2823         } else
2824                 ret = SV_STORE(type)(cxt, sv);
2825
2826         TRACEME(("%s (stored 0x%"UVxf", refcnt=%d, %s)",
2827                 ret ? "FAILED" : "ok", PTR2UV(sv),
2828                 SvREFCNT(sv), sv_reftype(sv, FALSE)));
2829
2830         return ret;
2831 }
2832
2833 /*
2834  * magic_write
2835  *
2836  * Write magic number and system information into the file.
2837  * Layout is <magic> <network> [<len> <byteorder> <sizeof int> <sizeof long>
2838  * <sizeof ptr>] where <len> is the length of the byteorder hexa string.
2839  * All size and lenghts are written as single characters here.
2840  *
2841  * Note that no byte ordering info is emitted when <network> is true, since
2842  * integers will be emitted in network order in that case.
2843  */
2844 static int magic_write(stcxt_t *cxt)
2845 {
2846         char buf[256];  /* Enough room for 256 hexa digits */
2847         unsigned char c;
2848         int use_network_order = cxt->netorder;
2849
2850         TRACEME(("magic_write on fd=%d", cxt->fio ? fileno(cxt->fio) : -1));
2851
2852         if (cxt->fio)
2853                 WRITE(magicstr, strlen(magicstr));      /* Don't write final \0 */
2854
2855         /*
2856          * Starting with 0.6, the "use_network_order" byte flag is also used to
2857          * indicate the version number of the binary image, encoded in the upper
2858          * bits. The bit 0 is always used to indicate network order.
2859          */
2860
2861         c = (unsigned char)
2862                 ((use_network_order ? 0x1 : 0x0) | (STORABLE_BIN_MAJOR << 1));
2863         PUTMARK(c);
2864
2865         /*
2866          * Starting with 0.7, a full byte is dedicated to the minor version of
2867          * the binary format, which is incremented only when new markers are
2868          * introduced, for instance, but when backward compatibility is preserved.
2869          */
2870
2871         PUTMARK((unsigned char) STORABLE_BIN_MINOR);
2872
2873         if (use_network_order)
2874                 return 0;                                               /* Don't bother with byte ordering */
2875
2876         sprintf(buf, "%lx", (unsigned long) BYTEORDER);
2877         c = (unsigned char) strlen(buf);
2878         PUTMARK(c);
2879         WRITE(buf, (unsigned int) c);           /* Don't write final \0 */
2880         PUTMARK((unsigned char) sizeof(int));
2881         PUTMARK((unsigned char) sizeof(long));
2882         PUTMARK((unsigned char) sizeof(char *));
2883         PUTMARK((unsigned char) sizeof(NV));
2884
2885         TRACEME(("ok (magic_write byteorder = 0x%lx [%d], I%d L%d P%d D%d)",
2886                  (unsigned long) BYTEORDER, (int) c,
2887                  (int) sizeof(int), (int) sizeof(long),
2888                  (int) sizeof(char *), (int) sizeof(NV)));
2889
2890         return 0;
2891 }
2892
2893 /*
2894  * do_store
2895  *
2896  * Common code for store operations.
2897  *
2898  * When memory store is requested (f = NULL) and a non null SV* is given in
2899  * `res', it is filled with a new SV created out of the memory buffer.
2900  *
2901  * It is required to provide a non-null `res' when the operation type is not
2902  * dclone() and store() is performed to memory.
2903  */
2904 static int do_store(
2905         PerlIO *f,
2906         SV *sv,
2907         int optype,
2908         int network_order,
2909         SV **res)
2910 {
2911         dSTCXT;
2912         int status;
2913
2914         ASSERT(!(f == 0 && !(optype & ST_CLONE)) || res,
2915                 ("must supply result SV pointer for real recursion to memory"));
2916
2917         TRACEME(("do_store (optype=%d, netorder=%d)",
2918                 optype, network_order));
2919
2920         optype |= ST_STORE;
2921
2922         /*
2923          * Workaround for CROAK leak: if they enter with a "dirty" context,
2924          * free up memory for them now.
2925          */
2926
2927         if (cxt->s_dirty)
2928                 clean_context(cxt);
2929
2930         /*
2931          * Now that STORABLE_xxx hooks exist, it is possible that they try to
2932          * re-enter store() via the hooks.  We need to stack contexts.
2933          */
2934
2935         if (cxt->entry)
2936                 cxt = allocate_context(cxt);
2937
2938         cxt->entry++;
2939
2940         ASSERT(cxt->entry == 1, ("starting new recursion"));
2941         ASSERT(!cxt->s_dirty, ("clean context"));
2942
2943         /*
2944          * Ensure sv is actually a reference. From perl, we called something
2945          * like:
2946          *       pstore(FILE, \@array);
2947          * so we must get the scalar value behing that reference.
2948          */
2949
2950         if (!SvROK(sv))
2951                 CROAK(("Not a reference"));
2952         sv = SvRV(sv);                  /* So follow it to know what to store */
2953
2954         /* 
2955          * If we're going to store to memory, reset the buffer.
2956          */
2957
2958         if (!f)
2959                 MBUF_INIT(0);
2960
2961         /*
2962          * Prepare context and emit headers.
2963          */
2964
2965         init_store_context(cxt, f, optype, network_order);
2966
2967         if (-1 == magic_write(cxt))             /* Emit magic and ILP info */
2968                 return 0;                                       /* Error */
2969
2970         /*
2971          * Recursively store object...
2972          */
2973
2974         ASSERT(is_storing(), ("within store operation"));
2975
2976         status = store(cxt, sv);                /* Just do it! */
2977
2978         /*
2979          * If they asked for a memory store and they provided an SV pointer,
2980          * make an SV string out of the buffer and fill their pointer.
2981          *
2982          * When asking for ST_REAL, it's MANDATORY for the caller to provide
2983          * an SV, since context cleanup might free the buffer if we did recurse.
2984          * (unless caller is dclone(), which is aware of that).
2985          */
2986
2987         if (!cxt->fio && res)
2988                 *res = mbuf2sv();
2989
2990         /*
2991          * Final cleanup.
2992          *
2993          * The "root" context is never freed, since it is meant to be always
2994          * handy for the common case where no recursion occurs at all (i.e.
2995          * we enter store() outside of any Storable code and leave it, period).
2996          * We know it's the "root" context because there's nothing stacked
2997          * underneath it.
2998          *
2999          * OPTIMIZATION:
3000          *
3001          * When deep cloning, we don't free the context: doing so would force
3002          * us to copy the data in the memory buffer.  Sicne we know we're
3003          * about to enter do_retrieve...
3004          */
3005
3006         clean_store_context(cxt);
3007         if (cxt->prev && !(cxt->optype & ST_CLONE))
3008                 free_context(cxt);
3009
3010         TRACEME(("do_store returns %d", status));
3011
3012         return status == 0;
3013 }
3014
3015 /*
3016  * pstore
3017  *
3018  * Store the transitive data closure of given object to disk.
3019  * Returns 0 on error, a true value otherwise.
3020  */
3021 int pstore(PerlIO *f, SV *sv)
3022 {
3023         TRACEME(("pstore"));
3024         return do_store(f, sv, 0, FALSE, (SV**) 0);
3025
3026 }
3027
3028 /*
3029  * net_pstore
3030  *
3031  * Same as pstore(), but network order is used for integers and doubles are
3032  * emitted as strings.
3033  */
3034 int net_pstore(PerlIO *f, SV *sv)
3035 {
3036         TRACEME(("net_pstore"));
3037         return do_store(f, sv, 0, TRUE, (SV**) 0);
3038 }
3039
3040 /***
3041  *** Memory stores.
3042  ***/
3043
3044 /*
3045  * mbuf2sv
3046  *
3047  * Build a new SV out of the content of the internal memory buffer.
3048  */
3049 static SV *mbuf2sv(void)
3050 {
3051         dSTCXT;
3052
3053         return newSVpv(mbase, MBUF_SIZE());
3054 }
3055
3056 /*
3057  * mstore
3058  *
3059  * Store the transitive data closure of given object to memory.
3060  * Returns undef on error, a scalar value containing the data otherwise.
3061  */
3062 SV *mstore(SV *sv)
3063 {
3064         SV *out;
3065
3066         TRACEME(("mstore"));
3067
3068         if (!do_store((PerlIO*) 0, sv, 0, FALSE, &out))
3069                 return &PL_sv_undef;
3070
3071         return out;
3072 }
3073
3074 /*
3075  * net_mstore
3076  *
3077  * Same as mstore(), but network order is used for integers and doubles are
3078  * emitted as strings.
3079  */
3080 SV *net_mstore(SV *sv)
3081 {
3082         SV *out;
3083
3084         TRACEME(("net_mstore"));
3085
3086         if (!do_store((PerlIO*) 0, sv, 0, TRUE, &out))
3087                 return &PL_sv_undef;
3088
3089         return out;
3090 }
3091
3092 /***
3093  *** Specific retrieve callbacks.
3094  ***/
3095
3096 /*
3097  * retrieve_other
3098  *
3099  * Return an error via croak, since it is not possible that we get here
3100  * under normal conditions, when facing a file produced via pstore().
3101  */
3102 static SV *retrieve_other(stcxt_t *cxt, char *cname)
3103 {
3104         if (
3105                 cxt->ver_major != STORABLE_BIN_MAJOR &&
3106                 cxt->ver_minor != STORABLE_BIN_MINOR
3107         ) {
3108                 CROAK(("Corrupted storable %s (binary v%d.%d), current is v%d.%d",
3109                         cxt->fio ? "file" : "string",
3110                         cxt->ver_major, cxt->ver_minor,
3111                         STORABLE_BIN_MAJOR, STORABLE_BIN_MINOR));
3112         } else {
3113                 CROAK(("Corrupted storable %s (binary v%d.%d)",
3114                         cxt->fio ? "file" : "string",
3115                         cxt->ver_major, cxt->ver_minor));
3116         }
3117
3118         return (SV *) 0;                /* Just in case */
3119 }
3120
3121 /*
3122  * retrieve_idx_blessed
3123  *
3124  * Layout is SX_IX_BLESS <index> <object> with SX_IX_BLESS already read.
3125  * <index> can be coded on either 1 or 5 bytes.
3126  */
3127 static SV *retrieve_idx_blessed(stcxt_t *cxt, char *cname)
3128 {
3129         I32 idx;
3130         char *class;
3131         SV **sva;
3132         SV *sv;
3133
3134         TRACEME(("retrieve_idx_blessed (#%d)", cxt->tagnum));
3135         ASSERT(!cname, ("no bless-into class given here, got %s", cname));
3136
3137         GETMARK(idx);                   /* Index coded on a single char? */
3138         if (idx & 0x80)
3139                 RLEN(idx);
3140
3141         /*
3142          * Fetch classname in `aclass'
3143          */
3144
3145         sva = av_fetch(cxt->aclass, idx, FALSE);
3146         if (!sva)
3147                 CROAK(("Class name #%"IVdf" should have been seen already", (IV) idx));
3148
3149         class = SvPVX(*sva);    /* We know it's a PV, by construction */
3150
3151         TRACEME(("class ID %d => %s", idx, class));
3152
3153         /*
3154          * Retrieve object and bless it.
3155          */
3156
3157         sv = retrieve(cxt, class);      /* First SV which is SEEN will be blessed */
3158
3159         return sv;
3160 }
3161
3162 /*
3163  * retrieve_blessed
3164  *
3165  * Layout is SX_BLESS <len> <classname> <object> with SX_BLESS already read.
3166  * <len> can be coded on either 1 or 5 bytes.
3167  */
3168 static SV *retrieve_blessed(stcxt_t *cxt, char *cname)
3169 {
3170         I32 len;
3171         SV *sv;
3172         char buf[LG_BLESS + 1];         /* Avoid malloc() if possible */
3173         char *class = buf;
3174
3175         TRACEME(("retrieve_blessed (#%d)", cxt->tagnum));
3176         ASSERT(!cname, ("no bless-into class given here, got %s", cname));
3177
3178         /*
3179          * Decode class name length and read that name.
3180          *
3181          * Short classnames have two advantages: their length is stored on one
3182          * single byte, and the string can be read on the stack.
3183          */
3184
3185         GETMARK(len);                   /* Length coded on a single char? */
3186         if (len & 0x80) {
3187                 RLEN(len);
3188                 TRACEME(("** allocating %d bytes for class name", len+1));
3189                 New(10003, class, len+1, char);
3190         }
3191         READ(class, len);
3192         class[len] = '\0';              /* Mark string end */
3193
3194         /*
3195          * It's a new classname, otherwise it would have been an SX_IX_BLESS.
3196          */
3197
3198         TRACEME(("new class name \"%s\" will bear ID = %d", class, cxt->classnum));
3199
3200         if (!av_store(cxt->aclass, cxt->classnum++, newSVpvn(class, len)))
3201                 return (SV *) 0;
3202
3203         /*
3204          * Retrieve object and bless it.
3205          */
3206
3207         sv = retrieve(cxt, class);      /* First SV which is SEEN will be blessed */
3208         if (class != buf)
3209                 Safefree(class);
3210
3211         return sv;
3212 }
3213
3214 /*
3215  * retrieve_hook
3216  *
3217  * Layout: SX_HOOK <flags> <len> <classname> <len2> <str> [<len3> <object-IDs>]
3218  * with leading mark already read, as usual.
3219  *
3220  * When recursion was involved during serialization of the object, there
3221  * is an unknown amount of serialized objects after the SX_HOOK mark.  Until
3222  * we reach a <flags> marker with the recursion bit cleared.
3223  *
3224  * If the first <flags> byte contains a type of SHT_EXTRA, then the real type
3225  * is held in the <extra> byte, and if the object is tied, the serialized
3226  * magic object comes at the very end:
3227  *
3228  *     SX_HOOK <flags> <extra> ... [<len3> <object-IDs>] <magic object>
3229  *
3230  * This means the STORABLE_thaw hook will NOT get a tied variable during its
3231  * processing (since we won't have seen the magic object by the time the hook
3232  * is called).  See comments below for why it was done that way.
3233  */
3234 static SV *retrieve_hook(stcxt_t *cxt, char *cname)
3235 {
3236         I32 len;
3237         char buf[LG_BLESS + 1];         /* Avoid malloc() if possible */
3238         char *class = buf;
3239         unsigned int flags;
3240         I32 len2;
3241         SV *frozen;
3242         I32 len3 = 0;
3243         AV *av = 0;
3244         SV *hook;
3245         SV *sv;
3246         SV *rv;
3247         int obj_type;
3248         int clone = cxt->optype & ST_CLONE;
3249         char mtype = '\0';
3250         unsigned int extra_type = 0;
3251
3252         TRACEME(("retrieve_hook (#%d)", cxt->tagnum));
3253         ASSERT(!cname, ("no bless-into class given here, got %s", cname));
3254
3255         /*
3256          * Read flags, which tell us about the type, and whether we need to recurse.
3257          */
3258
3259         GETMARK(flags);
3260
3261         /*
3262          * Create the (empty) object, and mark it as seen.
3263          *
3264          * This must be done now, because tags are incremented, and during
3265          * serialization, the object tag was affected before recursion could
3266          * take place.
3267          */
3268
3269         obj_type = flags & SHF_TYPE_MASK;
3270         switch (obj_type) {
3271         case SHT_SCALAR:
3272                 sv = newSV(0);
3273                 break;
3274         case SHT_ARRAY:
3275                 sv = (SV *) newAV();
3276                 break;
3277         case SHT_HASH:
3278                 sv = (SV *) newHV();
3279                 break;
3280         case SHT_EXTRA:
3281                 /*
3282                  * Read <extra> flag to know the type of the object.
3283                  * Record associated magic type for later.
3284                  */
3285                 GETMARK(extra_type);
3286                 switch (extra_type) {
3287                 case SHT_TSCALAR:
3288                         sv = newSV(0);
3289                         mtype = 'q';
3290                         break;
3291                 case SHT_TARRAY:
3292                         sv = (SV *) newAV();
3293                         mtype = 'P';
3294                         break;
3295                 case SHT_THASH:
3296                         sv = (SV *) newHV();
3297                         mtype = 'P';
3298                         break;
3299                 default:
3300                         return retrieve_other(cxt, 0);  /* Let it croak */
3301                 }
3302                 break;
3303         default:
3304                 return retrieve_other(cxt, 0);          /* Let it croak */
3305         }
3306         SEEN(sv, 0);                                                    /* Don't bless yet */
3307
3308         /*
3309          * Whilst flags tell us to recurse, do so.
3310          *
3311          * We don't need to remember the addresses returned by retrieval, because
3312          * all the references will be obtained through indirection via the object
3313          * tags in the object-ID list.
3314          */
3315
3316         while (flags & SHF_NEED_RECURSE) {
3317                 TRACEME(("retrieve_hook recursing..."));
3318                 rv = retrieve(cxt, 0);
3319                 if (!rv)
3320                         return (SV *) 0;
3321                 TRACEME(("retrieve_hook back with rv=0x%"UVxf,
3322                          PTR2UV(rv)));
3323                 GETMARK(flags);
3324         }
3325
3326         if (flags & SHF_IDX_CLASSNAME) {
3327                 SV **sva;
3328                 I32 idx;
3329
3330                 /*
3331                  * Fetch index from `aclass'
3332                  */
3333
3334                 if (flags & SHF_LARGE_CLASSLEN)
3335                         RLEN(idx);
3336                 else
3337                         GETMARK(idx);
3338
3339                 sva = av_fetch(cxt->aclass, idx, FALSE);
3340                 if (!sva)
3341                         CROAK(("Class name #%"IVdf" should have been seen already",
3342                                 (IV) idx));
3343
3344                 class = SvPVX(*sva);    /* We know it's a PV, by construction */
3345                 TRACEME(("class ID %d => %s", idx, class));
3346
3347         } else {
3348                 /*
3349                  * Decode class name length and read that name.
3350                  *
3351                  * NOTA BENE: even if the length is stored on one byte, we don't read
3352                  * on the stack.  Just like retrieve_blessed(), we limit the name to
3353                  * LG_BLESS bytes.  This is an arbitrary decision.
3354                  */
3355
3356                 if (flags & SHF_LARGE_CLASSLEN)
3357                         RLEN(len);
3358                 else
3359                         GETMARK(len);
3360
3361                 if (len > LG_BLESS) {
3362                         TRACEME(("** allocating %d bytes for class name", len+1));
3363                         New(10003, class, len+1, char);
3364                 }
3365
3366                 READ(class, len);
3367                 class[len] = '\0';              /* Mark string end */
3368
3369                 /*
3370                  * Record new classname.
3371                  */
3372
3373                 if (!av_store(cxt->aclass, cxt->classnum++, newSVpvn(class, len)))
3374                         return (SV *) 0;
3375         }
3376
3377         TRACEME(("class name: %s", class));
3378
3379         /*
3380          * Decode user-frozen string length and read it in a SV.
3381          *
3382          * For efficiency reasons, we read data directly into the SV buffer.
3383          * To understand that code, read retrieve_scalar()
3384          */
3385
3386         if (flags & SHF_LARGE_STRLEN)
3387                 RLEN(len2);
3388         else
3389                 GETMARK(len2);
3390
3391         frozen = NEWSV(10002, len2);
3392         if (len2) {
3393                 SAFEREAD(SvPVX(frozen), len2, frozen);
3394                 SvCUR_set(frozen, len2);
3395                 *SvEND(frozen) = '\0';
3396         }
3397         (void) SvPOK_only(frozen);              /* Validates string pointer */
3398         if (cxt->s_tainted)                             /* Is input source tainted? */
3399                 SvTAINT(frozen);
3400
3401         TRACEME(("frozen string: %d bytes", len2));
3402
3403         /*
3404          * Decode object-ID list length, if present.
3405          */
3406
3407         if (flags & SHF_HAS_LIST) {
3408                 if (flags & SHF_LARGE_LISTLEN)
3409                         RLEN(len3);
3410                 else
3411                         GETMARK(len3);
3412                 if (len3) {
3413                         av = newAV();
3414                         av_extend(av, len3 + 1);        /* Leave room for [0] */
3415                         AvFILLp(av) = len3;                     /* About to be filled anyway */
3416                 }
3417         }
3418
3419         TRACEME(("has %d object IDs to link", len3));
3420
3421         /*
3422          * Read object-ID list into array.
3423          * Because we pre-extended it, we can cheat and fill it manually.
3424          *
3425          * We read object tags and we can convert them into SV* on the fly
3426          * because we know all the references listed in there (as tags)
3427          * have been already serialized, hence we have a valid correspondance
3428          * between each of those tags and the recreated SV.
3429          */
3430
3431         if (av) {
3432                 SV **ary = AvARRAY(av);
3433                 int i;
3434                 for (i = 1; i <= len3; i++) {   /* We leave [0] alone */
3435                         I32 tag;
3436                         SV **svh;
3437                         SV *xsv;
3438
3439                         READ_I32(tag);
3440                         tag = ntohl(tag);
3441                         svh = av_fetch(cxt->aseen, tag, FALSE);
3442                         if (!svh)
3443                                 CROAK(("Object #%"IVdf" should have been retrieved already",
3444                                         (IV) tag));
3445                         xsv = *svh;
3446                         ary[i] = SvREFCNT_inc(xsv);
3447                 }
3448         }
3449
3450         /*
3451          * Bless the object and look up the STORABLE_thaw hook.
3452          */
3453
3454         BLESS(sv, class);
3455         hook = pkg_can(cxt->hook, SvSTASH(sv), "STORABLE_thaw");
3456         if (!hook) {
3457                 /*
3458                  * Hook not found.  Maybe they did not require the module where this
3459                  * hook is defined yet?
3460                  *
3461                  * If the require below succeeds, we'll be able to find the hook.
3462                  * Still, it only works reliably when each class is defined in a
3463                  * file of its own.
3464                  */
3465
3466                 SV *psv = newSVpvn("require ", 8);
3467                 sv_catpv(psv, class);
3468
3469                 TRACEME(("No STORABLE_thaw defined for objects of class %s", class));
3470                 TRACEME(("Going to require module '%s' with '%s'", class, SvPVX(psv)));
3471
3472                 perl_eval_sv(psv, G_DISCARD);
3473                 sv_free(psv);
3474
3475                 /*
3476                  * We cache results of pkg_can, so we need to uncache before attempting
3477                  * the lookup again.
3478                  */
3479
3480                 pkg_uncache(cxt->hook, SvSTASH(sv), "STORABLE_thaw");
3481                 hook = pkg_can(cxt->hook, SvSTASH(sv), "STORABLE_thaw");
3482
3483                 if (!hook)
3484                         CROAK(("No STORABLE_thaw defined for objects of class %s "
3485                                         "(even after a \"require %s;\")", class, class));
3486         }
3487
3488         /*
3489          * If we don't have an `av' yet, prepare one.
3490          * Then insert the frozen string as item [0].
3491          */
3492
3493         if (!av) {
3494                 av = newAV();
3495                 av_extend(av, 1);
3496                 AvFILLp(av) = 0;
3497         }
3498         AvARRAY(av)[0] = SvREFCNT_inc(frozen);
3499
3500         /*
3501          * Call the hook as:
3502          *
3503          *   $object->STORABLE_thaw($cloning, $frozen, @refs);
3504          * 
3505          * where $object is our blessed (empty) object, $cloning is a boolean
3506          * telling whether we're running a deep clone, $frozen is the frozen
3507          * string the user gave us in his serializing hook, and @refs, which may
3508          * be empty, is the list of extra references he returned along for us
3509          * to serialize.
3510          *
3511          * In effect, the hook is an alternate creation routine for the class,
3512          * the object itself being already created by the runtime.
3513          */
3514
3515         TRACEME(("calling STORABLE_thaw on %s at 0x%"UVxf" (%"IVdf" args)",
3516                  class, PTR2UV(sv), AvFILLp(av) + 1));
3517
3518         rv = newRV(sv);
3519         (void) scalar_call(rv, hook, clone, av, G_SCALAR|G_DISCARD);
3520         SvREFCNT_dec(rv);
3521
3522         /*
3523          * Final cleanup.
3524          */
3525
3526         SvREFCNT_dec(frozen);
3527         av_undef(av);
3528         sv_free((SV *) av);
3529         if (!(flags & SHF_IDX_CLASSNAME) && class != buf)
3530                 Safefree(class);
3531
3532         /*
3533          * If we had an <extra> type, then the object was not as simple, and
3534          * we need to restore extra magic now.
3535          */
3536
3537         if (!extra_type)
3538                 return sv;
3539
3540         TRACEME(("retrieving magic object for 0x%"UVxf"...", PTR2UV(sv)));
3541
3542         rv = retrieve(cxt, 0);          /* Retrieve <magic object> */
3543
3544         TRACEME(("restoring the magic object 0x%"UVxf" part of 0x%"UVxf,
3545                 PTR2UV(rv), PTR2UV(sv)));
3546
3547         switch (extra_type) {
3548         case SHT_TSCALAR:
3549                 sv_upgrade(sv, SVt_PVMG);
3550                 break;
3551         case SHT_TARRAY:
3552                 sv_upgrade(sv, SVt_PVAV);
3553                 AvREAL_off((AV *)sv);
3554                 break;
3555         case SHT_THASH:
3556                 sv_upgrade(sv, SVt_PVHV);
3557                 break;
3558         default:
3559                 CROAK(("Forgot to deal with extra type %d", extra_type));
3560                 break;
3561         }
3562
3563         /*
3564          * Adding the magic only now, well after the STORABLE_thaw hook was called
3565          * means the hook cannot know it deals with an object whose variable is
3566          * tied.  But this is happening when retrieving $o in the following case:
3567          *
3568          *      my %h;
3569          *  tie %h, 'FOO';
3570          *      my $o = bless \%h, 'BAR';
3571          *
3572          * The 'BAR' class is NOT the one where %h is tied into.  Therefore, as
3573          * far as the 'BAR' class is concerned, the fact that %h is not a REAL
3574          * hash but a tied one should not matter at all, and remain transparent.
3575          * This means the magic must be restored by Storable AFTER the hook is
3576          * called.
3577          *
3578          * That looks very reasonable to me, but then I've come up with this
3579          * after a bug report from David Nesting, who was trying to store such
3580          * an object and caused Storable to fail.  And unfortunately, it was
3581          * also the easiest way to retrofit support for blessed ref to tied objects
3582          * into the existing design.  -- RAM, 17/02/2001
3583          */
3584
3585         sv_magic(sv, rv, mtype, Nullch, 0);
3586         SvREFCNT_dec(rv);                       /* Undo refcnt inc from sv_magic() */
3587
3588         return sv;
3589 }
3590
3591 /*
3592  * retrieve_ref
3593  *
3594  * Retrieve reference to some other scalar.
3595  * Layout is SX_REF <object>, with SX_REF already read.
3596  */
3597 static SV *retrieve_ref(stcxt_t *cxt, char *cname)
3598 {
3599         SV *rv;
3600         SV *sv;
3601
3602         TRACEME(("retrieve_ref (#%d)", cxt->tagnum));
3603
3604         /*
3605          * We need to create the SV that holds the reference to the yet-to-retrieve
3606          * object now, so that we may record the address in the seen table.
3607          * Otherwise, if the object to retrieve references us, we won't be able
3608          * to resolve the SX_OBJECT we'll see at that point! Hence we cannot
3609          * do the retrieve first and use rv = newRV(sv) since it will be too late
3610          * for SEEN() recording.
3611          */
3612
3613         rv = NEWSV(10002, 0);
3614         SEEN(rv, cname);                /* Will return if rv is null */
3615         sv = retrieve(cxt, 0);  /* Retrieve <object> */
3616         if (!sv)
3617                 return (SV *) 0;        /* Failed */
3618
3619         /*
3620          * WARNING: breaks RV encapsulation.
3621          *
3622          * Now for the tricky part. We have to upgrade our existing SV, so that
3623          * it is now an RV on sv... Again, we cheat by duplicating the code
3624          * held in newSVrv(), since we already got our SV from retrieve().
3625          *
3626          * We don't say:
3627          *
3628          *              SvRV(rv) = SvREFCNT_inc(sv);
3629          *
3630          * here because the reference count we got from retrieve() above is
3631          * already correct: if the object was retrieved from the file, then
3632          * its reference count is one. Otherwise, if it was retrieved via
3633          * an SX_OBJECT indication, a ref count increment was done.
3634          */
3635
3636         sv_upgrade(rv, SVt_RV);
3637         SvRV(rv) = sv;                          /* $rv = \$sv */
3638         SvROK_on(rv);
3639
3640         TRACEME(("ok (retrieve_ref at 0x%"UVxf")", PTR2UV(rv)));
3641
3642         return rv;
3643 }
3644
3645 /*
3646  * retrieve_overloaded
3647  *
3648  * Retrieve reference to some other scalar with overloading.
3649  * Layout is SX_OVERLOAD <object>, with SX_OVERLOAD already read.
3650  */
3651 static SV *retrieve_overloaded(stcxt_t *cxt, char *cname)
3652 {
3653         SV *rv;
3654         SV *sv;
3655         HV *stash;
3656
3657         TRACEME(("retrieve_overloaded (#%d)", cxt->tagnum));
3658
3659         /*
3660          * Same code as retrieve_ref(), duplicated to avoid extra call.
3661          */
3662
3663         rv = NEWSV(10002, 0);
3664         SEEN(rv, cname);                /* Will return if rv is null */
3665         sv = retrieve(cxt, 0);  /* Retrieve <object> */
3666         if (!sv)
3667                 return (SV *) 0;        /* Failed */
3668
3669         /*
3670          * WARNING: breaks RV encapsulation.
3671          */
3672
3673         sv_upgrade(rv, SVt_RV);
3674         SvRV(rv) = sv;                          /* $rv = \$sv */
3675         SvROK_on(rv);
3676
3677         /*
3678          * Restore overloading magic.
3679          */
3680
3681         stash = (HV *) SvSTASH (sv);
3682         if (!stash || !Gv_AMG(stash))
3683                 CROAK(("Cannot restore overloading on %s(0x%"UVxf") (package %s)",
3684                        sv_reftype(sv, FALSE),
3685                        PTR2UV(sv),
3686                            stash ? HvNAME(stash) : "<unknown>"));
3687
3688         SvAMAGIC_on(rv);
3689
3690         TRACEME(("ok (retrieve_overloaded at 0x%"UVxf")", PTR2UV(rv)));
3691
3692         return rv;
3693 }
3694
3695 /*
3696  * retrieve_tied_array
3697  *
3698  * Retrieve tied array
3699  * Layout is SX_TIED_ARRAY <object>, with SX_TIED_ARRAY already read.
3700  */
3701 static SV *retrieve_tied_array(stcxt_t *cxt, char *cname)
3702 {
3703         SV *tv;
3704         SV *sv;
3705
3706         TRACEME(("retrieve_tied_array (#%d)", cxt->tagnum));
3707
3708         tv = NEWSV(10002, 0);
3709         SEEN(tv, cname);                        /* Will return if tv is null */
3710         sv = retrieve(cxt, 0);          /* Retrieve <object> */
3711         if (!sv)
3712                 return (SV *) 0;                /* Failed */
3713
3714         sv_upgrade(tv, SVt_PVAV);
3715         AvREAL_off((AV *)tv);
3716         sv_magic(tv, sv, 'P', Nullch, 0);
3717         SvREFCNT_dec(sv);                       /* Undo refcnt inc from sv_magic() */
3718
3719         TRACEME(("ok (retrieve_tied_array at 0x%"UVxf")", PTR2UV(tv)));
3720
3721         return tv;
3722 }
3723
3724 /*
3725  * retrieve_tied_hash
3726  *
3727  * Retrieve tied hash
3728  * Layout is SX_TIED_HASH <object>, with SX_TIED_HASH already read.
3729  */
3730 static SV *retrieve_tied_hash(stcxt_t *cxt, char *cname)
3731 {
3732         SV *tv;
3733         SV *sv;
3734
3735         TRACEME(("retrieve_tied_hash (#%d)", cxt->tagnum));
3736
3737         tv = NEWSV(10002, 0);
3738         SEEN(tv, cname);                        /* Will return if tv is null */
3739         sv = retrieve(cxt, 0);          /* Retrieve <object> */
3740         if (!sv)
3741                 return (SV *) 0;                /* Failed */
3742
3743         sv_upgrade(tv, SVt_PVHV);
3744         sv_magic(tv, sv, 'P', Nullch, 0);
3745         SvREFCNT_dec(sv);                       /* Undo refcnt inc from sv_magic() */
3746
3747         TRACEME(("ok (retrieve_tied_hash at 0x%"UVxf")", PTR2UV(tv)));
3748
3749         return tv;
3750 }
3751
3752 /*
3753  * retrieve_tied_scalar
3754  *
3755  * Retrieve tied scalar
3756  * Layout is SX_TIED_SCALAR <object>, with SX_TIED_SCALAR already read.
3757  */
3758 static SV *retrieve_tied_scalar(stcxt_t *cxt, char *cname)
3759 {
3760         SV *tv;
3761         SV *sv;
3762
3763         TRACEME(("retrieve_tied_scalar (#%d)", cxt->tagnum));
3764
3765         tv = NEWSV(10002, 0);
3766         SEEN(tv, cname);                        /* Will return if rv is null */
3767         sv = retrieve(cxt, 0);          /* Retrieve <object> */
3768         if (!sv)
3769                 return (SV *) 0;                /* Failed */
3770
3771         sv_upgrade(tv, SVt_PVMG);
3772         sv_magic(tv, sv, 'q', Nullch, 0);
3773         SvREFCNT_dec(sv);                       /* Undo refcnt inc from sv_magic() */
3774
3775         TRACEME(("ok (retrieve_tied_scalar at 0x%"UVxf")", PTR2UV(tv)));
3776
3777         return tv;
3778 }
3779
3780 /*
3781  * retrieve_tied_key
3782  *
3783  * Retrieve reference to value in a tied hash.
3784  * Layout is SX_TIED_KEY <object> <key>, with SX_TIED_KEY already read.
3785  */
3786 static SV *retrieve_tied_key(stcxt_t *cxt, char *cname)
3787 {
3788         SV *tv;
3789         SV *sv;
3790         SV *key;
3791
3792         TRACEME(("retrieve_tied_key (#%d)", cxt->tagnum));
3793
3794         tv = NEWSV(10002, 0);
3795         SEEN(tv, cname);                        /* Will return if tv is null */
3796         sv = retrieve(cxt, 0);          /* Retrieve <object> */
3797         if (!sv)
3798                 return (SV *) 0;                /* Failed */
3799
3800         key = retrieve(cxt, 0);         /* Retrieve <key> */
3801         if (!key)
3802                 return (SV *) 0;                /* Failed */
3803
3804         sv_upgrade(tv, SVt_PVMG);
3805         sv_magic(tv, sv, 'p', (char *)key, HEf_SVKEY);
3806         SvREFCNT_dec(key);                      /* Undo refcnt inc from sv_magic() */
3807         SvREFCNT_dec(sv);                       /* Undo refcnt inc from sv_magic() */
3808
3809         return tv;
3810 }
3811
3812 /*
3813  * retrieve_tied_idx
3814  *
3815  * Retrieve reference to value in a tied array.
3816  * Layout is SX_TIED_IDX <object> <idx>, with SX_TIED_IDX already read.
3817  */
3818 static SV *retrieve_tied_idx(stcxt_t *cxt, char *cname)
3819 {
3820         SV *tv;
3821         SV *sv;
3822         I32 idx;
3823
3824         TRACEME(("retrieve_tied_idx (#%d)", cxt->tagnum));
3825
3826         tv = NEWSV(10002, 0);
3827         SEEN(tv, cname);                        /* Will return if tv is null */
3828         sv = retrieve(cxt, 0);          /* Retrieve <object> */
3829         if (!sv)
3830                 return (SV *) 0;                /* Failed */
3831
3832         RLEN(idx);                                      /* Retrieve <idx> */
3833
3834         sv_upgrade(tv, SVt_PVMG);
3835         sv_magic(tv, sv, 'p', Nullch, idx);
3836         SvREFCNT_dec(sv);                       /* Undo refcnt inc from sv_magic() */
3837
3838         return tv;
3839 }
3840
3841
3842 /*
3843  * retrieve_lscalar
3844  *
3845  * Retrieve defined long (string) scalar.
3846  *
3847  * Layout is SX_LSCALAR <length> <data>, with SX_LSCALAR already read.
3848  * The scalar is "long" in that <length> is larger than LG_SCALAR so it
3849  * was not stored on a single byte.
3850  */
3851 static SV *retrieve_lscalar(stcxt_t *cxt, char *cname)
3852 {
3853         I32 len;
3854         SV *sv;
3855
3856         RLEN(len);
3857         TRACEME(("retrieve_lscalar (#%d), len = %"IVdf, cxt->tagnum, len));
3858
3859         /*
3860          * Allocate an empty scalar of the suitable length.
3861          */
3862
3863         sv = NEWSV(10002, len);
3864         SEEN(sv, cname);        /* Associate this new scalar with tag "tagnum" */
3865
3866         /*
3867          * WARNING: duplicates parts of sv_setpv and breaks SV data encapsulation.
3868          *
3869          * Now, for efficiency reasons, read data directly inside the SV buffer,
3870          * and perform the SV final settings directly by duplicating the final
3871          * work done by sv_setpv. Since we're going to allocate lots of scalars
3872          * this way, it's worth the hassle and risk.
3873          */
3874
3875         SAFEREAD(SvPVX(sv), len, sv);
3876         SvCUR_set(sv, len);                             /* Record C string length */
3877         *SvEND(sv) = '\0';                              /* Ensure it's null terminated anyway */
3878         (void) SvPOK_only(sv);                  /* Validate string pointer */
3879         if (cxt->s_tainted)                             /* Is input source tainted? */
3880                 SvTAINT(sv);                            /* External data cannot be trusted */
3881
3882         TRACEME(("large scalar len %"IVdf" '%s'", len, SvPVX(sv)));
3883         TRACEME(("ok (retrieve_lscalar at 0x%"UVxf")", PTR2UV(sv)));
3884
3885         return sv;
3886 }
3887
3888 /*
3889  * retrieve_scalar
3890  *
3891  * Retrieve defined short (string) scalar.
3892  *
3893  * Layout is SX_SCALAR <length> <data>, with SX_SCALAR already read.
3894  * The scalar is "short" so <length> is single byte. If it is 0, there
3895  * is no <data> section.
3896  */
3897 static SV *retrieve_scalar(stcxt_t *cxt, char *cname)
3898 {
3899         int len;
3900         SV *sv;
3901
3902         GETMARK(len);
3903         TRACEME(("retrieve_scalar (#%d), len = %d", cxt->tagnum, len));
3904
3905         /*
3906          * Allocate an empty scalar of the suitable length.
3907          */
3908
3909         sv = NEWSV(10002, len);
3910         SEEN(sv, cname);        /* Associate this new scalar with tag "tagnum" */
3911
3912         /*
3913          * WARNING: duplicates parts of sv_setpv and breaks SV data encapsulation.
3914          */
3915
3916         if (len == 0) {
3917                 /*
3918                  * newSV did not upgrade to SVt_PV so the scalar is undefined.
3919                  * To make it defined with an empty length, upgrade it now...
3920                  */
3921                 sv_upgrade(sv, SVt_PV);
3922                 SvGROW(sv, 1);
3923                 *SvEND(sv) = '\0';                      /* Ensure it's null terminated anyway */
3924                 TRACEME(("ok (retrieve_scalar empty at 0x%"UVxf")", PTR2UV(sv)));
3925         } else {
3926                 /*
3927                  * Now, for efficiency reasons, read data directly inside the SV buffer,
3928                  * and perform the SV final settings directly by duplicating the final
3929                  * work done by sv_setpv. Since we're going to allocate lots of scalars
3930                  * this way, it's worth the hassle and risk.
3931                  */
3932                 SAFEREAD(SvPVX(sv), len, sv);
3933                 SvCUR_set(sv, len);                     /* Record C string length */
3934                 *SvEND(sv) = '\0';                      /* Ensure it's null terminated anyway */
3935                 TRACEME(("small scalar len %d '%s'", len, SvPVX(sv)));
3936         }
3937
3938         (void) SvPOK_only(sv);                  /* Validate string pointer */
3939         if (cxt->s_tainted)                             /* Is input source tainted? */
3940                 SvTAINT(sv);                            /* External data cannot be trusted */
3941
3942         TRACEME(("ok (retrieve_scalar at 0x%"UVxf")", PTR2UV(sv)));
3943         return sv;
3944 }
3945
3946 /*
3947  * retrieve_utf8str
3948  *
3949  * Like retrieve_scalar(), but tag result as utf8.
3950  * If we're retrieving UTF8 data in a non-UTF8 perl, croaks.
3951  */
3952 static SV *retrieve_utf8str(stcxt_t *cxt, char *cname)
3953 {
3954         SV *sv;
3955
3956         TRACEME(("retrieve_utf8str"));
3957
3958         sv = retrieve_scalar(cxt, cname);
3959         if (sv)
3960                 SvUTF8_on(sv);
3961
3962         return sv;
3963 }
3964
3965 /*
3966  * retrieve_lutf8str
3967  *
3968  * Like retrieve_lscalar(), but tag result as utf8.
3969  * If we're retrieving UTF8 data in a non-UTF8 perl, croaks.
3970  */
3971 static SV *retrieve_lutf8str(stcxt_t *cxt, char *cname)
3972 {
3973         SV *sv;
3974
3975         TRACEME(("retrieve_lutf8str"));
3976
3977         sv = retrieve_lscalar(cxt, cname);
3978         if (sv)
3979                 SvUTF8_on(sv);
3980
3981         return sv;
3982 }
3983
3984 /*
3985  * retrieve_integer
3986  *
3987  * Retrieve defined integer.
3988  * Layout is SX_INTEGER <data>, whith SX_INTEGER already read.
3989  */
3990 static SV *retrieve_integer(stcxt_t *cxt, char *cname)
3991 {
3992         SV *sv;
3993         IV iv;
3994
3995         TRACEME(("retrieve_integer (#%d)", cxt->tagnum));
3996
3997         READ(&iv, sizeof(iv));
3998         sv = newSViv(iv);
3999         SEEN(sv, cname);        /* Associate this new scalar with tag "tagnum" */
4000
4001         TRACEME(("integer %"IVdf, iv));
4002         TRACEME(("ok (retrieve_integer at 0x%"UVxf")", PTR2UV(sv)));
4003
4004         return sv;
4005 }
4006
4007 /*
4008  * retrieve_netint
4009  *
4010  * Retrieve defined integer in network order.
4011  * Layout is SX_NETINT <data>, whith SX_NETINT already read.
4012  */
4013 static SV *retrieve_netint(stcxt_t *cxt, char *cname)
4014 {
4015         SV *sv;
4016         I32 iv;
4017
4018         TRACEME(("retrieve_netint (#%d)", cxt->tagnum));
4019
4020         READ_I32(iv);
4021 #ifdef HAS_NTOHL
4022         sv = newSViv((int) ntohl(iv));
4023         TRACEME(("network integer %d", (int) ntohl(iv)));
4024 #else
4025         sv = newSViv(iv);
4026         TRACEME(("network integer (as-is) %d", iv));
4027 #endif
4028         SEEN(sv, cname);        /* Associate this new scalar with tag "tagnum" */
4029
4030         TRACEME(("ok (retrieve_netint at 0x%"UVxf")", PTR2UV(sv)));
4031
4032         return sv;
4033 }
4034
4035 /*
4036  * retrieve_double
4037  *
4038  * Retrieve defined double.
4039  * Layout is SX_DOUBLE <data>, whith SX_DOUBLE already read.
4040  */
4041 static SV *retrieve_double(stcxt_t *cxt, char *cname)
4042 {
4043         SV *sv;
4044         NV nv;
4045
4046         TRACEME(("retrieve_double (#%d)", cxt->tagnum));
4047
4048         READ(&nv, sizeof(nv));
4049         sv = newSVnv(nv);
4050         SEEN(sv, cname);        /* Associate this new scalar with tag "tagnum" */
4051
4052         TRACEME(("double %"NVff, nv));
4053         TRACEME(("ok (retrieve_double at 0x%"UVxf")", PTR2UV(sv)));
4054
4055         return sv;
4056 }
4057
4058 /*
4059  * retrieve_byte
4060  *
4061  * Retrieve defined byte (small integer within the [-128, +127] range).
4062  * Layout is SX_BYTE <data>, whith SX_BYTE already read.
4063  */
4064 static SV *retrieve_byte(stcxt_t *cxt, char *cname)
4065 {
4066         SV *sv;
4067         int siv;
4068         signed char tmp;        /* Workaround for AIX cc bug --H.Merijn Brand */
4069
4070         TRACEME(("retrieve_byte (#%d)", cxt->tagnum));
4071
4072         GETMARK(siv);
4073         TRACEME(("small integer read as %d", (unsigned char) siv));
4074         tmp = (unsigned char) siv - 128;
4075         sv = newSViv(tmp);
4076         SEEN(sv, cname);        /* Associate this new scalar with tag "tagnum" */
4077
4078         TRACEME(("byte %d", tmp));
4079         TRACEME(("ok (retrieve_byte at 0x%"UVxf")", PTR2UV(sv)));
4080
4081         return sv;
4082 }
4083
4084 /*
4085  * retrieve_undef
4086  *
4087  * Return the undefined value.
4088  */
4089 static SV *retrieve_undef(stcxt_t *cxt, char *cname)
4090 {
4091         SV* sv;
4092
4093         TRACEME(("retrieve_undef"));
4094
4095         sv = newSV(0);
4096         SEEN(sv, cname);
4097
4098         return sv;
4099 }
4100
4101 /*
4102  * retrieve_sv_undef
4103  *
4104  * Return the immortal undefined value.
4105  */
4106 static SV *retrieve_sv_undef(stcxt_t *cxt, char *cname)
4107 {
4108         SV *sv = &PL_sv_undef;
4109
4110         TRACEME(("retrieve_sv_undef"));
4111
4112         SEEN(sv, cname);
4113         return sv;
4114 }
4115
4116 /*
4117  * retrieve_sv_yes
4118  *
4119  * Return the immortal yes value.
4120  */
4121 static SV *retrieve_sv_yes(stcxt_t *cxt, char *cname)
4122 {
4123         SV *sv = &PL_sv_yes;
4124
4125         TRACEME(("retrieve_sv_yes"));
4126
4127         SEEN(sv, cname);
4128         return sv;
4129 }
4130
4131 /*
4132  * retrieve_sv_no
4133  *
4134  * Return the immortal no value.
4135  */
4136 static SV *retrieve_sv_no(stcxt_t *cxt, char *cname)
4137 {
4138         SV *sv = &PL_sv_no;
4139
4140         TRACEME(("retrieve_sv_no"));
4141
4142         SEEN(sv, cname);
4143         return sv;
4144 }
4145
4146 /*
4147  * retrieve_array
4148  *
4149  * Retrieve a whole array.
4150  * Layout is SX_ARRAY <size> followed by each item, in increading index order.
4151  * Each item is stored as <object>.
4152  *
4153  * When we come here, SX_ARRAY has been read already.
4154  */
4155 static SV *retrieve_array(stcxt_t *cxt, char *cname)
4156 {
4157         I32 len;
4158         I32 i;
4159         AV *av;
4160         SV *sv;
4161
4162         TRACEME(("retrieve_array (#%d)", cxt->tagnum));
4163
4164         /*
4165          * Read length, and allocate array, then pre-extend it.
4166          */
4167
4168         RLEN(len);
4169         TRACEME(("size = %d", len));
4170         av = newAV();
4171         SEEN(av, cname);                        /* Will return if array not allocated nicely */
4172         if (len)
4173                 av_extend(av, len);
4174         else
4175                 return (SV *) av;               /* No data follow if array is empty */
4176
4177         /*
4178          * Now get each item in turn...
4179          */
4180
4181         for (i = 0; i < len; i++) {
4182                 TRACEME(("(#%d) item", i));
4183                 sv = retrieve(cxt, 0);                  /* Retrieve item */
4184                 if (!sv)
4185                         return (SV *) 0;
4186                 if (av_store(av, i, sv) == 0)
4187                         return (SV *) 0;
4188         }
4189
4190         TRACEME(("ok (retrieve_array at 0x%"UVxf")", PTR2UV(av)));
4191
4192         return (SV *) av;
4193 }
4194
4195 /*
4196  * retrieve_hash
4197  *
4198  * Retrieve a whole hash table.
4199  * Layout is SX_HASH <size> followed by each key/value pair, in random order.
4200  * Keys are stored as <length> <data>, the <data> section being omitted
4201  * if length is 0.
4202  * Values are stored as <object>.
4203  *
4204  * When we come here, SX_HASH has been read already.
4205  */
4206 static SV *retrieve_hash(stcxt_t *cxt, char *cname)
4207 {
4208         I32 len;
4209         I32 size;
4210         I32 i;
4211         HV *hv;
4212         SV *sv;
4213
4214         TRACEME(("retrieve_hash (#%d)", cxt->tagnum));
4215
4216         /*
4217          * Read length, allocate table.
4218          */
4219
4220         RLEN(len);
4221         TRACEME(("size = %d", len));
4222         hv = newHV();
4223         SEEN(hv, cname);                /* Will return if table not allocated properly */
4224         if (len == 0)
4225                 return (SV *) hv;       /* No data follow if table empty */
4226
4227         /*
4228          * Now get each key/value pair in turn...
4229          */
4230
4231         for (i = 0; i < len; i++) {
4232                 /*
4233                  * Get value first.
4234                  */
4235
4236                 TRACEME(("(#%d) value", i));
4237                 sv = retrieve(cxt, 0);
4238                 if (!sv)
4239                         return (SV *) 0;
4240
4241                 /*
4242                  * Get key.
4243                  * Since we're reading into kbuf, we must ensure we're not
4244                  * recursing between the read and the hv_store() where it's used.
4245                  * Hence the key comes after the value.
4246                  */
4247
4248                 RLEN(size);                                             /* Get key size */
4249                 KBUFCHK(size);                                  /* Grow hash key read pool if needed */
4250                 if (size)
4251                         READ(kbuf, size);
4252                 kbuf[size] = '\0';                              /* Mark string end, just in case */
4253                 TRACEME(("(#%d) key '%s'", i, kbuf));
4254
4255                 /*
4256                  * Enter key/value pair into hash table.
4257                  */
4258
4259                 if (hv_store(hv, kbuf, (U32) size, sv, 0) == 0)
4260                         return (SV *) 0;
4261         }
4262
4263         TRACEME(("ok (retrieve_hash at 0x%"UVxf")", PTR2UV(hv)));
4264
4265         return (SV *) hv;
4266 }
4267
4268 /*
4269  * old_retrieve_array
4270  *
4271  * Retrieve a whole array in pre-0.6 binary format.
4272  *
4273  * Layout is SX_ARRAY <size> followed by each item, in increading index order.
4274  * Each item is stored as SX_ITEM <object> or SX_IT_UNDEF for "holes".
4275  *
4276  * When we come here, SX_ARRAY has been read already.
4277  */
4278 static SV *old_retrieve_array(stcxt_t *cxt, char *cname)
4279 {
4280         I32 len;
4281         I32 i;
4282         AV *av;
4283         SV *sv;
4284         int c;
4285
4286         TRACEME(("old_retrieve_array (#%d)", cxt->tagnum));
4287
4288         /*
4289          * Read length, and allocate array, then pre-extend it.
4290          */
4291
4292         RLEN(len);
4293         TRACEME(("size = %d", len));
4294         av = newAV();
4295         SEEN(av, 0);                            /* Will return if array not allocated nicely */
4296         if (len)
4297                 av_extend(av, len);
4298         else
4299                 return (SV *) av;               /* No data follow if array is empty */
4300
4301         /*
4302          * Now get each item in turn...
4303          */
4304
4305         for (i = 0; i < len; i++) {
4306                 GETMARK(c);
4307                 if (c == SX_IT_UNDEF) {
4308                         TRACEME(("(#%d) undef item", i));
4309                         continue;                       /* av_extend() already filled us with undef */
4310                 }
4311                 if (c != SX_ITEM)
4312                         (void) retrieve_other((stcxt_t *) 0, 0);        /* Will croak out */
4313                 TRACEME(("(#%d) item", i));
4314                 sv = retrieve(cxt, 0);                                          /* Retrieve item */
4315                 if (!sv)
4316                         return (SV *) 0;
4317                 if (av_store(av, i, sv) == 0)
4318                         return (SV *) 0;
4319         }
4320
4321         TRACEME(("ok (old_retrieve_array at 0x%"UVxf")", PTR2UV(av)));
4322
4323         return (SV *) av;
4324 }
4325
4326 /*
4327  * old_retrieve_hash
4328  *
4329  * Retrieve a whole hash table in pre-0.6 binary format.
4330  *
4331  * Layout is SX_HASH <size> followed by each key/value pair, in random order.
4332  * Keys are stored as SX_KEY <length> <data>, the <data> section being omitted
4333  * if length is 0.
4334  * Values are stored as SX_VALUE <object> or SX_VL_UNDEF for "holes".
4335  *
4336  * When we come here, SX_HASH has been read already.
4337  */
4338 static SV *old_retrieve_hash(stcxt_t *cxt, char *cname)
4339 {
4340         I32 len;
4341         I32 size;
4342         I32 i;
4343         HV *hv;
4344         SV *sv = (SV *) 0;
4345         int c;
4346         static SV *sv_h_undef = (SV *) 0;               /* hv_store() bug */
4347
4348         TRACEME(("old_retrieve_hash (#%d)", cxt->tagnum));
4349
4350         /*
4351          * Read length, allocate table.
4352          */
4353
4354         RLEN(len);
4355         TRACEME(("size = %d", len));
4356         hv = newHV();
4357         SEEN(hv, 0);                    /* Will return if table not allocated properly */
4358         if (len == 0)
4359                 return (SV *) hv;       /* No data follow if table empty */
4360
4361         /*
4362          * Now get each key/value pair in turn...
4363          */
4364
4365         for (i = 0; i < len; i++) {
4366                 /*
4367                  * Get value first.
4368                  */
4369
4370                 GETMARK(c);
4371                 if (c == SX_VL_UNDEF) {
4372                         TRACEME(("(#%d) undef value", i));
4373                         /*
4374                          * Due to a bug in hv_store(), it's not possible to pass
4375                          * &PL_sv_undef to hv_store() as a value, otherwise the
4376                          * associated key will not be creatable any more. -- RAM, 14/01/97
4377                          */
4378                         if (!sv_h_undef)
4379                                 sv_h_undef = newSVsv(&PL_sv_undef);
4380                         sv = SvREFCNT_inc(sv_h_undef);
4381                 } else if (c == SX_VALUE) {
4382                         TRACEME(("(#%d) value", i));
4383                         sv = retrieve(cxt, 0);
4384                         if (!sv)
4385                                 return (SV *) 0;
4386                 } else
4387                         (void) retrieve_other((stcxt_t *) 0, 0);        /* Will croak out */
4388
4389                 /*
4390                  * Get key.
4391                  * Since we're reading into kbuf, we must ensure we're not
4392                  * recursing between the read and the hv_store() where it's used.
4393                  * Hence the key comes after the value.
4394                  */
4395
4396                 GETMARK(c);
4397                 if (c != SX_KEY)
4398                         (void) retrieve_other((stcxt_t *) 0, 0);        /* Will croak out */
4399                 RLEN(size);                                             /* Get key size */
4400                 KBUFCHK(size);                                  /* Grow hash key read pool if needed */
4401                 if (size)
4402                         READ(kbuf, size);
4403                 kbuf[size] = '\0';                              /* Mark string end, just in case */
4404                 TRACEME(("(#%d) key '%s'", i, kbuf));
4405
4406                 /*
4407                  * Enter key/value pair into hash table.
4408                  */
4409
4410                 if (hv_store(hv, kbuf, (U32) size, sv, 0) == 0)
4411                         return (SV *) 0;
4412         }
4413
4414         TRACEME(("ok (retrieve_hash at 0x%"UVxf")", PTR2UV(hv)));
4415
4416         return (SV *) hv;
4417 }
4418
4419 /***
4420  *** Retrieval engine.
4421  ***/
4422
4423 /*
4424  * magic_check
4425  *
4426  * Make sure the stored data we're trying to retrieve has been produced
4427  * on an ILP compatible system with the same byteorder. It croaks out in
4428  * case an error is detected. [ILP = integer-long-pointer sizes]
4429  * Returns null if error is detected, &PL_sv_undef otherwise.
4430  *
4431  * Note that there's no byte ordering info emitted when network order was
4432  * used at store time.
4433  */
4434 static SV *magic_check(stcxt_t *cxt)
4435 {
4436         char buf[256];
4437         char byteorder[256];
4438         int c;
4439         int use_network_order;
4440         int version_major;
4441         int version_minor = 0;
4442
4443         TRACEME(("magic_check"));
4444
4445         /*
4446          * The "magic number" is only for files, not when freezing in memory.
4447          */
4448
4449         if (cxt->fio) {
4450                 STRLEN len = sizeof(magicstr) - 1;
4451                 STRLEN old_len;
4452
4453                 READ(buf, len);                                 /* Not null-terminated */
4454                 buf[len] = '\0';                                /* Is now */
4455
4456                 if (0 == strcmp(buf, magicstr))
4457                         goto magic_ok;
4458
4459                 /*
4460                  * Try to read more bytes to check for the old magic number, which
4461                  * was longer.
4462                  */
4463
4464                 old_len = sizeof(old_magicstr) - 1;
4465                 READ(&buf[len], old_len - len);
4466                 buf[old_len] = '\0';                    /* Is now null-terminated */
4467
4468                 if (strcmp(buf, old_magicstr))
4469                         CROAK(("File is not a perl storable"));
4470         }
4471
4472 magic_ok:
4473         /*
4474          * Starting with 0.6, the "use_network_order" byte flag is also used to
4475          * indicate the version number of the binary, and therefore governs the
4476          * setting of sv_retrieve_vtbl. See magic_write().
4477          */
4478
4479         GETMARK(use_network_order);
4480         version_major = use_network_order >> 1;
4481         cxt->retrieve_vtbl = version_major ? sv_retrieve : sv_old_retrieve;
4482
4483         TRACEME(("magic_check: netorder = 0x%x", use_network_order));
4484
4485
4486         /*
4487          * Starting with 0.7 (binary major 2), a full byte is dedicated to the
4488          * minor version of the protocol.  See magic_write().
4489          */
4490
4491         if (version_major > 1)
4492                 GETMARK(version_minor);
4493
4494         cxt->ver_major = version_major;
4495         cxt->ver_minor = version_minor;
4496
4497         TRACEME(("binary image version is %d.%d", version_major, version_minor));
4498
4499         /*
4500          * Inter-operability sanity check: we can't retrieve something stored
4501          * using a format more recent than ours, because we have no way to
4502          * know what has changed, and letting retrieval go would mean a probable
4503          * failure reporting a "corrupted" storable file.
4504          */
4505
4506         if (
4507                 version_major > STORABLE_BIN_MAJOR ||
4508                         (version_major == STORABLE_BIN_MAJOR &&
4509                         version_minor > STORABLE_BIN_MINOR)
4510         )
4511                 CROAK(("Storable binary image v%d.%d more recent than I am (v%d.%d)",
4512                         version_major, version_minor,
4513                         STORABLE_BIN_MAJOR, STORABLE_BIN_MINOR));
4514
4515         /*
4516          * If they stored using network order, there's no byte ordering
4517          * information to check.
4518          */
4519
4520         if ((cxt->netorder = (use_network_order & 0x1)))        /* Extra () for -Wall */
4521                 return &PL_sv_undef;                    /* No byte ordering info */
4522
4523         sprintf(byteorder, "%lx", (unsigned long) BYTEORDER);
4524         GETMARK(c);
4525         READ(buf, c);                                           /* Not null-terminated */
4526         buf[c] = '\0';                                          /* Is now */
4527
4528         if (strcmp(buf, byteorder))
4529                 CROAK(("Byte order is not compatible"));
4530         
4531         GETMARK(c);             /* sizeof(int) */
4532         if ((int) c != sizeof(int))
4533                 CROAK(("Integer size is not compatible"));
4534
4535         GETMARK(c);             /* sizeof(long) */
4536         if ((int) c != sizeof(long))
4537                 CROAK(("Long integer size is not compatible"));
4538
4539         GETMARK(c);             /* sizeof(char *) */
4540         if ((int) c != sizeof(char *))
4541                 CROAK(("Pointer integer size is not compatible"));
4542
4543         if (version_major >= 2 && version_minor >= 2) {
4544                 GETMARK(c);             /* sizeof(NV) */
4545                 if ((int) c != sizeof(NV))
4546                         CROAK(("Double size is not compatible"));
4547         }
4548
4549         return &PL_sv_undef;    /* OK */
4550 }
4551
4552 /*
4553  * retrieve
4554  *
4555  * Recursively retrieve objects from the specified file and return their
4556  * root SV (which may be an AV or an HV for what we care).
4557  * Returns null if there is a problem.
4558  */
4559 static SV *retrieve(stcxt_t *cxt, char *cname)
4560 {
4561         int type;
4562         SV **svh;
4563         SV *sv;
4564
4565         TRACEME(("retrieve"));
4566
4567         /*
4568          * Grab address tag which identifies the object if we are retrieving
4569          * an older format. Since the new binary format counts objects and no
4570          * longer explicitely tags them, we must keep track of the correspondance
4571          * ourselves.
4572          *
4573          * The following section will disappear one day when the old format is
4574          * no longer supported, hence the final "goto" in the "if" block.
4575          */
4576
4577         if (cxt->hseen) {                                               /* Retrieving old binary */
4578                 stag_t tag;
4579                 if (cxt->netorder) {
4580                         I32 nettag;
4581                         READ(&nettag, sizeof(I32));             /* Ordered sequence of I32 */
4582                         tag = (stag_t) nettag;
4583                 } else
4584                         READ(&tag, sizeof(stag_t));             /* Original address of the SV */
4585
4586                 GETMARK(type);
4587                 if (type == SX_OBJECT) {
4588                         I32 tagn;
4589                         svh = hv_fetch(cxt->hseen, (char *) &tag, sizeof(tag), FALSE);
4590                         if (!svh)
4591                                 CROAK(("Old tag 0x%"UVxf" should have been mapped already",
4592                                         (UV) tag));
4593                         tagn = SvIV(*svh);      /* Mapped tag number computed earlier below */
4594
4595                         /*
4596                          * The following code is common with the SX_OBJECT case below.
4597                          */
4598
4599                         svh = av_fetch(cxt->aseen, tagn, FALSE);
4600                         if (!svh)
4601                                 CROAK(("Object #%"IVdf" should have been retrieved already",
4602                                         (IV) tagn));
4603                         sv = *svh;
4604                         TRACEME(("has retrieved #%d at 0x%"UVxf, tagn, PTR2UV(sv)));
4605                         SvREFCNT_inc(sv);       /* One more reference to this same sv */
4606                         return sv;                      /* The SV pointer where object was retrieved */
4607                 }
4608
4609                 /*
4610                  * Map new object, but don't increase tagnum. This will be done
4611                  * by each of the retrieve_* functions when they call SEEN().
4612                  *
4613                  * The mapping associates the "tag" initially present with a unique
4614                  * tag number. See test for SX_OBJECT above to see how this is perused.
4615                  */
4616
4617                 if (!hv_store(cxt->hseen, (char *) &tag, sizeof(tag),
4618                                 newSViv(cxt->tagnum), 0))
4619                         return (SV *) 0;
4620
4621                 goto first_time;
4622         }
4623
4624         /*
4625          * Regular post-0.6 binary format.
4626          */
4627
4628         GETMARK(type);
4629
4630         TRACEME(("retrieve type = %d", type));
4631
4632         /*
4633          * Are we dealing with an object we should have already retrieved?
4634          */
4635
4636         if (type == SX_OBJECT) {
4637                 I32 tag;
4638                 READ_I32(tag);
4639                 tag = ntohl(tag);
4640                 svh = av_fetch(cxt->aseen, tag, FALSE);
4641                 if (!svh)
4642                         CROAK(("Object #%"IVdf" should have been retrieved already",
4643                                 (IV) tag));
4644                 sv = *svh;
4645                 TRACEME(("had retrieved #%d at 0x%"UVxf, tag, PTR2UV(sv)));
4646                 SvREFCNT_inc(sv);       /* One more reference to this same sv */
4647                 return sv;                      /* The SV pointer where object was retrieved */
4648         }
4649
4650 first_time:             /* Will disappear when support for old format is dropped */
4651
4652         /*
4653          * Okay, first time through for this one.
4654          */
4655
4656         sv = RETRIEVE(cxt, type)(cxt, cname);
4657         if (!sv)
4658                 return (SV *) 0;                        /* Failed */
4659
4660         /*
4661          * Old binary formats (pre-0.7).
4662          *
4663          * Final notifications, ended by SX_STORED may now follow.
4664          * Currently, the only pertinent notification to apply on the
4665          * freshly retrieved object is either:
4666          *    SX_CLASS <char-len> <classname> for short classnames.
4667          *    SX_LG_CLASS <int-len> <classname> for larger one (rare!).
4668          * Class name is then read into the key buffer pool used by
4669          * hash table key retrieval.
4670          */
4671
4672         if (cxt->ver_major < 2) {
4673                 while ((type = GETCHAR()) != SX_STORED) {
4674                         I32 len;
4675                         switch (type) {
4676                         case SX_CLASS:
4677                                 GETMARK(len);                   /* Length coded on a single char */
4678                                 break;
4679                         case SX_LG_CLASS:                       /* Length coded on a regular integer */
4680                                 RLEN(len);
4681                                 break;
4682                         case EOF:
4683                         default:
4684                                 return (SV *) 0;                /* Failed */
4685                         }
4686                         KBUFCHK(len);                           /* Grow buffer as necessary */
4687                         if (len)
4688                                 READ(kbuf, len);
4689                         kbuf[len] = '\0';                       /* Mark string end */
4690                         BLESS(sv, kbuf);
4691                 }
4692         }
4693
4694         TRACEME(("ok (retrieved 0x%"UVxf", refcnt=%d, %s)", PTR2UV(sv),
4695                 SvREFCNT(sv) - 1, sv_reftype(sv, FALSE)));
4696
4697         return sv;      /* Ok */
4698 }
4699
4700 /*
4701  * do_retrieve
4702  *
4703  * Retrieve data held in file and return the root object.
4704  * Common routine for pretrieve and mretrieve.
4705  */
4706 static SV *do_retrieve(
4707         PerlIO *f,
4708         SV *in,
4709         int optype)
4710 {
4711         dSTCXT;
4712         SV *sv;
4713         int is_tainted;                         /* Is input source tainted? */
4714         int pre_06_fmt = 0;                     /* True with pre Storable 0.6 formats */
4715
4716         TRACEME(("do_retrieve (optype = 0x%x)", optype));
4717
4718         optype |= ST_RETRIEVE;
4719
4720         /*
4721          * Sanity assertions for retrieve dispatch tables.
4722          */
4723
4724         ASSERT(sizeof(sv_old_retrieve) == sizeof(sv_retrieve),
4725                 ("old and new retrieve dispatch table have same size"));
4726         ASSERT(sv_old_retrieve[SX_ERROR] == retrieve_other,
4727                 ("SX_ERROR entry correctly initialized in old dispatch table"));
4728         ASSERT(sv_retrieve[SX_ERROR] == retrieve_other,
4729                 ("SX_ERROR entry correctly initialized in new dispatch table"));
4730
4731         /*
4732          * Workaround for CROAK leak: if they enter with a "dirty" context,
4733          * free up memory for them now.
4734          */
4735
4736         if (cxt->s_dirty)
4737                 clean_context(cxt);
4738
4739         /*
4740          * Now that STORABLE_xxx hooks exist, it is possible that they try to
4741          * re-enter retrieve() via the hooks.
4742          */
4743
4744         if (cxt->entry)
4745                 cxt = allocate_context(cxt);
4746
4747         cxt->entry++;
4748
4749         ASSERT(cxt->entry == 1, ("starting new recursion"));
4750         ASSERT(!cxt->s_dirty, ("clean context"));
4751
4752         /*
4753          * Prepare context.
4754          *
4755          * Data is loaded into the memory buffer when f is NULL, unless `in' is
4756          * also NULL, in which case we're expecting the data to already lie
4757          * in the buffer (dclone case).
4758          */
4759
4760         KBUFINIT();                                     /* Allocate hash key reading pool once */
4761
4762         if (!f && in)
4763                 MBUF_SAVE_AND_LOAD(in);
4764
4765         /*
4766          * Magic number verifications.
4767          *
4768          * This needs to be done before calling init_retrieve_context()
4769          * since the format indication in the file are necessary to conduct
4770          * some of the initializations.
4771          */
4772
4773         cxt->fio = f;                           /* Where I/O are performed */
4774
4775         if (!magic_check(cxt))
4776                 CROAK(("Magic number checking on storable %s failed",
4777                         cxt->fio ? "file" : "string"));
4778
4779         TRACEME(("data stored in %s format",
4780                 cxt->netorder ? "net order" : "native"));
4781
4782         /*
4783          * Check whether input source is tainted, so that we don't wrongly
4784          * taint perfectly good values...
4785          *
4786          * We assume file input is always tainted.  If both `f' and `in' are
4787          * NULL, then we come from dclone, and tainted is already filled in
4788          * the context.  That's a kludge, but the whole dclone() thing is
4789          * already quite a kludge anyway! -- RAM, 15/09/2000.
4790          */
4791
4792         is_tainted = f ? 1 : (in ? SvTAINTED(in) : cxt->s_tainted);
4793         TRACEME(("input source is %s", is_tainted ? "tainted" : "trusted"));
4794         init_retrieve_context(cxt, optype, is_tainted);
4795
4796         ASSERT(is_retrieving(), ("within retrieve operation"));
4797
4798         sv = retrieve(cxt, 0);          /* Recursively retrieve object, get root SV */
4799
4800         /*
4801          * Final cleanup.
4802          */
4803
4804         if (!f && in)
4805                 MBUF_RESTORE();
4806
4807         pre_06_fmt = cxt->hseen != NULL;        /* Before we clean context */
4808
4809         /*
4810          * The "root" context is never freed.
4811          */
4812
4813         clean_retrieve_context(cxt);
4814         if (cxt->prev)                          /* This context was stacked */
4815                 free_context(cxt);              /* It was not the "root" context */
4816
4817         /*
4818          * Prepare returned value.
4819          */
4820
4821         if (!sv) {
4822                 TRACEME(("retrieve ERROR"));
4823                 return &PL_sv_undef;            /* Something went wrong, return undef */
4824         }
4825
4826         TRACEME(("retrieve got %s(0x%"UVxf")",
4827                 sv_reftype(sv, FALSE), PTR2UV(sv)));
4828
4829         /*
4830          * Backward compatibility with Storable-0.5@9 (which we know we
4831          * are retrieving if hseen is non-null): don't create an extra RV
4832          * for objects since we special-cased it at store time.
4833          *
4834          * Build a reference to the SV returned by pretrieve even if it is
4835          * already one and not a scalar, for consistency reasons.
4836          */
4837
4838         if (pre_06_fmt) {                       /* Was not handling overloading by then */
4839                 SV *rv;
4840                 TRACEME(("fixing for old formats -- pre 0.6"));
4841                 if (sv_type(sv) == svis_REF && (rv = SvRV(sv)) && SvOBJECT(rv)) {
4842                         TRACEME(("ended do_retrieve() with an object -- pre 0.6"));
4843                         return sv;
4844                 }
4845         }
4846
4847         /*
4848          * If reference is overloaded, restore behaviour.
4849          *
4850          * NB: minor glitch here: normally, overloaded refs are stored specially
4851          * so that we can croak when behaviour cannot be re-installed, and also
4852          * avoid testing for overloading magic at each reference retrieval.
4853          *
4854          * Unfortunately, the root reference is implicitely stored, so we must
4855          * check for possible overloading now.  Furthermore, if we don't restore
4856          * overloading, we cannot croak as if the original ref was, because we
4857          * have no way to determine whether it was an overloaded ref or not in
4858          * the first place.
4859          *
4860          * It's a pity that overloading magic is attached to the rv, and not to
4861          * the underlying sv as blessing is.
4862          */
4863
4864         if (SvOBJECT(sv)) {
4865                 HV *stash = (HV *) SvSTASH(sv);
4866                 SV *rv = newRV_noinc(sv);
4867                 if (stash && Gv_AMG(stash)) {
4868                         SvAMAGIC_on(rv);
4869                         TRACEME(("restored overloading on root reference"));
4870                 }
4871                 TRACEME(("ended do_retrieve() with an object"));
4872                 return rv;
4873         }
4874
4875         TRACEME(("regular do_retrieve() end"));
4876
4877         return newRV_noinc(sv);
4878 }
4879
4880 /*
4881  * pretrieve
4882  *
4883  * Retrieve data held in file and return the root object, undef on error.
4884  */
4885 SV *pretrieve(PerlIO *f)
4886 {
4887         TRACEME(("pretrieve"));
4888         return do_retrieve(f, Nullsv, 0);
4889 }
4890
4891 /*
4892  * mretrieve
4893  *
4894  * Retrieve data held in scalar and return the root object, undef on error.
4895  */
4896 SV *mretrieve(SV *sv)
4897 {
4898         TRACEME(("mretrieve"));
4899         return do_retrieve((PerlIO*) 0, sv, 0);
4900 }
4901
4902 /***
4903  *** Deep cloning
4904  ***/
4905
4906 /*
4907  * dclone
4908  *
4909  * Deep clone: returns a fresh copy of the original referenced SV tree.
4910  *
4911  * This is achieved by storing the object in memory and restoring from
4912  * there. Not that efficient, but it should be faster than doing it from
4913  * pure perl anyway.
4914  */
4915 SV *dclone(SV *sv)
4916 {
4917         dSTCXT;
4918         int size;
4919         stcxt_t *real_context;
4920         SV *out;
4921
4922         TRACEME(("dclone"));
4923
4924         /*
4925          * Workaround for CROAK leak: if they enter with a "dirty" context,
4926          * free up memory for them now.
4927          */
4928
4929         if (cxt->s_dirty)
4930                 clean_context(cxt);
4931
4932         /*
4933          * do_store() optimizes for dclone by not freeing its context, should
4934          * we need to allocate one because we're deep cloning from a hook.
4935          */
4936
4937         if (!do_store((PerlIO*) 0, sv, ST_CLONE, FALSE, (SV**) 0))
4938                 return &PL_sv_undef;                            /* Error during store */
4939
4940         /*
4941          * Because of the above optimization, we have to refresh the context,
4942          * since a new one could have been allocated and stacked by do_store().
4943          */
4944
4945         { dSTCXT; real_context = cxt; }         /* Sub-block needed for macro */
4946         cxt = real_context;                                     /* And we need this temporary... */
4947
4948         /*
4949          * Now, `cxt' may refer to a new context.
4950          */
4951
4952         ASSERT(!cxt->s_dirty, ("clean context"));
4953         ASSERT(!cxt->entry, ("entry will not cause new context allocation"));
4954
4955         size = MBUF_SIZE();
4956         TRACEME(("dclone stored %d bytes", size));
4957         MBUF_INIT(size);
4958
4959         /*
4960          * Since we're passing do_retrieve() both a NULL file and sv, we need
4961          * to pre-compute the taintedness of the input by setting cxt->tainted
4962          * to whatever state our own input string was.  -- RAM, 15/09/2000
4963          *
4964          * do_retrieve() will free non-root context.
4965          */
4966
4967         cxt->s_tainted = SvTAINTED(sv);
4968         out = do_retrieve((PerlIO*) 0, Nullsv, ST_CLONE);
4969
4970         TRACEME(("dclone returns 0x%"UVxf, PTR2UV(out)));
4971
4972         return out;
4973 }
4974
4975 /***
4976  *** Glue with perl.
4977  ***/
4978
4979 /*
4980  * The Perl IO GV object distinguishes between input and output for sockets
4981  * but not for plain files. To allow Storable to transparently work on
4982  * plain files and sockets transparently, we have to ask xsubpp to fetch the
4983  * right object for us. Hence the OutputStream and InputStream declarations.
4984  *
4985  * Before perl 5.004_05, those entries in the standard typemap are not
4986  * defined in perl include files, so we do that here.
4987  */
4988
4989 #ifndef OutputStream
4990 #define OutputStream    PerlIO *
4991 #define InputStream             PerlIO *
4992 #endif  /* !OutputStream */
4993
4994 MODULE = Storable       PACKAGE = Storable
4995
4996 PROTOTYPES: ENABLE
4997
4998 BOOT:
4999     init_perinterp();
5000
5001 int
5002 pstore(f,obj)
5003 OutputStream    f
5004 SV *    obj
5005
5006 int
5007 net_pstore(f,obj)
5008 OutputStream    f
5009 SV *    obj
5010
5011 SV *
5012 mstore(obj)
5013 SV *    obj
5014
5015 SV *
5016 net_mstore(obj)
5017 SV *    obj
5018
5019 SV *
5020 pretrieve(f)
5021 InputStream     f
5022
5023 SV *
5024 mretrieve(sv)
5025 SV *    sv
5026
5027 SV *
5028 dclone(sv)
5029 SV *    sv
5030
5031 int
5032 last_op_in_netorder()
5033
5034 int
5035 is_storing()
5036
5037 int
5038 is_retrieving()
5039