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