Re: [Another bug] Re: about Storable perl module (again)
[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 & SVf_POK) {
1840             /* public string - go direct to string read.  */
1841             goto string_readlen;
1842         } else if (
1843 #if (PATCHLEVEL <= 6)
1844             /* For 5.6 and earlier NV flag trumps IV flag, so only use integer
1845                direct if NV flag is off.  */
1846             (flags & (SVf_NOK | SVf_IOK)) == SVf_IOK
1847 #else
1848             /* 5.7 rules are that if IV public flag is set, IV value is as
1849                good, if not better, than NV value.  */
1850             flags & SVf_IOK
1851 #endif
1852             ) {
1853             iv = SvIV(sv);
1854             /*
1855              * Will come here from below with iv set if double is an integer.
1856              */
1857           integer:
1858
1859             /* Sorry. This isn't in 5.005_56 (IIRC) or earlier.  */
1860 #ifdef SVf_IVisUV
1861             /* Need to do this out here, else 0xFFFFFFFF becomes iv of -1
1862              * (for example) and that ends up in the optimised small integer
1863              * case. 
1864              */
1865             if ((flags & SVf_IVisUV) && SvUV(sv) > IV_MAX) {
1866                 TRACEME(("large unsigned integer as string, value = %"UVuf, SvUV(sv)));
1867                 goto string_readlen;
1868             }
1869 #endif
1870             /*
1871              * Optimize small integers into a single byte, otherwise store as
1872              * a real integer (converted into network order if they asked).
1873              */
1874
1875             if (iv >= -128 && iv <= 127) {
1876                 unsigned char siv = (unsigned char) (iv + 128); /* [0,255] */
1877                 PUTMARK(SX_BYTE);
1878                 PUTMARK(siv);
1879                 TRACEME(("small integer stored as %d", siv));
1880             } else if (cxt->netorder) {
1881 #ifndef HAS_HTONL
1882                 TRACEME(("no htonl, fall back to string for integer"));
1883                 goto string_readlen;
1884 #else
1885                 I32 niv;
1886
1887
1888 #if IVSIZE > 4
1889                 if (
1890 #ifdef SVf_IVisUV
1891                     /* Sorry. This isn't in 5.005_56 (IIRC) or earlier.  */
1892                     ((flags & SVf_IVisUV) && SvUV(sv) > 0x7FFFFFFF) ||
1893 #endif
1894                     (iv > 0x7FFFFFFF) || (iv < -0x80000000)) {
1895                     /* Bigger than 32 bits.  */
1896                     TRACEME(("large network order integer as string, value = %"IVdf, iv));
1897                     goto string_readlen;
1898                 }
1899 #endif
1900
1901                 niv = (I32) htonl((I32) iv);
1902                 TRACEME(("using network order"));
1903                 PUTMARK(SX_NETINT);
1904                 WRITE_I32(niv);
1905 #endif
1906             } else {
1907                 PUTMARK(SX_INTEGER);
1908                 WRITE(&iv, sizeof(iv));
1909             }
1910             
1911             TRACEME(("ok (integer 0x%"UVxf", value = %"IVdf")", PTR2UV(sv), iv));
1912         } else if (flags & SVf_NOK) {
1913             NV nv;
1914 #if (PATCHLEVEL <= 6)
1915             nv = SvNV(sv);
1916             /*
1917              * Watch for number being an integer in disguise.
1918              */
1919             if (nv == (NV) (iv = I_V(nv))) {
1920                 TRACEME(("double %"NVff" is actually integer %"IVdf, nv, iv));
1921                 goto integer;           /* Share code above */
1922             }
1923 #else
1924
1925             SvIV_please(sv);
1926             if (SvIOK(sv)) {
1927                 iv = SvIV(sv);
1928                 goto integer;           /* Share code above */
1929             }
1930             nv = SvNV(sv);
1931 #endif
1932
1933             if (cxt->netorder) {
1934                 TRACEME(("double %"NVff" stored as string", nv));
1935                 goto string_readlen;            /* Share code below */
1936             }
1937
1938             PUTMARK(SX_DOUBLE);
1939             WRITE(&nv, sizeof(nv));
1940
1941             TRACEME(("ok (double 0x%"UVxf", value = %"NVff")", PTR2UV(sv), nv));
1942
1943         } else if (flags & (SVp_POK | SVp_NOK | SVp_IOK)) {
1944             I32 wlen; /* For 64-bit machines */
1945
1946           string_readlen:
1947             pv = SvPV(sv, len);
1948
1949             /*
1950              * Will come here from above  if it was readonly, POK and NOK but
1951              * neither &PL_sv_yes nor &PL_sv_no.
1952              */
1953           string:
1954
1955             wlen = (I32) len; /* WLEN via STORE_SCALAR expects I32 */
1956             if (SvUTF8 (sv))
1957                 STORE_UTF8STR(pv, wlen);
1958             else
1959                 STORE_SCALAR(pv, wlen);
1960             TRACEME(("ok (scalar 0x%"UVxf" '%s', length = %"IVdf")",
1961                      PTR2UV(sv), SvPVX(sv), (IV)len));
1962         } else
1963             CROAK(("Can't determine type of %s(0x%"UVxf")",
1964                    sv_reftype(sv, FALSE),
1965                    PTR2UV(sv)));
1966         return 0;               /* Ok, no recursion on scalars */
1967 }
1968
1969 /*
1970  * store_array
1971  *
1972  * Store an array.
1973  *
1974  * Layout is SX_ARRAY <size> followed by each item, in increading index order.
1975  * Each item is stored as <object>.
1976  */
1977 static int store_array(stcxt_t *cxt, AV *av)
1978 {
1979         SV **sav;
1980         I32 len = av_len(av) + 1;
1981         I32 i;
1982         int ret;
1983
1984         TRACEME(("store_array (0x%"UVxf")", PTR2UV(av)));
1985
1986         /* 
1987          * Signal array by emitting SX_ARRAY, followed by the array length.
1988          */
1989
1990         PUTMARK(SX_ARRAY);
1991         WLEN(len);
1992         TRACEME(("size = %d", len));
1993
1994         /*
1995          * Now store each item recursively.
1996          */
1997
1998         for (i = 0; i < len; i++) {
1999                 sav = av_fetch(av, i, 0);
2000                 if (!sav) {
2001                         TRACEME(("(#%d) undef item", i));
2002                         STORE_UNDEF();
2003                         continue;
2004                 }
2005                 TRACEME(("(#%d) item", i));
2006                 if ((ret = store(cxt, *sav)))   /* Extra () for -Wall, grr... */
2007                         return ret;
2008         }
2009
2010         TRACEME(("ok (array)"));
2011
2012         return 0;
2013 }
2014
2015 /*
2016  * sortcmp
2017  *
2018  * Sort two SVs
2019  * Borrowed from perl source file pp_ctl.c, where it is used by pp_sort.
2020  */
2021 static int
2022 sortcmp(const void *a, const void *b)
2023 {
2024         return sv_cmp(*(SV * const *) a, *(SV * const *) b);
2025 }
2026
2027
2028 /*
2029  * store_hash
2030  *
2031  * Store a hash table.
2032  *
2033  * For a "normal" hash (not restricted, no utf8 keys):
2034  *
2035  * Layout is SX_HASH <size> followed by each key/value pair, in random order.
2036  * Values are stored as <object>.
2037  * Keys are stored as <length> <data>, the <data> section being omitted
2038  * if length is 0.
2039  *
2040  * For a "fancy" hash (restricted or utf8 keys):
2041  *
2042  * Layout is SX_FLAG_HASH <size> <hash flags> followed by each key/value pair,
2043  * in random order.
2044  * Values are stored as <object>.
2045  * Keys are stored as <flags> <length> <data>, the <data> section being omitted
2046  * if length is 0.
2047  * Currently the only hash flag is "restriced"
2048  * Key flags are as for hv.h
2049  */
2050 static int store_hash(stcxt_t *cxt, HV *hv)
2051 {
2052         I32 len = 
2053 #ifdef HAS_RESTRICTED_HASHES
2054             HvTOTALKEYS(hv);
2055 #else
2056             HvKEYS(hv);
2057 #endif
2058         I32 i;
2059         int ret = 0;
2060         I32 riter;
2061         HE *eiter;
2062         int flagged_hash = ((SvREADONLY(hv)
2063 #ifdef HAS_HASH_KEY_FLAGS
2064                              || HvHASKFLAGS(hv)
2065 #endif
2066                                 ) ? 1 : 0);
2067         unsigned char hash_flags = (SvREADONLY(hv) ? SHV_RESTRICTED : 0);
2068
2069         if (flagged_hash) {
2070             /* needs int cast for C++ compilers, doesn't it?  */
2071             TRACEME(("store_hash (0x%"UVxf") (flags %x)", PTR2UV(hv),
2072                      (int) hash_flags));
2073         } else {
2074             TRACEME(("store_hash (0x%"UVxf")", PTR2UV(hv)));
2075         }
2076
2077         /* 
2078          * Signal hash by emitting SX_HASH, followed by the table length.
2079          */
2080
2081         if (flagged_hash) {
2082             PUTMARK(SX_FLAG_HASH);
2083             PUTMARK(hash_flags);
2084         } else {
2085             PUTMARK(SX_HASH);
2086         }
2087         WLEN(len);
2088         TRACEME(("size = %d", len));
2089
2090         /*
2091          * Save possible iteration state via each() on that table.
2092          */
2093
2094         riter = HvRITER(hv);
2095         eiter = HvEITER(hv);
2096         hv_iterinit(hv);
2097
2098         /*
2099          * Now store each item recursively.
2100          *
2101      * If canonical is defined to some true value then store each
2102      * key/value pair in sorted order otherwise the order is random.
2103          * Canonical order is irrelevant when a deep clone operation is performed.
2104          *
2105          * Fetch the value from perl only once per store() operation, and only
2106          * when needed.
2107          */
2108
2109         if (
2110                 !(cxt->optype & ST_CLONE) && (cxt->canonical == 1 ||
2111                 (cxt->canonical < 0 && (cxt->canonical =
2112                         (SvTRUE(perl_get_sv("Storable::canonical", TRUE)) ? 1 : 0))))
2113         ) {
2114                 /*
2115                  * Storing in order, sorted by key.
2116                  * Run through the hash, building up an array of keys in a
2117                  * mortal array, sort the array and then run through the
2118                  * array.  
2119                  */
2120
2121                 AV *av = newAV();
2122
2123                 /*av_extend (av, len);*/
2124
2125                 TRACEME(("using canonical order"));
2126
2127                 for (i = 0; i < len; i++) {
2128 #ifdef HAS_RESTRICTED_HASHES
2129                         HE *he = hv_iternext_flags(hv, HV_ITERNEXT_WANTPLACEHOLDERS);
2130 #else
2131                         HE *he = hv_iternext(hv);
2132 #endif
2133                         SV *key = hv_iterkeysv(he);
2134                         av_store(av, AvFILLp(av)+1, key);       /* av_push(), really */
2135                 }
2136                         
2137                 qsort((char *) AvARRAY(av), len, sizeof(SV *), sortcmp);
2138
2139                 for (i = 0; i < len; i++) {
2140                         unsigned char flags;
2141                         char *keyval;
2142                         STRLEN keylen_tmp;
2143                         I32 keylen;
2144                         SV *key = av_shift(av);
2145                         HE *he  = hv_fetch_ent(hv, key, 0, 0);
2146                         SV *val = HeVAL(he);
2147                         if (val == 0)
2148                                 return 1;               /* Internal error, not I/O error */
2149                         
2150                         /*
2151                          * Store value first.
2152                          */
2153                         
2154                         TRACEME(("(#%d) value 0x%"UVxf, i, PTR2UV(val)));
2155
2156                         if ((ret = store(cxt, val)))    /* Extra () for -Wall, grr... */
2157                                 goto out;
2158
2159                         /*
2160                          * Write key string.
2161                          * Keys are written after values to make sure retrieval
2162                          * can be optimal in terms of memory usage, where keys are
2163                          * read into a fixed unique buffer called kbuf.
2164                          * See retrieve_hash() for details.
2165                          */
2166                          
2167                         /* Implementation of restricted hashes isn't nicely
2168                            abstracted:  */
2169                         flags
2170                             = (((hash_flags & SHV_RESTRICTED)
2171                                 && SvREADONLY(val))
2172                                ? SHV_K_LOCKED : 0);
2173                         if (val == &PL_sv_undef)
2174                             flags |= SHV_K_PLACEHOLDER;
2175
2176                         keyval = SvPV(key, keylen_tmp);
2177                         keylen = keylen_tmp;
2178 #ifdef HAS_UTF8_HASHES
2179                         /* If you build without optimisation on pre 5.6
2180                            then nothing spots that SvUTF8(key) is always 0,
2181                            so the block isn't optimised away, at which point
2182                            the linker dislikes the reference to
2183                            bytes_from_utf8.  */
2184                         if (SvUTF8(key)) {
2185                             const char *keysave = keyval;
2186                             bool is_utf8 = TRUE;
2187
2188                             /* Just casting the &klen to (STRLEN) won't work
2189                                well if STRLEN and I32 are of different widths.
2190                                --jhi */
2191                             keyval = (char*)bytes_from_utf8((U8*)keyval,
2192                                                             &keylen_tmp,
2193                                                             &is_utf8);
2194
2195                             /* If we were able to downgrade here, then than
2196                                means that we have  a key which only had chars
2197                                0-255, but was utf8 encoded.  */
2198
2199                             if (keyval != keysave) {
2200                                 keylen = keylen_tmp;
2201                                 flags |= SHV_K_WASUTF8;
2202                             } else {
2203                                 /* keylen_tmp can't have changed, so no need
2204                                    to assign back to keylen.  */
2205                                 flags |= SHV_K_UTF8;
2206                             }
2207                         }
2208 #endif
2209
2210                         if (flagged_hash) {
2211                             PUTMARK(flags);
2212                             TRACEME(("(#%d) key '%s' flags %x %u", i, keyval, flags, *keyval));
2213                         } else {
2214                             assert (flags == 0);
2215                             TRACEME(("(#%d) key '%s'", i, keyval));
2216                         }
2217                         WLEN(keylen);
2218                         if (keylen)
2219                                 WRITE(keyval, keylen);
2220                         if (flags & SHV_K_WASUTF8)
2221                             Safefree (keyval);
2222                 }
2223
2224                 /* 
2225                  * Free up the temporary array
2226                  */
2227
2228                 av_undef(av);
2229                 sv_free((SV *) av);
2230
2231         } else {
2232
2233                 /*
2234                  * Storing in "random" order (in the order the keys are stored
2235                  * within the the hash).  This is the default and will be faster!
2236                  */
2237   
2238                 for (i = 0; i < len; i++) {
2239                         char *key;
2240                         I32 len;
2241                         unsigned char flags;
2242 #ifdef HV_ITERNEXT_WANTPLACEHOLDERS
2243                         HE *he = hv_iternext_flags(hv, HV_ITERNEXT_WANTPLACEHOLDERS);
2244 #else
2245                         HE *he = hv_iternext(hv);
2246 #endif
2247                         SV *val = (he ? hv_iterval(hv, he) : 0);
2248                         SV *key_sv = NULL;
2249                         HEK *hek;
2250
2251                         if (val == 0)
2252                                 return 1;               /* Internal error, not I/O error */
2253
2254                         /*
2255                          * Store value first.
2256                          */
2257
2258                         TRACEME(("(#%d) value 0x%"UVxf, i, PTR2UV(val)));
2259
2260                         if ((ret = store(cxt, val)))    /* Extra () for -Wall, grr... */
2261                                 goto out;
2262
2263                         /* Implementation of restricted hashes isn't nicely
2264                            abstracted:  */
2265                         flags
2266                             = (((hash_flags & SHV_RESTRICTED)
2267                                 && SvREADONLY(val))
2268                                              ? SHV_K_LOCKED : 0);
2269                         if (val == &PL_sv_undef)
2270                             flags |= SHV_K_PLACEHOLDER;
2271
2272                         hek = HeKEY_hek(he);
2273                         len = HEK_LEN(hek);
2274                         if (len == HEf_SVKEY) {
2275                             /* This is somewhat sick, but the internal APIs are
2276                              * such that XS code could put one of these in in
2277                              * a regular hash.
2278                              * Maybe we should be capable of storing one if
2279                              * found.
2280                              */
2281                             key_sv = HeKEY_sv(he);
2282                             flags |= SHV_K_ISSV;
2283                         } else {
2284                             /* Regular string key. */
2285 #ifdef HAS_HASH_KEY_FLAGS
2286                             if (HEK_UTF8(hek))
2287                                 flags |= SHV_K_UTF8;
2288                             if (HEK_WASUTF8(hek))
2289                                 flags |= SHV_K_WASUTF8;
2290 #endif
2291                             key = HEK_KEY(hek);
2292                         }
2293                         /*
2294                          * Write key string.
2295                          * Keys are written after values to make sure retrieval
2296                          * can be optimal in terms of memory usage, where keys are
2297                          * read into a fixed unique buffer called kbuf.
2298                          * See retrieve_hash() for details.
2299                          */
2300
2301                         if (flagged_hash) {
2302                             PUTMARK(flags);
2303                             TRACEME(("(#%d) key '%s' flags %x", i, key, flags));
2304                         } else {
2305                             assert (flags == 0);
2306                             TRACEME(("(#%d) key '%s'", i, key));
2307                         }
2308                         if (flags & SHV_K_ISSV) {
2309                             store(cxt, key_sv);
2310                         } else {
2311                             WLEN(len);
2312                             if (len)
2313                                 WRITE(key, len);
2314                         }
2315                 }
2316     }
2317
2318         TRACEME(("ok (hash 0x%"UVxf")", PTR2UV(hv)));
2319
2320 out:
2321         HvRITER(hv) = riter;            /* Restore hash iterator state */
2322         HvEITER(hv) = eiter;
2323
2324         return ret;
2325 }
2326
2327 /*
2328  * store_tied
2329  *
2330  * When storing a tied object (be it a tied scalar, array or hash), we lay out
2331  * a special mark, followed by the underlying tied object. For instance, when
2332  * dealing with a tied hash, we store SX_TIED_HASH <hash object>, where
2333  * <hash object> stands for the serialization of the tied hash.
2334  */
2335 static int store_tied(stcxt_t *cxt, SV *sv)
2336 {
2337         MAGIC *mg;
2338         int ret = 0;
2339         int svt = SvTYPE(sv);
2340         char mtype = 'P';
2341
2342         TRACEME(("store_tied (0x%"UVxf")", PTR2UV(sv)));
2343
2344         /*
2345          * We have a small run-time penalty here because we chose to factorise
2346          * all tieds objects into the same routine, and not have a store_tied_hash,
2347          * a store_tied_array, etc...
2348          *
2349          * Don't use a switch() statement, as most compilers don't optimize that
2350          * well for 2/3 values. An if() else if() cascade is just fine. We put
2351          * tied hashes first, as they are the most likely beasts.
2352          */
2353
2354         if (svt == SVt_PVHV) {
2355                 TRACEME(("tied hash"));
2356                 PUTMARK(SX_TIED_HASH);                  /* Introduces tied hash */
2357         } else if (svt == SVt_PVAV) {
2358                 TRACEME(("tied array"));
2359                 PUTMARK(SX_TIED_ARRAY);                 /* Introduces tied array */
2360         } else {
2361                 TRACEME(("tied scalar"));
2362                 PUTMARK(SX_TIED_SCALAR);                /* Introduces tied scalar */
2363                 mtype = 'q';
2364         }
2365
2366         if (!(mg = mg_find(sv, mtype)))
2367                 CROAK(("No magic '%c' found while storing tied %s", mtype,
2368                         (svt == SVt_PVHV) ? "hash" :
2369                                 (svt == SVt_PVAV) ? "array" : "scalar"));
2370
2371         /*
2372          * The mg->mg_obj found by mg_find() above actually points to the
2373          * underlying tied Perl object implementation. For instance, if the
2374          * original SV was that of a tied array, then mg->mg_obj is an AV.
2375          *
2376          * Note that we store the Perl object as-is. We don't call its FETCH
2377          * method along the way. At retrieval time, we won't call its STORE
2378          * method either, but the tieing magic will be re-installed. In itself,
2379          * that ensures that the tieing semantics are preserved since futher
2380          * accesses on the retrieved object will indeed call the magic methods...
2381          */
2382
2383         if ((ret = store(cxt, mg->mg_obj)))             /* Extra () for -Wall, grr... */
2384                 return ret;
2385
2386         TRACEME(("ok (tied)"));
2387
2388         return 0;
2389 }
2390
2391 /*
2392  * store_tied_item
2393  *
2394  * Stores a reference to an item within a tied structure:
2395  *
2396  *  . \$h{key}, stores both the (tied %h) object and 'key'.
2397  *  . \$a[idx], stores both the (tied @a) object and 'idx'.
2398  *
2399  * Layout is therefore either:
2400  *     SX_TIED_KEY <object> <key>
2401  *     SX_TIED_IDX <object> <index>
2402  */
2403 static int store_tied_item(stcxt_t *cxt, SV *sv)
2404 {
2405         MAGIC *mg;
2406         int ret;
2407
2408         TRACEME(("store_tied_item (0x%"UVxf")", PTR2UV(sv)));
2409
2410         if (!(mg = mg_find(sv, 'p')))
2411                 CROAK(("No magic 'p' found while storing reference to tied item"));
2412
2413         /*
2414          * We discriminate between \$h{key} and \$a[idx] via mg_ptr.
2415          */
2416
2417         if (mg->mg_ptr) {
2418                 TRACEME(("store_tied_item: storing a ref to a tied hash item"));
2419                 PUTMARK(SX_TIED_KEY);
2420                 TRACEME(("store_tied_item: storing OBJ 0x%"UVxf, PTR2UV(mg->mg_obj)));
2421
2422                 if ((ret = store(cxt, mg->mg_obj)))             /* Extra () for -Wall, grr... */
2423                         return ret;
2424
2425                 TRACEME(("store_tied_item: storing PTR 0x%"UVxf, PTR2UV(mg->mg_ptr)));
2426
2427                 if ((ret = store(cxt, (SV *) mg->mg_ptr)))      /* Idem, for -Wall */
2428                         return ret;
2429         } else {
2430                 I32 idx = mg->mg_len;
2431
2432                 TRACEME(("store_tied_item: storing a ref to a tied array item "));
2433                 PUTMARK(SX_TIED_IDX);
2434                 TRACEME(("store_tied_item: storing OBJ 0x%"UVxf, PTR2UV(mg->mg_obj)));
2435
2436                 if ((ret = store(cxt, mg->mg_obj)))             /* Idem, for -Wall */
2437                         return ret;
2438
2439                 TRACEME(("store_tied_item: storing IDX %d", idx));
2440
2441                 WLEN(idx);
2442         }
2443
2444         TRACEME(("ok (tied item)"));
2445
2446         return 0;
2447 }
2448
2449 /*
2450  * store_hook           -- dispatched manually, not via sv_store[]
2451  *
2452  * The blessed SV is serialized by a hook.
2453  *
2454  * Simple Layout is:
2455  *
2456  *     SX_HOOK <flags> <len> <classname> <len2> <str> [<len3> <object-IDs>]
2457  *
2458  * where <flags> indicates how long <len>, <len2> and <len3> are, whether
2459  * the trailing part [] is present, the type of object (scalar, array or hash).
2460  * There is also a bit which says how the classname is stored between:
2461  *
2462  *     <len> <classname>
2463  *     <index>
2464  *
2465  * and when the <index> form is used (classname already seen), the "large
2466  * classname" bit in <flags> indicates how large the <index> is.
2467  * 
2468  * The serialized string returned by the hook is of length <len2> and comes
2469  * next.  It is an opaque string for us.
2470  *
2471  * Those <len3> object IDs which are listed last represent the extra references
2472  * not directly serialized by the hook, but which are linked to the object.
2473  *
2474  * When recursion is mandated to resolve object-IDs not yet seen, we have
2475  * instead, with <header> being flags with bits set to indicate the object type
2476  * and that recursion was indeed needed:
2477  *
2478  *     SX_HOOK <header> <object> <header> <object> <flags>
2479  *
2480  * that same header being repeated between serialized objects obtained through
2481  * recursion, until we reach flags indicating no recursion, at which point
2482  * we know we've resynchronized with a single layout, after <flags>.
2483  *
2484  * When storing a blessed ref to a tied variable, the following format is
2485  * used:
2486  *
2487  *     SX_HOOK <flags> <extra> ... [<len3> <object-IDs>] <magic object>
2488  *
2489  * The first <flags> indication carries an object of type SHT_EXTRA, and the
2490  * real object type is held in the <extra> flag.  At the very end of the
2491  * serialization stream, the underlying magic object is serialized, just like
2492  * any other tied variable.
2493  */
2494 static int store_hook(
2495         stcxt_t *cxt,
2496         SV *sv,
2497         int type,
2498         HV *pkg,
2499         SV *hook)
2500 {
2501         I32 len;
2502         char *class;
2503         STRLEN len2;
2504         SV *ref;
2505         AV *av;
2506         SV **ary;
2507         int count;                              /* really len3 + 1 */
2508         unsigned char flags;
2509         char *pv;
2510         int i;
2511         int recursed = 0;               /* counts recursion */
2512         int obj_type;                   /* object type, on 2 bits */
2513         I32 classnum;
2514         int ret;
2515         int clone = cxt->optype & ST_CLONE;
2516         char mtype = '\0';                              /* for blessed ref to tied structures */
2517         unsigned char eflags = '\0';    /* used when object type is SHT_EXTRA */
2518
2519         TRACEME(("store_hook, class \"%s\", tagged #%d", HvNAME(pkg), cxt->tagnum));
2520
2521         /*
2522          * Determine object type on 2 bits.
2523          */
2524
2525         switch (type) {
2526         case svis_SCALAR:
2527                 obj_type = SHT_SCALAR;
2528                 break;
2529         case svis_ARRAY:
2530                 obj_type = SHT_ARRAY;
2531                 break;
2532         case svis_HASH:
2533                 obj_type = SHT_HASH;
2534                 break;
2535         case svis_TIED:
2536                 /*
2537                  * Produced by a blessed ref to a tied data structure, $o in the
2538                  * following Perl code.
2539                  *
2540                  *      my %h;
2541                  *  tie %h, 'FOO';
2542                  *      my $o = bless \%h, 'BAR';
2543                  *
2544                  * Signal the tie-ing magic by setting the object type as SHT_EXTRA
2545                  * (since we have only 2 bits in <flags> to store the type), and an
2546                  * <extra> byte flag will be emitted after the FIRST <flags> in the
2547                  * stream, carrying what we put in `eflags'.
2548                  */
2549                 obj_type = SHT_EXTRA;
2550                 switch (SvTYPE(sv)) {
2551                 case SVt_PVHV:
2552                         eflags = (unsigned char) SHT_THASH;
2553                         mtype = 'P';
2554                         break;
2555                 case SVt_PVAV:
2556                         eflags = (unsigned char) SHT_TARRAY;
2557                         mtype = 'P';
2558                         break;
2559                 default:
2560                         eflags = (unsigned char) SHT_TSCALAR;
2561                         mtype = 'q';
2562                         break;
2563                 }
2564                 break;
2565         default:
2566                 CROAK(("Unexpected object type (%d) in store_hook()", type));
2567         }
2568         flags = SHF_NEED_RECURSE | obj_type;
2569
2570         class = HvNAME(pkg);
2571         len = strlen(class);
2572
2573         /*
2574          * To call the hook, we need to fake a call like:
2575          *
2576          *    $object->STORABLE_freeze($cloning);
2577          *
2578          * but we don't have the $object here.  For instance, if $object is
2579          * a blessed array, what we have in `sv' is the array, and we can't
2580          * call a method on those.
2581          *
2582          * Therefore, we need to create a temporary reference to the object and
2583          * make the call on that reference.
2584          */
2585
2586         TRACEME(("about to call STORABLE_freeze on class %s", class));
2587
2588         ref = newRV_noinc(sv);                          /* Temporary reference */
2589         av = array_call(ref, hook, clone);      /* @a = $object->STORABLE_freeze($c) */
2590         SvRV(ref) = 0;
2591         SvREFCNT_dec(ref);                                      /* Reclaim temporary reference */
2592
2593         count = AvFILLp(av) + 1;
2594         TRACEME(("store_hook, array holds %d items", count));
2595
2596         /*
2597          * If they return an empty list, it means they wish to ignore the
2598          * hook for this class (and not just this instance -- that's for them
2599          * to handle if they so wish).
2600          *
2601          * Simply disable the cached entry for the hook (it won't be recomputed
2602          * since it's present in the cache) and recurse to store_blessed().
2603          */
2604
2605         if (!count) {
2606                 /*
2607                  * They must not change their mind in the middle of a serialization.
2608                  */
2609
2610                 if (hv_fetch(cxt->hclass, class, len, FALSE))
2611                         CROAK(("Too late to ignore hooks for %s class \"%s\"",
2612                                 (cxt->optype & ST_CLONE) ? "cloning" : "storing", class));
2613         
2614                 pkg_hide(cxt->hook, pkg, "STORABLE_freeze");
2615
2616                 ASSERT(!pkg_can(cxt->hook, pkg, "STORABLE_freeze"), ("hook invisible"));
2617                 TRACEME(("ignoring STORABLE_freeze in class \"%s\"", class));
2618
2619                 return store_blessed(cxt, sv, type, pkg);
2620         }
2621
2622         /*
2623          * Get frozen string.
2624          */
2625
2626         ary = AvARRAY(av);
2627         pv = SvPV(ary[0], len2);
2628
2629         /*
2630          * If they returned more than one item, we need to serialize some
2631          * extra references if not already done.
2632          *
2633          * Loop over the array, starting at postion #1, and for each item,
2634          * ensure it is a reference, serialize it if not already done, and
2635          * replace the entry with the tag ID of the corresponding serialized
2636          * object.
2637          *
2638          * We CHEAT by not calling av_fetch() and read directly within the
2639          * array, for speed.
2640          */
2641
2642         for (i = 1; i < count; i++) {
2643                 SV **svh;
2644                 SV *rsv = ary[i];
2645                 SV *xsv;
2646                 AV *av_hook = cxt->hook_seen;
2647
2648                 if (!SvROK(rsv))
2649                         CROAK(("Item #%d returned by STORABLE_freeze "
2650                                 "for %s is not a reference", i, class));
2651                 xsv = SvRV(rsv);                /* Follow ref to know what to look for */
2652
2653                 /*
2654                  * Look in hseen and see if we have a tag already.
2655                  * Serialize entry if not done already, and get its tag.
2656                  */
2657
2658                 if ((svh = hv_fetch(cxt->hseen, (char *) &xsv, sizeof(xsv), FALSE)))
2659                         goto sv_seen;           /* Avoid moving code too far to the right */
2660
2661                 TRACEME(("listed object %d at 0x%"UVxf" is unknown", i-1, PTR2UV(xsv)));
2662
2663                 /*
2664                  * We need to recurse to store that object and get it to be known
2665                  * so that we can resolve the list of object-IDs at retrieve time.
2666                  *
2667                  * The first time we do this, we need to emit the proper header
2668                  * indicating that we recursed, and what the type of object is (the
2669                  * object we're storing via a user-hook).  Indeed, during retrieval,
2670                  * we'll have to create the object before recursing to retrieve the
2671                  * others, in case those would point back at that object.
2672                  */
2673
2674                 /* [SX_HOOK] <flags> [<extra>] <object>*/
2675                 if (!recursed++) {
2676                         PUTMARK(SX_HOOK);
2677                         PUTMARK(flags);
2678                         if (obj_type == SHT_EXTRA)
2679                                 PUTMARK(eflags);
2680                 } else
2681                         PUTMARK(flags);
2682
2683                 if ((ret = store(cxt, xsv)))    /* Given by hook for us to store */
2684                         return ret;
2685
2686                 svh = hv_fetch(cxt->hseen, (char *) &xsv, sizeof(xsv), FALSE);
2687                 if (!svh)
2688                         CROAK(("Could not serialize item #%d from hook in %s", i, class));
2689
2690                 /*
2691                  * It was the first time we serialized `xsv'.
2692                  *
2693                  * Keep this SV alive until the end of the serialization: if we
2694                  * disposed of it right now by decrementing its refcount, and it was
2695                  * a temporary value, some next temporary value allocated during
2696                  * another STORABLE_freeze might take its place, and we'd wrongly
2697                  * assume that new SV was already serialized, based on its presence
2698                  * in cxt->hseen.
2699                  *
2700                  * Therefore, push it away in cxt->hook_seen.
2701                  */
2702
2703                 av_store(av_hook, AvFILLp(av_hook)+1, SvREFCNT_inc(xsv));
2704
2705         sv_seen:
2706                 /*
2707                  * Dispose of the REF they returned.  If we saved the `xsv' away
2708                  * in the array of returned SVs, that will not cause the underlying
2709                  * referenced SV to be reclaimed.
2710                  */
2711
2712                 ASSERT(SvREFCNT(xsv) > 1, ("SV will survive disposal of its REF"));
2713                 SvREFCNT_dec(rsv);                      /* Dispose of reference */
2714
2715                 /*
2716                  * Replace entry with its tag (not a real SV, so no refcnt increment)
2717                  */
2718
2719                 ary[i] = *svh;
2720                 TRACEME(("listed object %d at 0x%"UVxf" is tag #%"UVuf,
2721                          i-1, PTR2UV(xsv), PTR2UV(*svh)));
2722         }
2723
2724         /*
2725          * Allocate a class ID if not already done.
2726          *
2727          * This needs to be done after the recursion above, since at retrieval
2728          * time, we'll see the inner objects first.  Many thanks to
2729          * Salvador Ortiz Garcia <sog@msg.com.mx> who spot that bug and
2730          * proposed the right fix.  -- RAM, 15/09/2000
2731          */
2732
2733         if (!known_class(cxt, class, len, &classnum)) {
2734                 TRACEME(("first time we see class %s, ID = %d", class, classnum));
2735                 classnum = -1;                          /* Mark: we must store classname */
2736         } else {
2737                 TRACEME(("already seen class %s, ID = %d", class, classnum));
2738         }
2739
2740         /*
2741          * Compute leading flags.
2742          */
2743
2744         flags = obj_type;
2745         if (((classnum == -1) ? len : classnum) > LG_SCALAR)
2746                 flags |= SHF_LARGE_CLASSLEN;
2747         if (classnum != -1)
2748                 flags |= SHF_IDX_CLASSNAME;
2749         if (len2 > LG_SCALAR)
2750                 flags |= SHF_LARGE_STRLEN;
2751         if (count > 1)
2752                 flags |= SHF_HAS_LIST;
2753         if (count > (LG_SCALAR + 1))
2754                 flags |= SHF_LARGE_LISTLEN;
2755
2756         /* 
2757          * We're ready to emit either serialized form:
2758          *
2759          *   SX_HOOK <flags> <len> <classname> <len2> <str> [<len3> <object-IDs>]
2760          *   SX_HOOK <flags> <index>           <len2> <str> [<len3> <object-IDs>]
2761          *
2762          * If we recursed, the SX_HOOK has already been emitted.
2763          */
2764
2765         TRACEME(("SX_HOOK (recursed=%d) flags=0x%x "
2766                         "class=%"IVdf" len=%"IVdf" len2=%"IVdf" len3=%d",
2767                  recursed, flags, (IV)classnum, (IV)len, (IV)len2, count-1));
2768
2769         /* SX_HOOK <flags> [<extra>] */
2770         if (!recursed) {
2771                 PUTMARK(SX_HOOK);
2772                 PUTMARK(flags);
2773                 if (obj_type == SHT_EXTRA)
2774                         PUTMARK(eflags);
2775         } else
2776                 PUTMARK(flags);
2777
2778         /* <len> <classname> or <index> */
2779         if (flags & SHF_IDX_CLASSNAME) {
2780                 if (flags & SHF_LARGE_CLASSLEN)
2781                         WLEN(classnum);
2782                 else {
2783                         unsigned char cnum = (unsigned char) classnum;
2784                         PUTMARK(cnum);
2785                 }
2786         } else {
2787                 if (flags & SHF_LARGE_CLASSLEN)
2788                         WLEN(len);
2789                 else {
2790                         unsigned char clen = (unsigned char) len;
2791                         PUTMARK(clen);
2792                 }
2793                 WRITE(class, len);              /* Final \0 is omitted */
2794         }
2795
2796         /* <len2> <frozen-str> */
2797         if (flags & SHF_LARGE_STRLEN) {
2798                 I32 wlen2 = len2;               /* STRLEN might be 8 bytes */
2799                 WLEN(wlen2);                    /* Must write an I32 for 64-bit machines */
2800         } else {
2801                 unsigned char clen = (unsigned char) len2;
2802                 PUTMARK(clen);
2803         }
2804         if (len2)
2805                 WRITE(pv, (SSize_t)len2);       /* Final \0 is omitted */
2806
2807         /* [<len3> <object-IDs>] */
2808         if (flags & SHF_HAS_LIST) {
2809                 int len3 = count - 1;
2810                 if (flags & SHF_LARGE_LISTLEN)
2811                         WLEN(len3);
2812                 else {
2813                         unsigned char clen = (unsigned char) len3;
2814                         PUTMARK(clen);
2815                 }
2816
2817                 /*
2818                  * NOTA BENE, for 64-bit machines: the ary[i] below does not yield a
2819                  * real pointer, rather a tag number, well under the 32-bit limit.
2820                  */
2821
2822                 for (i = 1; i < count; i++) {
2823                         I32 tagval = htonl(LOW_32BITS(ary[i]));
2824                         WRITE_I32(tagval);
2825                         TRACEME(("object %d, tag #%d", i-1, ntohl(tagval)));
2826                 }
2827         }
2828
2829         /*
2830          * Free the array.  We need extra care for indices after 0, since they
2831          * don't hold real SVs but integers cast.
2832          */
2833
2834         if (count > 1)
2835                 AvFILLp(av) = 0;        /* Cheat, nothing after 0 interests us */
2836         av_undef(av);
2837         sv_free((SV *) av);
2838
2839         /*
2840          * If object was tied, need to insert serialization of the magic object.
2841          */
2842
2843         if (obj_type == SHT_EXTRA) {
2844                 MAGIC *mg;
2845
2846                 if (!(mg = mg_find(sv, mtype))) {
2847                         int svt = SvTYPE(sv);
2848                         CROAK(("No magic '%c' found while storing ref to tied %s with hook",
2849                                 mtype, (svt == SVt_PVHV) ? "hash" :
2850                                         (svt == SVt_PVAV) ? "array" : "scalar"));
2851                 }
2852
2853                 TRACEME(("handling the magic object 0x%"UVxf" part of 0x%"UVxf,
2854                         PTR2UV(mg->mg_obj), PTR2UV(sv)));
2855
2856                 /*
2857                  * [<magic object>]
2858                  */
2859
2860                 if ((ret = store(cxt, mg->mg_obj)))     /* Extra () for -Wall, grr... */
2861                         return ret;
2862         }
2863
2864         return 0;
2865 }
2866
2867 /*
2868  * store_blessed        -- dispatched manually, not via sv_store[]
2869  *
2870  * Check whether there is a STORABLE_xxx hook defined in the class or in one
2871  * of its ancestors.  If there is, then redispatch to store_hook();
2872  *
2873  * Otherwise, the blessed SV is stored using the following layout:
2874  *
2875  *    SX_BLESS <flag> <len> <classname> <object>
2876  *
2877  * where <flag> indicates whether <len> is stored on 0 or 4 bytes, depending
2878  * on the high-order bit in flag: if 1, then length follows on 4 bytes.
2879  * Otherwise, the low order bits give the length, thereby giving a compact
2880  * representation for class names less than 127 chars long.
2881  *
2882  * Each <classname> seen is remembered and indexed, so that the next time
2883  * an object in the blessed in the same <classname> is stored, the following
2884  * will be emitted:
2885  *
2886  *    SX_IX_BLESS <flag> <index> <object>
2887  *
2888  * where <index> is the classname index, stored on 0 or 4 bytes depending
2889  * on the high-order bit in flag (same encoding as above for <len>).
2890  */
2891 static int store_blessed(
2892         stcxt_t *cxt,
2893         SV *sv,
2894         int type,
2895         HV *pkg)
2896 {
2897         SV *hook;
2898         I32 len;
2899         char *class;
2900         I32 classnum;
2901
2902         TRACEME(("store_blessed, type %d, class \"%s\"", type, HvNAME(pkg)));
2903
2904         /*
2905          * Look for a hook for this blessed SV and redirect to store_hook()
2906          * if needed.
2907          */
2908
2909         hook = pkg_can(cxt->hook, pkg, "STORABLE_freeze");
2910         if (hook)
2911                 return store_hook(cxt, sv, type, pkg, hook);
2912
2913         /*
2914          * This is a blessed SV without any serialization hook.
2915          */
2916
2917         class = HvNAME(pkg);
2918         len = strlen(class);
2919
2920         TRACEME(("blessed 0x%"UVxf" in %s, no hook: tagged #%d",
2921                  PTR2UV(sv), class, cxt->tagnum));
2922
2923         /*
2924          * Determine whether it is the first time we see that class name (in which
2925          * case it will be stored in the SX_BLESS form), or whether we already
2926          * saw that class name before (in which case the SX_IX_BLESS form will be
2927          * used).
2928          */
2929
2930         if (known_class(cxt, class, len, &classnum)) {
2931                 TRACEME(("already seen class %s, ID = %d", class, classnum));
2932                 PUTMARK(SX_IX_BLESS);
2933                 if (classnum <= LG_BLESS) {
2934                         unsigned char cnum = (unsigned char) classnum;
2935                         PUTMARK(cnum);
2936                 } else {
2937                         unsigned char flag = (unsigned char) 0x80;
2938                         PUTMARK(flag);
2939                         WLEN(classnum);
2940                 }
2941         } else {
2942                 TRACEME(("first time we see class %s, ID = %d", class, classnum));
2943                 PUTMARK(SX_BLESS);
2944                 if (len <= LG_BLESS) {
2945                         unsigned char clen = (unsigned char) len;
2946                         PUTMARK(clen);
2947                 } else {
2948                         unsigned char flag = (unsigned char) 0x80;
2949                         PUTMARK(flag);
2950                         WLEN(len);                                      /* Don't BER-encode, this should be rare */
2951                 }
2952                 WRITE(class, len);                              /* Final \0 is omitted */
2953         }
2954
2955         /*
2956          * Now emit the <object> part.
2957          */
2958
2959         return SV_STORE(type)(cxt, sv);
2960 }
2961
2962 /*
2963  * store_other
2964  *
2965  * We don't know how to store the item we reached, so return an error condition.
2966  * (it's probably a GLOB, some CODE reference, etc...)
2967  *
2968  * If they defined the `forgive_me' variable at the Perl level to some
2969  * true value, then don't croak, just warn, and store a placeholder string
2970  * instead.
2971  */
2972 static int store_other(stcxt_t *cxt, SV *sv)
2973 {
2974         I32 len;
2975         static char buf[80];
2976
2977         TRACEME(("store_other"));
2978
2979         /*
2980          * Fetch the value from perl only once per store() operation.
2981          */
2982
2983         if (
2984                 cxt->forgive_me == 0 ||
2985                 (cxt->forgive_me < 0 && !(cxt->forgive_me =
2986                         SvTRUE(perl_get_sv("Storable::forgive_me", TRUE)) ? 1 : 0))
2987         )
2988                 CROAK(("Can't store %s items", sv_reftype(sv, FALSE)));
2989
2990         warn("Can't store item %s(0x%"UVxf")",
2991                 sv_reftype(sv, FALSE), PTR2UV(sv));
2992
2993         /*
2994          * Store placeholder string as a scalar instead...
2995          */
2996
2997         (void) sprintf(buf, "You lost %s(0x%"UVxf")%c", sv_reftype(sv, FALSE),
2998                        PTR2UV(sv), (char) 0);
2999
3000         len = strlen(buf);
3001         STORE_SCALAR(buf, len);
3002         TRACEME(("ok (dummy \"%s\", length = %"IVdf")", buf, (IV) len));
3003
3004         return 0;
3005 }
3006
3007 /***
3008  *** Store driving routines
3009  ***/
3010
3011 /*
3012  * sv_type
3013  *
3014  * WARNING: partially duplicates Perl's sv_reftype for speed.
3015  *
3016  * Returns the type of the SV, identified by an integer. That integer
3017  * may then be used to index the dynamic routine dispatch table.
3018  */
3019 static int sv_type(SV *sv)
3020 {
3021         switch (SvTYPE(sv)) {
3022         case SVt_NULL:
3023         case SVt_IV:
3024         case SVt_NV:
3025                 /*
3026                  * No need to check for ROK, that can't be set here since there
3027                  * is no field capable of hodling the xrv_rv reference.
3028                  */
3029                 return svis_SCALAR;
3030         case SVt_PV:
3031         case SVt_RV:
3032         case SVt_PVIV:
3033         case SVt_PVNV:
3034                 /*
3035                  * Starting from SVt_PV, it is possible to have the ROK flag
3036                  * set, the pointer to the other SV being either stored in
3037                  * the xrv_rv (in the case of a pure SVt_RV), or as the
3038                  * xpv_pv field of an SVt_PV and its heirs.
3039                  *
3040                  * However, those SV cannot be magical or they would be an
3041                  * SVt_PVMG at least.
3042                  */
3043                 return SvROK(sv) ? svis_REF : svis_SCALAR;
3044         case SVt_PVMG:
3045         case SVt_PVLV:          /* Workaround for perl5.004_04 "LVALUE" bug */
3046                 if (SvRMAGICAL(sv) && (mg_find(sv, 'p')))
3047                         return svis_TIED_ITEM;
3048                 /* FALL THROUGH */
3049         case SVt_PVBM:
3050                 if (SvRMAGICAL(sv) && (mg_find(sv, 'q')))
3051                         return svis_TIED;
3052                 return SvROK(sv) ? svis_REF : svis_SCALAR;
3053         case SVt_PVAV:
3054                 if (SvRMAGICAL(sv) && (mg_find(sv, 'P')))
3055                         return svis_TIED;
3056                 return svis_ARRAY;
3057         case SVt_PVHV:
3058                 if (SvRMAGICAL(sv) && (mg_find(sv, 'P')))
3059                         return svis_TIED;
3060                 return svis_HASH;
3061         default:
3062                 break;
3063         }
3064
3065         return svis_OTHER;
3066 }
3067
3068 /*
3069  * store
3070  *
3071  * Recursively store objects pointed to by the sv to the specified file.
3072  *
3073  * Layout is <content> or SX_OBJECT <tagnum> if we reach an already stored
3074  * object (one for which storage has started -- it may not be over if we have
3075  * a self-referenced structure). This data set forms a stored <object>.
3076  */
3077 static int store(stcxt_t *cxt, SV *sv)
3078 {
3079         SV **svh;
3080         int ret;
3081         int type;
3082         HV *hseen = cxt->hseen;
3083
3084         TRACEME(("store (0x%"UVxf")", PTR2UV(sv)));
3085
3086         /*
3087          * If object has already been stored, do not duplicate data.
3088          * Simply emit the SX_OBJECT marker followed by its tag data.
3089          * The tag is always written in network order.
3090          *
3091          * NOTA BENE, for 64-bit machines: the "*svh" below does not yield a
3092          * real pointer, rather a tag number (watch the insertion code below).
3093          * That means it pobably safe to assume it is well under the 32-bit limit,
3094          * and makes the truncation safe.
3095          *              -- RAM, 14/09/1999
3096          */
3097
3098         svh = hv_fetch(hseen, (char *) &sv, sizeof(sv), FALSE);
3099         if (svh) {
3100                 I32 tagval = htonl(LOW_32BITS(*svh));
3101
3102                 TRACEME(("object 0x%"UVxf" seen as #%d", PTR2UV(sv), ntohl(tagval)));
3103
3104                 PUTMARK(SX_OBJECT);
3105                 WRITE_I32(tagval);
3106                 return 0;
3107         }
3108
3109         /*
3110          * Allocate a new tag and associate it with the address of the sv being
3111          * stored, before recursing...
3112          *
3113          * In order to avoid creating new SvIVs to hold the tagnum we just
3114          * cast the tagnum to an SV pointer and store that in the hash.  This
3115          * means that we must clean up the hash manually afterwards, but gives
3116          * us a 15% throughput increase.
3117          *
3118          */
3119
3120         cxt->tagnum++;
3121         if (!hv_store(hseen,
3122                         (char *) &sv, sizeof(sv), INT2PTR(SV*, cxt->tagnum), 0))
3123                 return -1;
3124
3125         /*
3126          * Store `sv' and everything beneath it, using appropriate routine.
3127          * Abort immediately if we get a non-zero status back.
3128          */
3129
3130         type = sv_type(sv);
3131
3132         TRACEME(("storing 0x%"UVxf" tag #%d, type %d...",
3133                  PTR2UV(sv), cxt->tagnum, type));
3134
3135         if (SvOBJECT(sv)) {
3136                 HV *pkg = SvSTASH(sv);
3137                 ret = store_blessed(cxt, sv, type, pkg);
3138         } else
3139                 ret = SV_STORE(type)(cxt, sv);
3140
3141         TRACEME(("%s (stored 0x%"UVxf", refcnt=%d, %s)",
3142                 ret ? "FAILED" : "ok", PTR2UV(sv),
3143                 SvREFCNT(sv), sv_reftype(sv, FALSE)));
3144
3145         return ret;
3146 }
3147
3148 /*
3149  * magic_write
3150  *
3151  * Write magic number and system information into the file.
3152  * Layout is <magic> <network> [<len> <byteorder> <sizeof int> <sizeof long>
3153  * <sizeof ptr>] where <len> is the length of the byteorder hexa string.
3154  * All size and lenghts are written as single characters here.
3155  *
3156  * Note that no byte ordering info is emitted when <network> is true, since
3157  * integers will be emitted in network order in that case.
3158  */
3159 static int magic_write(stcxt_t *cxt)
3160 {
3161         char buf[256];  /* Enough room for 256 hexa digits */
3162         unsigned char c;
3163         int use_network_order = cxt->netorder;
3164
3165         TRACEME(("magic_write on fd=%d", cxt->fio ? PerlIO_fileno(cxt->fio)
3166                  : -1));
3167
3168         if (cxt->fio)
3169                 WRITE(magicstr, (SSize_t)strlen(magicstr));     /* Don't write final \0 */
3170
3171         /*
3172          * Starting with 0.6, the "use_network_order" byte flag is also used to
3173          * indicate the version number of the binary image, encoded in the upper
3174          * bits. The bit 0 is always used to indicate network order.
3175          */
3176
3177         c = (unsigned char)
3178                 ((use_network_order ? 0x1 : 0x0) | (STORABLE_BIN_MAJOR << 1));
3179         PUTMARK(c);
3180
3181         /*
3182          * Starting with 0.7, a full byte is dedicated to the minor version of
3183          * the binary format, which is incremented only when new markers are
3184          * introduced, for instance, but when backward compatibility is preserved.
3185          */
3186
3187         PUTMARK((unsigned char) STORABLE_BIN_WRITE_MINOR);
3188
3189         if (use_network_order)
3190                 return 0;                                               /* Don't bother with byte ordering */
3191
3192         sprintf(buf, "%lx", (unsigned long) BYTEORDER);
3193         c = (unsigned char) strlen(buf);
3194         PUTMARK(c);
3195         WRITE(buf, (SSize_t)c);         /* Don't write final \0 */
3196         PUTMARK((unsigned char) sizeof(int));
3197         PUTMARK((unsigned char) sizeof(long));
3198         PUTMARK((unsigned char) sizeof(char *));
3199         PUTMARK((unsigned char) sizeof(NV));
3200
3201         TRACEME(("ok (magic_write byteorder = 0x%lx [%d], I%d L%d P%d D%d)",
3202                  (unsigned long) BYTEORDER, (int) c,
3203                  (int) sizeof(int), (int) sizeof(long),
3204                  (int) sizeof(char *), (int) sizeof(NV)));
3205
3206         return 0;
3207 }
3208
3209 /*
3210  * do_store
3211  *
3212  * Common code for store operations.
3213  *
3214  * When memory store is requested (f = NULL) and a non null SV* is given in
3215  * `res', it is filled with a new SV created out of the memory buffer.
3216  *
3217  * It is required to provide a non-null `res' when the operation type is not
3218  * dclone() and store() is performed to memory.
3219  */
3220 static int do_store(
3221         PerlIO *f,
3222         SV *sv,
3223         int optype,
3224         int network_order,
3225         SV **res)
3226 {
3227         dSTCXT;
3228         int status;
3229
3230         ASSERT(!(f == 0 && !(optype & ST_CLONE)) || res,
3231                 ("must supply result SV pointer for real recursion to memory"));
3232
3233         TRACEME(("do_store (optype=%d, netorder=%d)",
3234                 optype, network_order));
3235
3236         optype |= ST_STORE;
3237
3238         /*
3239          * Workaround for CROAK leak: if they enter with a "dirty" context,
3240          * free up memory for them now.
3241          */
3242
3243         if (cxt->s_dirty)
3244                 clean_context(cxt);
3245
3246         /*
3247          * Now that STORABLE_xxx hooks exist, it is possible that they try to
3248          * re-enter store() via the hooks.  We need to stack contexts.
3249          */
3250
3251         if (cxt->entry)
3252                 cxt = allocate_context(cxt);
3253
3254         cxt->entry++;
3255
3256         ASSERT(cxt->entry == 1, ("starting new recursion"));
3257         ASSERT(!cxt->s_dirty, ("clean context"));
3258
3259         /*
3260          * Ensure sv is actually a reference. From perl, we called something
3261          * like:
3262          *       pstore(FILE, \@array);
3263          * so we must get the scalar value behing that reference.
3264          */
3265
3266         if (!SvROK(sv))
3267                 CROAK(("Not a reference"));
3268         sv = SvRV(sv);                  /* So follow it to know what to store */
3269
3270         /* 
3271          * If we're going to store to memory, reset the buffer.
3272          */
3273
3274         if (!f)
3275                 MBUF_INIT(0);
3276
3277         /*
3278          * Prepare context and emit headers.
3279          */
3280
3281         init_store_context(cxt, f, optype, network_order);
3282
3283         if (-1 == magic_write(cxt))             /* Emit magic and ILP info */
3284                 return 0;                                       /* Error */
3285
3286         /*
3287          * Recursively store object...
3288          */
3289
3290         ASSERT(is_storing(), ("within store operation"));
3291
3292         status = store(cxt, sv);                /* Just do it! */
3293
3294         /*
3295          * If they asked for a memory store and they provided an SV pointer,
3296          * make an SV string out of the buffer and fill their pointer.
3297          *
3298          * When asking for ST_REAL, it's MANDATORY for the caller to provide
3299          * an SV, since context cleanup might free the buffer if we did recurse.
3300          * (unless caller is dclone(), which is aware of that).
3301          */
3302
3303         if (!cxt->fio && res)
3304                 *res = mbuf2sv();
3305
3306         /*
3307          * Final cleanup.
3308          *
3309          * The "root" context is never freed, since it is meant to be always
3310          * handy for the common case where no recursion occurs at all (i.e.
3311          * we enter store() outside of any Storable code and leave it, period).
3312          * We know it's the "root" context because there's nothing stacked
3313          * underneath it.
3314          *
3315          * OPTIMIZATION:
3316          *
3317          * When deep cloning, we don't free the context: doing so would force
3318          * us to copy the data in the memory buffer.  Sicne we know we're
3319          * about to enter do_retrieve...
3320          */
3321
3322         clean_store_context(cxt);
3323         if (cxt->prev && !(cxt->optype & ST_CLONE))
3324                 free_context(cxt);
3325
3326         TRACEME(("do_store returns %d", status));
3327
3328         return status == 0;
3329 }
3330
3331 /*
3332  * pstore
3333  *
3334  * Store the transitive data closure of given object to disk.
3335  * Returns 0 on error, a true value otherwise.
3336  */
3337 int pstore(PerlIO *f, SV *sv)
3338 {
3339         TRACEME(("pstore"));
3340         return do_store(f, sv, 0, FALSE, (SV**) 0);
3341
3342 }
3343
3344 /*
3345  * net_pstore
3346  *
3347  * Same as pstore(), but network order is used for integers and doubles are
3348  * emitted as strings.
3349  */
3350 int net_pstore(PerlIO *f, SV *sv)
3351 {
3352         TRACEME(("net_pstore"));
3353         return do_store(f, sv, 0, TRUE, (SV**) 0);
3354 }
3355
3356 /***
3357  *** Memory stores.
3358  ***/
3359
3360 /*
3361  * mbuf2sv
3362  *
3363  * Build a new SV out of the content of the internal memory buffer.
3364  */
3365 static SV *mbuf2sv(void)
3366 {
3367         dSTCXT;
3368
3369         return newSVpv(mbase, MBUF_SIZE());
3370 }
3371
3372 /*
3373  * mstore
3374  *
3375  * Store the transitive data closure of given object to memory.
3376  * Returns undef on error, a scalar value containing the data otherwise.
3377  */
3378 SV *mstore(SV *sv)
3379 {
3380         SV *out;
3381
3382         TRACEME(("mstore"));
3383
3384         if (!do_store((PerlIO*) 0, sv, 0, FALSE, &out))
3385                 return &PL_sv_undef;
3386
3387         return out;
3388 }
3389
3390 /*
3391  * net_mstore
3392  *
3393  * Same as mstore(), but network order is used for integers and doubles are
3394  * emitted as strings.
3395  */
3396 SV *net_mstore(SV *sv)
3397 {
3398         SV *out;
3399
3400         TRACEME(("net_mstore"));
3401
3402         if (!do_store((PerlIO*) 0, sv, 0, TRUE, &out))
3403                 return &PL_sv_undef;
3404
3405         return out;
3406 }
3407
3408 /***
3409  *** Specific retrieve callbacks.
3410  ***/
3411
3412 /*
3413  * retrieve_other
3414  *
3415  * Return an error via croak, since it is not possible that we get here
3416  * under normal conditions, when facing a file produced via pstore().
3417  */
3418 static SV *retrieve_other(stcxt_t *cxt, char *cname)
3419 {
3420         if (
3421                 cxt->ver_major != STORABLE_BIN_MAJOR &&
3422                 cxt->ver_minor != STORABLE_BIN_MINOR
3423         ) {
3424                 CROAK(("Corrupted storable %s (binary v%d.%d), current is v%d.%d",
3425                         cxt->fio ? "file" : "string",
3426                         cxt->ver_major, cxt->ver_minor,
3427                         STORABLE_BIN_MAJOR, STORABLE_BIN_MINOR));
3428         } else {
3429                 CROAK(("Corrupted storable %s (binary v%d.%d)",
3430                         cxt->fio ? "file" : "string",
3431                         cxt->ver_major, cxt->ver_minor));
3432         }
3433
3434         return (SV *) 0;                /* Just in case */
3435 }
3436
3437 /*
3438  * retrieve_idx_blessed
3439  *
3440  * Layout is SX_IX_BLESS <index> <object> with SX_IX_BLESS already read.
3441  * <index> can be coded on either 1 or 5 bytes.
3442  */
3443 static SV *retrieve_idx_blessed(stcxt_t *cxt, char *cname)
3444 {
3445         I32 idx;
3446         char *class;
3447         SV **sva;
3448         SV *sv;
3449
3450         TRACEME(("retrieve_idx_blessed (#%d)", cxt->tagnum));
3451         ASSERT(!cname, ("no bless-into class given here, got %s", cname));
3452
3453         GETMARK(idx);                   /* Index coded on a single char? */
3454         if (idx & 0x80)
3455                 RLEN(idx);
3456
3457         /*
3458          * Fetch classname in `aclass'
3459          */
3460
3461         sva = av_fetch(cxt->aclass, idx, FALSE);
3462         if (!sva)
3463                 CROAK(("Class name #%"IVdf" should have been seen already", (IV) idx));
3464
3465         class = SvPVX(*sva);    /* We know it's a PV, by construction */
3466
3467         TRACEME(("class ID %d => %s", idx, class));
3468
3469         /*
3470          * Retrieve object and bless it.
3471          */
3472
3473         sv = retrieve(cxt, class);      /* First SV which is SEEN will be blessed */
3474
3475         return sv;
3476 }
3477
3478 /*
3479  * retrieve_blessed
3480  *
3481  * Layout is SX_BLESS <len> <classname> <object> with SX_BLESS already read.
3482  * <len> can be coded on either 1 or 5 bytes.
3483  */
3484 static SV *retrieve_blessed(stcxt_t *cxt, char *cname)
3485 {
3486         I32 len;
3487         SV *sv;
3488         char buf[LG_BLESS + 1];         /* Avoid malloc() if possible */
3489         char *class = buf;
3490
3491         TRACEME(("retrieve_blessed (#%d)", cxt->tagnum));
3492         ASSERT(!cname, ("no bless-into class given here, got %s", cname));
3493
3494         /*
3495          * Decode class name length and read that name.
3496          *
3497          * Short classnames have two advantages: their length is stored on one
3498          * single byte, and the string can be read on the stack.
3499          */
3500
3501         GETMARK(len);                   /* Length coded on a single char? */
3502         if (len & 0x80) {
3503                 RLEN(len);
3504                 TRACEME(("** allocating %d bytes for class name", len+1));
3505                 New(10003, class, len+1, char);
3506         }
3507         READ(class, len);
3508         class[len] = '\0';              /* Mark string end */
3509
3510         /*
3511          * It's a new classname, otherwise it would have been an SX_IX_BLESS.
3512          */
3513
3514         TRACEME(("new class name \"%s\" will bear ID = %d", class, cxt->classnum));
3515
3516         if (!av_store(cxt->aclass, cxt->classnum++, newSVpvn(class, len)))
3517                 return (SV *) 0;
3518
3519         /*
3520          * Retrieve object and bless it.
3521          */
3522
3523         sv = retrieve(cxt, class);      /* First SV which is SEEN will be blessed */
3524         if (class != buf)
3525                 Safefree(class);
3526
3527         return sv;
3528 }
3529
3530 /*
3531  * retrieve_hook
3532  *
3533  * Layout: SX_HOOK <flags> <len> <classname> <len2> <str> [<len3> <object-IDs>]
3534  * with leading mark already read, as usual.
3535  *
3536  * When recursion was involved during serialization of the object, there
3537  * is an unknown amount of serialized objects after the SX_HOOK mark.  Until
3538  * we reach a <flags> marker with the recursion bit cleared.
3539  *
3540  * If the first <flags> byte contains a type of SHT_EXTRA, then the real type
3541  * is held in the <extra> byte, and if the object is tied, the serialized
3542  * magic object comes at the very end:
3543  *
3544  *     SX_HOOK <flags> <extra> ... [<len3> <object-IDs>] <magic object>
3545  *
3546  * This means the STORABLE_thaw hook will NOT get a tied variable during its
3547  * processing (since we won't have seen the magic object by the time the hook
3548  * is called).  See comments below for why it was done that way.
3549  */
3550 static SV *retrieve_hook(stcxt_t *cxt, char *cname)
3551 {
3552         I32 len;
3553         char buf[LG_BLESS + 1];         /* Avoid malloc() if possible */
3554         char *class = buf;
3555         unsigned int flags;
3556         I32 len2;
3557         SV *frozen;
3558         I32 len3 = 0;
3559         AV *av = 0;
3560         SV *hook;
3561         SV *sv;
3562         SV *rv;
3563         int obj_type;
3564         int clone = cxt->optype & ST_CLONE;
3565         char mtype = '\0';
3566         unsigned int extra_type = 0;
3567
3568         TRACEME(("retrieve_hook (#%d)", cxt->tagnum));
3569         ASSERT(!cname, ("no bless-into class given here, got %s", cname));
3570
3571         /*
3572          * Read flags, which tell us about the type, and whether we need to recurse.
3573          */
3574
3575         GETMARK(flags);
3576
3577         /*
3578          * Create the (empty) object, and mark it as seen.
3579          *
3580          * This must be done now, because tags are incremented, and during
3581          * serialization, the object tag was affected before recursion could
3582          * take place.
3583          */
3584
3585         obj_type = flags & SHF_TYPE_MASK;
3586         switch (obj_type) {
3587         case SHT_SCALAR:
3588                 sv = newSV(0);
3589                 break;
3590         case SHT_ARRAY:
3591                 sv = (SV *) newAV();
3592                 break;
3593         case SHT_HASH:
3594                 sv = (SV *) newHV();
3595                 break;
3596         case SHT_EXTRA:
3597                 /*
3598                  * Read <extra> flag to know the type of the object.
3599                  * Record associated magic type for later.
3600                  */
3601                 GETMARK(extra_type);
3602                 switch (extra_type) {
3603                 case SHT_TSCALAR:
3604                         sv = newSV(0);
3605                         mtype = 'q';
3606                         break;
3607                 case SHT_TARRAY:
3608                         sv = (SV *) newAV();
3609                         mtype = 'P';
3610                         break;
3611                 case SHT_THASH:
3612                         sv = (SV *) newHV();
3613                         mtype = 'P';
3614                         break;
3615                 default:
3616                         return retrieve_other(cxt, 0);  /* Let it croak */
3617                 }
3618                 break;
3619         default:
3620                 return retrieve_other(cxt, 0);          /* Let it croak */
3621         }
3622         SEEN(sv, 0);                                                    /* Don't bless yet */
3623
3624         /*
3625          * Whilst flags tell us to recurse, do so.
3626          *
3627          * We don't need to remember the addresses returned by retrieval, because
3628          * all the references will be obtained through indirection via the object
3629          * tags in the object-ID list.
3630          */
3631
3632         while (flags & SHF_NEED_RECURSE) {
3633                 TRACEME(("retrieve_hook recursing..."));
3634                 rv = retrieve(cxt, 0);
3635                 if (!rv)
3636                         return (SV *) 0;
3637                 TRACEME(("retrieve_hook back with rv=0x%"UVxf,
3638                          PTR2UV(rv)));
3639                 GETMARK(flags);
3640         }
3641
3642         if (flags & SHF_IDX_CLASSNAME) {
3643                 SV **sva;
3644                 I32 idx;
3645
3646                 /*
3647                  * Fetch index from `aclass'
3648                  */
3649
3650                 if (flags & SHF_LARGE_CLASSLEN)
3651                         RLEN(idx);
3652                 else
3653                         GETMARK(idx);
3654
3655                 sva = av_fetch(cxt->aclass, idx, FALSE);
3656                 if (!sva)
3657                         CROAK(("Class name #%"IVdf" should have been seen already",
3658                                 (IV) idx));
3659
3660                 class = SvPVX(*sva);    /* We know it's a PV, by construction */
3661                 TRACEME(("class ID %d => %s", idx, class));
3662
3663         } else {
3664                 /*
3665                  * Decode class name length and read that name.
3666                  *
3667                  * NOTA BENE: even if the length is stored on one byte, we don't read
3668                  * on the stack.  Just like retrieve_blessed(), we limit the name to
3669                  * LG_BLESS bytes.  This is an arbitrary decision.
3670                  */
3671
3672                 if (flags & SHF_LARGE_CLASSLEN)
3673                         RLEN(len);
3674                 else
3675                         GETMARK(len);
3676
3677                 if (len > LG_BLESS) {
3678                         TRACEME(("** allocating %d bytes for class name", len+1));
3679                         New(10003, class, len+1, char);
3680                 }
3681
3682                 READ(class, len);
3683                 class[len] = '\0';              /* Mark string end */
3684
3685                 /*
3686                  * Record new classname.
3687                  */
3688
3689                 if (!av_store(cxt->aclass, cxt->classnum++, newSVpvn(class, len)))
3690                         return (SV *) 0;
3691         }
3692
3693         TRACEME(("class name: %s", class));
3694
3695         /*
3696          * Decode user-frozen string length and read it in an SV.
3697          *
3698          * For efficiency reasons, we read data directly into the SV buffer.
3699          * To understand that code, read retrieve_scalar()
3700          */
3701
3702         if (flags & SHF_LARGE_STRLEN)
3703                 RLEN(len2);
3704         else
3705                 GETMARK(len2);
3706
3707         frozen = NEWSV(10002, len2);
3708         if (len2) {
3709                 SAFEREAD(SvPVX(frozen), len2, frozen);
3710                 SvCUR_set(frozen, len2);
3711                 *SvEND(frozen) = '\0';
3712         }
3713         (void) SvPOK_only(frozen);              /* Validates string pointer */
3714         if (cxt->s_tainted)                             /* Is input source tainted? */
3715                 SvTAINT(frozen);
3716
3717         TRACEME(("frozen string: %d bytes", len2));
3718
3719         /*
3720          * Decode object-ID list length, if present.
3721          */
3722
3723         if (flags & SHF_HAS_LIST) {
3724                 if (flags & SHF_LARGE_LISTLEN)
3725                         RLEN(len3);
3726                 else
3727                         GETMARK(len3);
3728                 if (len3) {
3729                         av = newAV();
3730                         av_extend(av, len3 + 1);        /* Leave room for [0] */
3731                         AvFILLp(av) = len3;                     /* About to be filled anyway */
3732                 }
3733         }
3734
3735         TRACEME(("has %d object IDs to link", len3));
3736
3737         /*
3738          * Read object-ID list into array.
3739          * Because we pre-extended it, we can cheat and fill it manually.
3740          *
3741          * We read object tags and we can convert them into SV* on the fly
3742          * because we know all the references listed in there (as tags)
3743          * have been already serialized, hence we have a valid correspondance
3744          * between each of those tags and the recreated SV.
3745          */
3746
3747         if (av) {
3748                 SV **ary = AvARRAY(av);
3749                 int i;
3750                 for (i = 1; i <= len3; i++) {   /* We leave [0] alone */
3751                         I32 tag;
3752                         SV **svh;
3753                         SV *xsv;
3754
3755                         READ_I32(tag);
3756                         tag = ntohl(tag);
3757                         svh = av_fetch(cxt->aseen, tag, FALSE);
3758                         if (!svh)
3759                                 CROAK(("Object #%"IVdf" should have been retrieved already",
3760                                         (IV) tag));
3761                         xsv = *svh;
3762                         ary[i] = SvREFCNT_inc(xsv);
3763                 }
3764         }
3765
3766         /*
3767          * Bless the object and look up the STORABLE_thaw hook.
3768          */
3769
3770         BLESS(sv, class);
3771         hook = pkg_can(cxt->hook, SvSTASH(sv), "STORABLE_thaw");
3772         if (!hook) {
3773                 /*
3774                  * Hook not found.  Maybe they did not require the module where this
3775                  * hook is defined yet?
3776                  *
3777                  * If the require below succeeds, we'll be able to find the hook.
3778                  * Still, it only works reliably when each class is defined in a
3779                  * file of its own.
3780                  */
3781
3782                 SV *psv = newSVpvn("require ", 8);
3783                 sv_catpv(psv, class);
3784
3785                 TRACEME(("No STORABLE_thaw defined for objects of class %s", class));
3786                 TRACEME(("Going to require module '%s' with '%s'", class, SvPVX(psv)));
3787
3788                 perl_eval_sv(psv, G_DISCARD);
3789                 sv_free(psv);
3790
3791                 /*
3792                  * We cache results of pkg_can, so we need to uncache before attempting
3793                  * the lookup again.
3794                  */
3795
3796                 pkg_uncache(cxt->hook, SvSTASH(sv), "STORABLE_thaw");
3797                 hook = pkg_can(cxt->hook, SvSTASH(sv), "STORABLE_thaw");
3798
3799                 if (!hook)
3800                         CROAK(("No STORABLE_thaw defined for objects of class %s "
3801                                         "(even after a \"require %s;\")", class, class));
3802         }
3803
3804         /*
3805          * If we don't have an `av' yet, prepare one.
3806          * Then insert the frozen string as item [0].
3807          */
3808
3809         if (!av) {
3810                 av = newAV();
3811                 av_extend(av, 1);
3812                 AvFILLp(av) = 0;
3813         }
3814         AvARRAY(av)[0] = SvREFCNT_inc(frozen);
3815
3816         /*
3817          * Call the hook as:
3818          *
3819          *   $object->STORABLE_thaw($cloning, $frozen, @refs);
3820          * 
3821          * where $object is our blessed (empty) object, $cloning is a boolean
3822          * telling whether we're running a deep clone, $frozen is the frozen
3823          * string the user gave us in his serializing hook, and @refs, which may
3824          * be empty, is the list of extra references he returned along for us
3825          * to serialize.
3826          *
3827          * In effect, the hook is an alternate creation routine for the class,
3828          * the object itself being already created by the runtime.
3829          */
3830
3831         TRACEME(("calling STORABLE_thaw on %s at 0x%"UVxf" (%"IVdf" args)",
3832                  class, PTR2UV(sv), (IV) AvFILLp(av) + 1));
3833
3834         rv = newRV(sv);
3835         (void) scalar_call(rv, hook, clone, av, G_SCALAR|G_DISCARD);
3836         SvREFCNT_dec(rv);
3837
3838         /*
3839          * Final cleanup.
3840          */
3841
3842         SvREFCNT_dec(frozen);
3843         av_undef(av);
3844         sv_free((SV *) av);
3845         if (!(flags & SHF_IDX_CLASSNAME) && class != buf)
3846                 Safefree(class);
3847
3848         /*
3849          * If we had an <extra> type, then the object was not as simple, and
3850          * we need to restore extra magic now.
3851          */
3852
3853         if (!extra_type)
3854                 return sv;
3855
3856         TRACEME(("retrieving magic object for 0x%"UVxf"...", PTR2UV(sv)));
3857
3858         rv = retrieve(cxt, 0);          /* Retrieve <magic object> */
3859
3860         TRACEME(("restoring the magic object 0x%"UVxf" part of 0x%"UVxf,
3861                 PTR2UV(rv), PTR2UV(sv)));
3862
3863         switch (extra_type) {
3864         case SHT_TSCALAR:
3865                 sv_upgrade(sv, SVt_PVMG);
3866                 break;
3867         case SHT_TARRAY:
3868                 sv_upgrade(sv, SVt_PVAV);
3869                 AvREAL_off((AV *)sv);
3870                 break;
3871         case SHT_THASH:
3872                 sv_upgrade(sv, SVt_PVHV);
3873                 break;
3874         default:
3875                 CROAK(("Forgot to deal with extra type %d", extra_type));
3876                 break;
3877         }
3878
3879         /*
3880          * Adding the magic only now, well after the STORABLE_thaw hook was called
3881          * means the hook cannot know it deals with an object whose variable is
3882          * tied.  But this is happening when retrieving $o in the following case:
3883          *
3884          *      my %h;
3885          *  tie %h, 'FOO';
3886          *      my $o = bless \%h, 'BAR';
3887          *
3888          * The 'BAR' class is NOT the one where %h is tied into.  Therefore, as
3889          * far as the 'BAR' class is concerned, the fact that %h is not a REAL
3890          * hash but a tied one should not matter at all, and remain transparent.
3891          * This means the magic must be restored by Storable AFTER the hook is
3892          * called.
3893          *
3894          * That looks very reasonable to me, but then I've come up with this
3895          * after a bug report from David Nesting, who was trying to store such
3896          * an object and caused Storable to fail.  And unfortunately, it was
3897          * also the easiest way to retrofit support for blessed ref to tied objects
3898          * into the existing design.  -- RAM, 17/02/2001
3899          */
3900
3901         sv_magic(sv, rv, mtype, Nullch, 0);
3902         SvREFCNT_dec(rv);                       /* Undo refcnt inc from sv_magic() */
3903
3904         return sv;
3905 }
3906
3907 /*
3908  * retrieve_ref
3909  *
3910  * Retrieve reference to some other scalar.
3911  * Layout is SX_REF <object>, with SX_REF already read.
3912  */
3913 static SV *retrieve_ref(stcxt_t *cxt, char *cname)
3914 {
3915         SV *rv;
3916         SV *sv;
3917
3918         TRACEME(("retrieve_ref (#%d)", cxt->tagnum));
3919
3920         /*
3921          * We need to create the SV that holds the reference to the yet-to-retrieve
3922          * object now, so that we may record the address in the seen table.
3923          * Otherwise, if the object to retrieve references us, we won't be able
3924          * to resolve the SX_OBJECT we'll see at that point! Hence we cannot
3925          * do the retrieve first and use rv = newRV(sv) since it will be too late
3926          * for SEEN() recording.
3927          */
3928
3929         rv = NEWSV(10002, 0);
3930         SEEN(rv, cname);                /* Will return if rv is null */
3931         sv = retrieve(cxt, 0);  /* Retrieve <object> */
3932         if (!sv)
3933                 return (SV *) 0;        /* Failed */
3934
3935         /*
3936          * WARNING: breaks RV encapsulation.
3937          *
3938          * Now for the tricky part. We have to upgrade our existing SV, so that
3939          * it is now an RV on sv... Again, we cheat by duplicating the code
3940          * held in newSVrv(), since we already got our SV from retrieve().
3941          *
3942          * We don't say:
3943          *
3944          *              SvRV(rv) = SvREFCNT_inc(sv);
3945          *
3946          * here because the reference count we got from retrieve() above is
3947          * already correct: if the object was retrieved from the file, then
3948          * its reference count is one. Otherwise, if it was retrieved via
3949          * an SX_OBJECT indication, a ref count increment was done.
3950          */
3951
3952         sv_upgrade(rv, SVt_RV);
3953         SvRV(rv) = sv;                          /* $rv = \$sv */
3954         SvROK_on(rv);
3955
3956         TRACEME(("ok (retrieve_ref at 0x%"UVxf")", PTR2UV(rv)));
3957
3958         return rv;
3959 }
3960
3961 /*
3962  * retrieve_overloaded
3963  *
3964  * Retrieve reference to some other scalar with overloading.
3965  * Layout is SX_OVERLOAD <object>, with SX_OVERLOAD already read.
3966  */
3967 static SV *retrieve_overloaded(stcxt_t *cxt, char *cname)
3968 {
3969         SV *rv;
3970         SV *sv;
3971         HV *stash;
3972
3973         TRACEME(("retrieve_overloaded (#%d)", cxt->tagnum));
3974
3975         /*
3976          * Same code as retrieve_ref(), duplicated to avoid extra call.
3977          */
3978
3979         rv = NEWSV(10002, 0);
3980         SEEN(rv, cname);                /* Will return if rv is null */
3981         sv = retrieve(cxt, 0);  /* Retrieve <object> */
3982         if (!sv)
3983                 return (SV *) 0;        /* Failed */
3984
3985         /*
3986          * WARNING: breaks RV encapsulation.
3987          */
3988
3989         sv_upgrade(rv, SVt_RV);
3990         SvRV(rv) = sv;                          /* $rv = \$sv */
3991         SvROK_on(rv);
3992
3993         /*
3994          * Restore overloading magic.
3995          */
3996
3997         stash = (HV *) SvSTASH (sv);
3998         if (!stash || !Gv_AMG(stash))
3999                 CROAK(("Cannot restore overloading on %s(0x%"UVxf") (package %s)",
4000                        sv_reftype(sv, FALSE),
4001                        PTR2UV(sv),
4002                            stash ? HvNAME(stash) : "<unknown>"));
4003
4004         SvAMAGIC_on(rv);
4005
4006         TRACEME(("ok (retrieve_overloaded at 0x%"UVxf")", PTR2UV(rv)));
4007
4008         return rv;
4009 }
4010
4011 /*
4012  * retrieve_tied_array
4013  *
4014  * Retrieve tied array
4015  * Layout is SX_TIED_ARRAY <object>, with SX_TIED_ARRAY already read.
4016  */
4017 static SV *retrieve_tied_array(stcxt_t *cxt, char *cname)
4018 {
4019         SV *tv;
4020         SV *sv;
4021
4022         TRACEME(("retrieve_tied_array (#%d)", cxt->tagnum));
4023
4024         tv = NEWSV(10002, 0);
4025         SEEN(tv, cname);                        /* Will return if tv is null */
4026         sv = retrieve(cxt, 0);          /* Retrieve <object> */
4027         if (!sv)
4028                 return (SV *) 0;                /* Failed */
4029
4030         sv_upgrade(tv, SVt_PVAV);
4031         AvREAL_off((AV *)tv);
4032         sv_magic(tv, sv, 'P', Nullch, 0);
4033         SvREFCNT_dec(sv);                       /* Undo refcnt inc from sv_magic() */
4034
4035         TRACEME(("ok (retrieve_tied_array at 0x%"UVxf")", PTR2UV(tv)));
4036
4037         return tv;
4038 }
4039
4040 /*
4041  * retrieve_tied_hash
4042  *
4043  * Retrieve tied hash
4044  * Layout is SX_TIED_HASH <object>, with SX_TIED_HASH already read.
4045  */
4046 static SV *retrieve_tied_hash(stcxt_t *cxt, char *cname)
4047 {
4048         SV *tv;
4049         SV *sv;
4050
4051         TRACEME(("retrieve_tied_hash (#%d)", cxt->tagnum));
4052
4053         tv = NEWSV(10002, 0);
4054         SEEN(tv, cname);                        /* Will return if tv is null */
4055         sv = retrieve(cxt, 0);          /* Retrieve <object> */
4056         if (!sv)
4057                 return (SV *) 0;                /* Failed */
4058
4059         sv_upgrade(tv, SVt_PVHV);
4060         sv_magic(tv, sv, 'P', Nullch, 0);
4061         SvREFCNT_dec(sv);                       /* Undo refcnt inc from sv_magic() */
4062
4063         TRACEME(("ok (retrieve_tied_hash at 0x%"UVxf")", PTR2UV(tv)));
4064
4065         return tv;
4066 }
4067
4068 /*
4069  * retrieve_tied_scalar
4070  *
4071  * Retrieve tied scalar
4072  * Layout is SX_TIED_SCALAR <object>, with SX_TIED_SCALAR already read.
4073  */
4074 static SV *retrieve_tied_scalar(stcxt_t *cxt, char *cname)
4075 {
4076         SV *tv;
4077         SV *sv;
4078
4079         TRACEME(("retrieve_tied_scalar (#%d)", cxt->tagnum));
4080
4081         tv = NEWSV(10002, 0);
4082         SEEN(tv, cname);                        /* Will return if rv is null */
4083         sv = retrieve(cxt, 0);          /* Retrieve <object> */
4084         if (!sv)
4085                 return (SV *) 0;                /* Failed */
4086
4087         sv_upgrade(tv, SVt_PVMG);
4088         sv_magic(tv, sv, 'q', Nullch, 0);
4089         SvREFCNT_dec(sv);                       /* Undo refcnt inc from sv_magic() */
4090
4091         TRACEME(("ok (retrieve_tied_scalar at 0x%"UVxf")", PTR2UV(tv)));
4092
4093         return tv;
4094 }
4095
4096 /*
4097  * retrieve_tied_key
4098  *
4099  * Retrieve reference to value in a tied hash.
4100  * Layout is SX_TIED_KEY <object> <key>, with SX_TIED_KEY already read.
4101  */
4102 static SV *retrieve_tied_key(stcxt_t *cxt, char *cname)
4103 {
4104         SV *tv;
4105         SV *sv;
4106         SV *key;
4107
4108         TRACEME(("retrieve_tied_key (#%d)", cxt->tagnum));
4109
4110         tv = NEWSV(10002, 0);
4111         SEEN(tv, cname);                        /* Will return if tv is null */
4112         sv = retrieve(cxt, 0);          /* Retrieve <object> */
4113         if (!sv)
4114                 return (SV *) 0;                /* Failed */
4115
4116         key = retrieve(cxt, 0);         /* Retrieve <key> */
4117         if (!key)
4118                 return (SV *) 0;                /* Failed */
4119
4120         sv_upgrade(tv, SVt_PVMG);
4121         sv_magic(tv, sv, 'p', (char *)key, HEf_SVKEY);
4122         SvREFCNT_dec(key);                      /* Undo refcnt inc from sv_magic() */
4123         SvREFCNT_dec(sv);                       /* Undo refcnt inc from sv_magic() */
4124
4125         return tv;
4126 }
4127
4128 /*
4129  * retrieve_tied_idx
4130  *
4131  * Retrieve reference to value in a tied array.
4132  * Layout is SX_TIED_IDX <object> <idx>, with SX_TIED_IDX already read.
4133  */
4134 static SV *retrieve_tied_idx(stcxt_t *cxt, char *cname)
4135 {
4136         SV *tv;
4137         SV *sv;
4138         I32 idx;
4139
4140         TRACEME(("retrieve_tied_idx (#%d)", cxt->tagnum));
4141
4142         tv = NEWSV(10002, 0);
4143         SEEN(tv, cname);                        /* Will return if tv is null */
4144         sv = retrieve(cxt, 0);          /* Retrieve <object> */
4145         if (!sv)
4146                 return (SV *) 0;                /* Failed */
4147
4148         RLEN(idx);                                      /* Retrieve <idx> */
4149
4150         sv_upgrade(tv, SVt_PVMG);
4151         sv_magic(tv, sv, 'p', Nullch, idx);
4152         SvREFCNT_dec(sv);                       /* Undo refcnt inc from sv_magic() */
4153
4154         return tv;
4155 }
4156
4157
4158 /*
4159  * retrieve_lscalar
4160  *
4161  * Retrieve defined long (string) scalar.
4162  *
4163  * Layout is SX_LSCALAR <length> <data>, with SX_LSCALAR already read.
4164  * The scalar is "long" in that <length> is larger than LG_SCALAR so it
4165  * was not stored on a single byte.
4166  */
4167 static SV *retrieve_lscalar(stcxt_t *cxt, char *cname)
4168 {
4169         I32 len;
4170         SV *sv;
4171
4172         RLEN(len);
4173         TRACEME(("retrieve_lscalar (#%d), len = %"IVdf, cxt->tagnum, (IV) len));
4174
4175         /*
4176          * Allocate an empty scalar of the suitable length.
4177          */
4178
4179         sv = NEWSV(10002, len);
4180         SEEN(sv, cname);        /* Associate this new scalar with tag "tagnum" */
4181
4182         /*
4183          * WARNING: duplicates parts of sv_setpv and breaks SV data encapsulation.
4184          *
4185          * Now, for efficiency reasons, read data directly inside the SV buffer,
4186          * and perform the SV final settings directly by duplicating the final
4187          * work done by sv_setpv. Since we're going to allocate lots of scalars
4188          * this way, it's worth the hassle and risk.
4189          */
4190
4191         SAFEREAD(SvPVX(sv), len, sv);
4192         SvCUR_set(sv, len);                             /* Record C string length */
4193         *SvEND(sv) = '\0';                              /* Ensure it's null terminated anyway */
4194         (void) SvPOK_only(sv);                  /* Validate string pointer */
4195         if (cxt->s_tainted)                             /* Is input source tainted? */
4196                 SvTAINT(sv);                            /* External data cannot be trusted */
4197
4198         TRACEME(("large scalar len %"IVdf" '%s'", (IV) len, SvPVX(sv)));
4199         TRACEME(("ok (retrieve_lscalar at 0x%"UVxf")", PTR2UV(sv)));
4200
4201         return sv;
4202 }
4203
4204 /*
4205  * retrieve_scalar
4206  *
4207  * Retrieve defined short (string) scalar.
4208  *
4209  * Layout is SX_SCALAR <length> <data>, with SX_SCALAR already read.
4210  * The scalar is "short" so <length> is single byte. If it is 0, there
4211  * is no <data> section.
4212  */
4213 static SV *retrieve_scalar(stcxt_t *cxt, char *cname)
4214 {
4215         int len;
4216         SV *sv;
4217
4218         GETMARK(len);
4219         TRACEME(("retrieve_scalar (#%d), len = %d", cxt->tagnum, len));
4220
4221         /*
4222          * Allocate an empty scalar of the suitable length.
4223          */
4224
4225         sv = NEWSV(10002, len);
4226         SEEN(sv, cname);        /* Associate this new scalar with tag "tagnum" */
4227
4228         /*
4229          * WARNING: duplicates parts of sv_setpv and breaks SV data encapsulation.
4230          */
4231
4232         if (len == 0) {
4233                 /*
4234                  * newSV did not upgrade to SVt_PV so the scalar is undefined.
4235                  * To make it defined with an empty length, upgrade it now...
4236                  * Don't upgrade to a PV if the original type contains more
4237                  * information than a scalar.
4238                  */
4239                 if (SvTYPE(sv) <= SVt_PV) {
4240                         sv_upgrade(sv, SVt_PV);
4241                 }
4242                 SvGROW(sv, 1);
4243                 *SvEND(sv) = '\0';                      /* Ensure it's null terminated anyway */
4244                 TRACEME(("ok (retrieve_scalar empty at 0x%"UVxf")", PTR2UV(sv)));
4245         } else {
4246                 /*
4247                  * Now, for efficiency reasons, read data directly inside the SV buffer,
4248                  * and perform the SV final settings directly by duplicating the final
4249                  * work done by sv_setpv. Since we're going to allocate lots of scalars
4250                  * this way, it's worth the hassle and risk.
4251                  */
4252                 SAFEREAD(SvPVX(sv), len, sv);
4253                 SvCUR_set(sv, len);                     /* Record C string length */
4254                 *SvEND(sv) = '\0';                      /* Ensure it's null terminated anyway */
4255                 TRACEME(("small scalar len %d '%s'", len, SvPVX(sv)));
4256         }
4257
4258         (void) SvPOK_only(sv);                  /* Validate string pointer */
4259         if (cxt->s_tainted)                             /* Is input source tainted? */
4260                 SvTAINT(sv);                            /* External data cannot be trusted */
4261
4262         TRACEME(("ok (retrieve_scalar at 0x%"UVxf")", PTR2UV(sv)));
4263         return sv;
4264 }
4265
4266 /*
4267  * retrieve_utf8str
4268  *
4269  * Like retrieve_scalar(), but tag result as utf8.
4270  * If we're retrieving UTF8 data in a non-UTF8 perl, croaks.
4271  */
4272 static SV *retrieve_utf8str(stcxt_t *cxt, char *cname)
4273 {
4274     SV *sv;
4275
4276     TRACEME(("retrieve_utf8str"));
4277
4278     sv = retrieve_scalar(cxt, cname);
4279     if (sv) {
4280 #ifdef HAS_UTF8_SCALARS
4281         SvUTF8_on(sv);
4282 #else
4283         if (cxt->use_bytes < 0)
4284             cxt->use_bytes
4285                 = (SvTRUE(perl_get_sv("Storable::drop_utf8", TRUE))
4286                    ? 1 : 0);
4287         if (cxt->use_bytes == 0)
4288             UTF8_CROAK();
4289 #endif
4290     }
4291
4292     return sv;
4293 }
4294
4295 /*
4296  * retrieve_lutf8str
4297  *
4298  * Like retrieve_lscalar(), but tag result as utf8.
4299  * If we're retrieving UTF8 data in a non-UTF8 perl, croaks.
4300  */
4301 static SV *retrieve_lutf8str(stcxt_t *cxt, char *cname)
4302 {
4303     SV *sv;
4304
4305     TRACEME(("retrieve_lutf8str"));
4306
4307     sv = retrieve_lscalar(cxt, cname);
4308     if (sv) {
4309 #ifdef HAS_UTF8_SCALARS
4310         SvUTF8_on(sv);
4311 #else
4312         if (cxt->use_bytes < 0)
4313             cxt->use_bytes
4314                 = (SvTRUE(perl_get_sv("Storable::drop_utf8", TRUE))
4315                    ? 1 : 0);
4316         if (cxt->use_bytes == 0)
4317             UTF8_CROAK();
4318 #endif
4319     }
4320     return sv;
4321 }
4322
4323 /*
4324  * retrieve_integer
4325  *
4326  * Retrieve defined integer.
4327  * Layout is SX_INTEGER <data>, whith SX_INTEGER already read.
4328  */
4329 static SV *retrieve_integer(stcxt_t *cxt, char *cname)
4330 {
4331         SV *sv;
4332         IV iv;
4333
4334         TRACEME(("retrieve_integer (#%d)", cxt->tagnum));
4335
4336         READ(&iv, sizeof(iv));
4337         sv = newSViv(iv);
4338         SEEN(sv, cname);        /* Associate this new scalar with tag "tagnum" */
4339
4340         TRACEME(("integer %"IVdf, iv));
4341         TRACEME(("ok (retrieve_integer at 0x%"UVxf")", PTR2UV(sv)));
4342
4343         return sv;
4344 }
4345
4346 /*
4347  * retrieve_netint
4348  *
4349  * Retrieve defined integer in network order.
4350  * Layout is SX_NETINT <data>, whith SX_NETINT already read.
4351  */
4352 static SV *retrieve_netint(stcxt_t *cxt, char *cname)
4353 {
4354         SV *sv;
4355         I32 iv;
4356
4357         TRACEME(("retrieve_netint (#%d)", cxt->tagnum));
4358
4359         READ_I32(iv);
4360 #ifdef HAS_NTOHL
4361         sv = newSViv((int) ntohl(iv));
4362         TRACEME(("network integer %d", (int) ntohl(iv)));
4363 #else
4364         sv = newSViv(iv);
4365         TRACEME(("network integer (as-is) %d", iv));
4366 #endif
4367         SEEN(sv, cname);        /* Associate this new scalar with tag "tagnum" */
4368
4369         TRACEME(("ok (retrieve_netint at 0x%"UVxf")", PTR2UV(sv)));
4370
4371         return sv;
4372 }
4373
4374 /*
4375  * retrieve_double
4376  *
4377  * Retrieve defined double.
4378  * Layout is SX_DOUBLE <data>, whith SX_DOUBLE already read.
4379  */
4380 static SV *retrieve_double(stcxt_t *cxt, char *cname)
4381 {
4382         SV *sv;
4383         NV nv;
4384
4385         TRACEME(("retrieve_double (#%d)", cxt->tagnum));
4386
4387         READ(&nv, sizeof(nv));
4388         sv = newSVnv(nv);
4389         SEEN(sv, cname);        /* Associate this new scalar with tag "tagnum" */
4390
4391         TRACEME(("double %"NVff, nv));
4392         TRACEME(("ok (retrieve_double at 0x%"UVxf")", PTR2UV(sv)));
4393
4394         return sv;
4395 }
4396
4397 /*
4398  * retrieve_byte
4399  *
4400  * Retrieve defined byte (small integer within the [-128, +127] range).
4401  * Layout is SX_BYTE <data>, whith SX_BYTE already read.
4402  */
4403 static SV *retrieve_byte(stcxt_t *cxt, char *cname)
4404 {
4405         SV *sv;
4406         int siv;
4407         signed char tmp;        /* Workaround for AIX cc bug --H.Merijn Brand */
4408
4409         TRACEME(("retrieve_byte (#%d)", cxt->tagnum));
4410
4411         GETMARK(siv);
4412         TRACEME(("small integer read as %d", (unsigned char) siv));
4413         tmp = (unsigned char) siv - 128;
4414         sv = newSViv(tmp);
4415         SEEN(sv, cname);        /* Associate this new scalar with tag "tagnum" */
4416
4417         TRACEME(("byte %d", tmp));
4418         TRACEME(("ok (retrieve_byte at 0x%"UVxf")", PTR2UV(sv)));
4419
4420         return sv;
4421 }
4422
4423 /*
4424  * retrieve_undef
4425  *
4426  * Return the undefined value.
4427  */
4428 static SV *retrieve_undef(stcxt_t *cxt, char *cname)
4429 {
4430         SV* sv;
4431
4432         TRACEME(("retrieve_undef"));
4433
4434         sv = newSV(0);
4435         SEEN(sv, cname);
4436
4437         return sv;
4438 }
4439
4440 /*
4441  * retrieve_sv_undef
4442  *
4443  * Return the immortal undefined value.
4444  */
4445 static SV *retrieve_sv_undef(stcxt_t *cxt, char *cname)
4446 {
4447         SV *sv = &PL_sv_undef;
4448
4449         TRACEME(("retrieve_sv_undef"));
4450
4451         SEEN(sv, cname);
4452         return sv;
4453 }
4454
4455 /*
4456  * retrieve_sv_yes
4457  *
4458  * Return the immortal yes value.
4459  */
4460 static SV *retrieve_sv_yes(stcxt_t *cxt, char *cname)
4461 {
4462         SV *sv = &PL_sv_yes;
4463
4464         TRACEME(("retrieve_sv_yes"));
4465
4466         SEEN(sv, cname);
4467         return sv;
4468 }
4469
4470 /*
4471  * retrieve_sv_no
4472  *
4473  * Return the immortal no value.
4474  */
4475 static SV *retrieve_sv_no(stcxt_t *cxt, char *cname)
4476 {
4477         SV *sv = &PL_sv_no;
4478
4479         TRACEME(("retrieve_sv_no"));
4480
4481         SEEN(sv, cname);
4482         return sv;
4483 }
4484
4485 /*
4486  * retrieve_array
4487  *
4488  * Retrieve a whole array.
4489  * Layout is SX_ARRAY <size> followed by each item, in increading index order.
4490  * Each item is stored as <object>.
4491  *
4492  * When we come here, SX_ARRAY has been read already.
4493  */
4494 static SV *retrieve_array(stcxt_t *cxt, char *cname)
4495 {
4496         I32 len;
4497         I32 i;
4498         AV *av;
4499         SV *sv;
4500
4501         TRACEME(("retrieve_array (#%d)", cxt->tagnum));
4502
4503         /*
4504          * Read length, and allocate array, then pre-extend it.
4505          */
4506
4507         RLEN(len);
4508         TRACEME(("size = %d", len));
4509         av = newAV();
4510         SEEN(av, cname);                        /* Will return if array not allocated nicely */
4511         if (len)
4512                 av_extend(av, len);
4513         else
4514                 return (SV *) av;               /* No data follow if array is empty */
4515
4516         /*
4517          * Now get each item in turn...
4518          */
4519
4520         for (i = 0; i < len; i++) {
4521                 TRACEME(("(#%d) item", i));
4522                 sv = retrieve(cxt, 0);                  /* Retrieve item */
4523                 if (!sv)
4524                         return (SV *) 0;
4525                 if (av_store(av, i, sv) == 0)
4526                         return (SV *) 0;
4527         }
4528
4529         TRACEME(("ok (retrieve_array at 0x%"UVxf")", PTR2UV(av)));
4530
4531         return (SV *) av;
4532 }
4533
4534 /*
4535  * retrieve_hash
4536  *
4537  * Retrieve a whole hash table.
4538  * Layout is SX_HASH <size> followed by each key/value pair, in random order.
4539  * Keys are stored as <length> <data>, the <data> section being omitted
4540  * if length is 0.
4541  * Values are stored as <object>.
4542  *
4543  * When we come here, SX_HASH has been read already.
4544  */
4545 static SV *retrieve_hash(stcxt_t *cxt, char *cname)
4546 {
4547         I32 len;
4548         I32 size;
4549         I32 i;
4550         HV *hv;
4551         SV *sv;
4552
4553         TRACEME(("retrieve_hash (#%d)", cxt->tagnum));
4554
4555         /*
4556          * Read length, allocate table.
4557          */
4558
4559         RLEN(len);
4560         TRACEME(("size = %d", len));
4561         hv = newHV();
4562         SEEN(hv, cname);                /* Will return if table not allocated properly */
4563         if (len == 0)
4564                 return (SV *) hv;       /* No data follow if table empty */
4565         hv_ksplit(hv, len);             /* pre-extend hash to save multiple splits */
4566
4567         /*
4568          * Now get each key/value pair in turn...
4569          */
4570
4571         for (i = 0; i < len; i++) {
4572                 /*
4573                  * Get value first.
4574                  */
4575
4576                 TRACEME(("(#%d) value", i));
4577                 sv = retrieve(cxt, 0);
4578                 if (!sv)
4579                         return (SV *) 0;
4580
4581                 /*
4582                  * Get key.
4583                  * Since we're reading into kbuf, we must ensure we're not
4584                  * recursing between the read and the hv_store() where it's used.
4585                  * Hence the key comes after the value.
4586                  */
4587
4588                 RLEN(size);                                             /* Get key size */
4589                 KBUFCHK((STRLEN)size);                                  /* Grow hash key read pool if needed */
4590                 if (size)
4591                         READ(kbuf, size);
4592                 kbuf[size] = '\0';                              /* Mark string end, just in case */
4593                 TRACEME(("(#%d) key '%s'", i, kbuf));
4594
4595                 /*
4596                  * Enter key/value pair into hash table.
4597                  */
4598
4599                 if (hv_store(hv, kbuf, (U32) size, sv, 0) == 0)
4600                         return (SV *) 0;
4601         }
4602
4603         TRACEME(("ok (retrieve_hash at 0x%"UVxf")", PTR2UV(hv)));
4604
4605         return (SV *) hv;
4606 }
4607
4608 /*
4609  * retrieve_hash
4610  *
4611  * Retrieve a whole hash table.
4612  * Layout is SX_HASH <size> followed by each key/value pair, in random order.
4613  * Keys are stored as <length> <data>, the <data> section being omitted
4614  * if length is 0.
4615  * Values are stored as <object>.
4616  *
4617  * When we come here, SX_HASH has been read already.
4618  */
4619 static SV *retrieve_flag_hash(stcxt_t *cxt, char *cname)
4620 {
4621     I32 len;
4622     I32 size;
4623     I32 i;
4624     HV *hv;
4625     SV *sv;
4626     int hash_flags;
4627
4628     GETMARK(hash_flags);
4629     TRACEME(("retrieve_flag_hash (#%d)", cxt->tagnum));
4630     /*
4631      * Read length, allocate table.
4632      */
4633
4634 #ifndef HAS_RESTRICTED_HASHES
4635     if (hash_flags & SHV_RESTRICTED) {
4636         if (cxt->derestrict < 0)
4637             cxt->derestrict
4638                 = (SvTRUE(perl_get_sv("Storable::downgrade_restricted", TRUE))
4639                    ? 1 : 0);
4640         if (cxt->derestrict == 0)
4641             RESTRICTED_HASH_CROAK();
4642     }
4643 #endif
4644
4645     RLEN(len);
4646     TRACEME(("size = %d, flags = %d", len, hash_flags));
4647     hv = newHV();
4648     SEEN(hv, cname);            /* Will return if table not allocated properly */
4649     if (len == 0)
4650         return (SV *) hv;       /* No data follow if table empty */
4651     hv_ksplit(hv, len);         /* pre-extend hash to save multiple splits */
4652
4653     /*
4654      * Now get each key/value pair in turn...
4655      */
4656
4657     for (i = 0; i < len; i++) {
4658         int flags;
4659         int store_flags = 0;
4660         /*
4661          * Get value first.
4662          */
4663
4664         TRACEME(("(#%d) value", i));
4665         sv = retrieve(cxt, 0);
4666         if (!sv)
4667             return (SV *) 0;
4668
4669         GETMARK(flags);
4670 #ifdef HAS_RESTRICTED_HASHES
4671         if ((hash_flags & SHV_RESTRICTED) && (flags & SHV_K_LOCKED))
4672             SvREADONLY_on(sv);
4673 #endif
4674
4675         if (flags & SHV_K_ISSV) {
4676             /* XXX you can't set a placeholder with an SV key.
4677                Then again, you can't get an SV key.
4678                Without messing around beyond what the API is supposed to do.
4679             */
4680             SV *keysv;
4681             TRACEME(("(#%d) keysv, flags=%d", i, flags));
4682             keysv = retrieve(cxt, 0);
4683             if (!keysv)
4684                 return (SV *) 0;
4685
4686             if (!hv_store_ent(hv, keysv, sv, 0))
4687                 return (SV *) 0;
4688         } else {
4689             /*
4690              * Get key.
4691              * Since we're reading into kbuf, we must ensure we're not
4692              * recursing between the read and the hv_store() where it's used.
4693              * Hence the key comes after the value.
4694              */
4695
4696             if (flags & SHV_K_PLACEHOLDER) {
4697                 SvREFCNT_dec (sv);
4698                 sv = &PL_sv_undef;
4699                 store_flags |= HVhek_PLACEHOLD;
4700             }
4701             if (flags & SHV_K_UTF8) {
4702 #ifdef HAS_UTF8_HASHES
4703                 store_flags |= HVhek_UTF8;
4704 #else
4705                 if (cxt->use_bytes < 0)
4706                     cxt->use_bytes
4707                         = (SvTRUE(perl_get_sv("Storable::drop_utf8", TRUE))
4708                            ? 1 : 0);
4709                 if (cxt->use_bytes == 0)
4710                     UTF8_CROAK();
4711 #endif
4712             }
4713 #ifdef HAS_UTF8_HASHES
4714             if (flags & SHV_K_WASUTF8)
4715                 store_flags |= HVhek_WASUTF8;
4716 #endif
4717
4718             RLEN(size);                                         /* Get key size */
4719             KBUFCHK((STRLEN)size);                              /* Grow hash key read pool if needed */
4720             if (size)
4721                 READ(kbuf, size);
4722             kbuf[size] = '\0';                          /* Mark string end, just in case */
4723             TRACEME(("(#%d) key '%s' flags %X store_flags %X", i, kbuf,
4724                      flags, store_flags));
4725
4726             /*
4727              * Enter key/value pair into hash table.
4728              */
4729
4730 #ifdef HAS_RESTRICTED_HASHES
4731             if (hv_store_flags(hv, kbuf, size, sv, 0, flags) == 0)
4732                 return (SV *) 0;
4733 #else
4734             if (!(store_flags & HVhek_PLACEHOLD))
4735                 if (hv_store(hv, kbuf, size, sv, 0) == 0)
4736                     return (SV *) 0;
4737 #endif
4738         }
4739     }
4740 #ifdef HAS_RESTRICTED_HASHES
4741     if (hash_flags & SHV_RESTRICTED)
4742         SvREADONLY_on(hv);
4743 #endif
4744
4745     TRACEME(("ok (retrieve_hash at 0x%"UVxf")", PTR2UV(hv)));
4746
4747     return (SV *) hv;
4748 }
4749
4750 /*
4751  * old_retrieve_array
4752  *
4753  * Retrieve a whole array in pre-0.6 binary format.
4754  *
4755  * Layout is SX_ARRAY <size> followed by each item, in increading index order.
4756  * Each item is stored as SX_ITEM <object> or SX_IT_UNDEF for "holes".
4757  *
4758  * When we come here, SX_ARRAY has been read already.
4759  */
4760 static SV *old_retrieve_array(stcxt_t *cxt, char *cname)
4761 {
4762         I32 len;
4763         I32 i;
4764         AV *av;
4765         SV *sv;
4766         int c;
4767
4768         TRACEME(("old_retrieve_array (#%d)", cxt->tagnum));
4769
4770         /*
4771          * Read length, and allocate array, then pre-extend it.
4772          */
4773
4774         RLEN(len);
4775         TRACEME(("size = %d", len));
4776         av = newAV();
4777         SEEN(av, 0);                            /* Will return if array not allocated nicely */
4778         if (len)
4779                 av_extend(av, len);
4780         else
4781                 return (SV *) av;               /* No data follow if array is empty */
4782
4783         /*
4784          * Now get each item in turn...
4785          */
4786
4787         for (i = 0; i < len; i++) {
4788                 GETMARK(c);
4789                 if (c == SX_IT_UNDEF) {
4790                         TRACEME(("(#%d) undef item", i));
4791                         continue;                       /* av_extend() already filled us with undef */
4792                 }
4793                 if (c != SX_ITEM)
4794                         (void) retrieve_other((stcxt_t *) 0, 0);        /* Will croak out */
4795                 TRACEME(("(#%d) item", i));
4796                 sv = retrieve(cxt, 0);                                          /* Retrieve item */
4797                 if (!sv)
4798                         return (SV *) 0;
4799                 if (av_store(av, i, sv) == 0)
4800                         return (SV *) 0;
4801         }
4802
4803         TRACEME(("ok (old_retrieve_array at 0x%"UVxf")", PTR2UV(av)));
4804
4805         return (SV *) av;
4806 }
4807
4808 /*
4809  * old_retrieve_hash
4810  *
4811  * Retrieve a whole hash table in pre-0.6 binary format.
4812  *
4813  * Layout is SX_HASH <size> followed by each key/value pair, in random order.
4814  * Keys are stored as SX_KEY <length> <data>, the <data> section being omitted
4815  * if length is 0.
4816  * Values are stored as SX_VALUE <object> or SX_VL_UNDEF for "holes".
4817  *
4818  * When we come here, SX_HASH has been read already.
4819  */
4820 static SV *old_retrieve_hash(stcxt_t *cxt, char *cname)
4821 {
4822         I32 len;
4823         I32 size;
4824         I32 i;
4825         HV *hv;
4826         SV *sv = (SV *) 0;
4827         int c;
4828         static SV *sv_h_undef = (SV *) 0;               /* hv_store() bug */
4829
4830         TRACEME(("old_retrieve_hash (#%d)", cxt->tagnum));
4831
4832         /*
4833          * Read length, allocate table.
4834          */
4835
4836         RLEN(len);
4837         TRACEME(("size = %d", len));
4838         hv = newHV();
4839         SEEN(hv, 0);                    /* Will return if table not allocated properly */
4840         if (len == 0)
4841                 return (SV *) hv;       /* No data follow if table empty */
4842         hv_ksplit(hv, len);             /* pre-extend hash to save multiple splits */
4843
4844         /*
4845          * Now get each key/value pair in turn...
4846          */
4847
4848         for (i = 0; i < len; i++) {
4849                 /*
4850                  * Get value first.
4851                  */
4852
4853                 GETMARK(c);
4854                 if (c == SX_VL_UNDEF) {
4855                         TRACEME(("(#%d) undef value", i));
4856                         /*
4857                          * Due to a bug in hv_store(), it's not possible to pass
4858                          * &PL_sv_undef to hv_store() as a value, otherwise the
4859                          * associated key will not be creatable any more. -- RAM, 14/01/97
4860                          */
4861                         if (!sv_h_undef)
4862                                 sv_h_undef = newSVsv(&PL_sv_undef);
4863                         sv = SvREFCNT_inc(sv_h_undef);
4864                 } else if (c == SX_VALUE) {
4865                         TRACEME(("(#%d) value", i));
4866                         sv = retrieve(cxt, 0);
4867                         if (!sv)
4868                                 return (SV *) 0;
4869                 } else
4870                         (void) retrieve_other((stcxt_t *) 0, 0);        /* Will croak out */
4871
4872                 /*
4873                  * Get key.
4874                  * Since we're reading into kbuf, we must ensure we're not
4875                  * recursing between the read and the hv_store() where it's used.
4876                  * Hence the key comes after the value.
4877                  */
4878
4879                 GETMARK(c);
4880                 if (c != SX_KEY)
4881                         (void) retrieve_other((stcxt_t *) 0, 0);        /* Will croak out */
4882                 RLEN(size);                                             /* Get key size */
4883                 KBUFCHK((STRLEN)size);                                  /* Grow hash key read pool if needed */
4884                 if (size)
4885                         READ(kbuf, size);
4886                 kbuf[size] = '\0';                              /* Mark string end, just in case */
4887                 TRACEME(("(#%d) key '%s'", i, kbuf));
4888
4889                 /*
4890                  * Enter key/value pair into hash table.
4891                  */
4892
4893                 if (hv_store(hv, kbuf, (U32) size, sv, 0) == 0)
4894                         return (SV *) 0;
4895         }
4896
4897         TRACEME(("ok (retrieve_hash at 0x%"UVxf")", PTR2UV(hv)));
4898
4899         return (SV *) hv;
4900 }
4901
4902 /***
4903  *** Retrieval engine.
4904  ***/
4905
4906 /*
4907  * magic_check
4908  *
4909  * Make sure the stored data we're trying to retrieve has been produced
4910  * on an ILP compatible system with the same byteorder. It croaks out in
4911  * case an error is detected. [ILP = integer-long-pointer sizes]
4912  * Returns null if error is detected, &PL_sv_undef otherwise.
4913  *
4914  * Note that there's no byte ordering info emitted when network order was
4915  * used at store time.
4916  */
4917 static SV *magic_check(stcxt_t *cxt)
4918 {
4919         char buf[256];
4920         char byteorder[256];
4921         int c;
4922         int use_network_order;
4923         int version_major;
4924         int version_minor = 0;
4925
4926         TRACEME(("magic_check"));
4927
4928         /*
4929          * The "magic number" is only for files, not when freezing in memory.
4930          */
4931
4932         if (cxt->fio) {
4933                 STRLEN len = sizeof(magicstr) - 1;
4934                 STRLEN old_len;
4935
4936                 READ(buf, (SSize_t)len);                        /* Not null-terminated */
4937                 buf[len] = '\0';                                /* Is now */
4938
4939                 if (0 == strcmp(buf, magicstr))
4940                         goto magic_ok;
4941
4942                 /*
4943                  * Try to read more bytes to check for the old magic number, which
4944                  * was longer.
4945                  */
4946
4947                 old_len = sizeof(old_magicstr) - 1;
4948                 READ(&buf[len], (SSize_t)(old_len - len));
4949                 buf[old_len] = '\0';                    /* Is now null-terminated */
4950
4951                 if (strcmp(buf, old_magicstr))
4952                         CROAK(("File is not a perl storable"));
4953         }
4954
4955 magic_ok:
4956         /*
4957          * Starting with 0.6, the "use_network_order" byte flag is also used to
4958          * indicate the version number of the binary, and therefore governs the
4959          * setting of sv_retrieve_vtbl. See magic_write().
4960          */
4961
4962         GETMARK(use_network_order);
4963         version_major = use_network_order >> 1;
4964         cxt->retrieve_vtbl = version_major ? sv_retrieve : sv_old_retrieve;
4965
4966         TRACEME(("magic_check: netorder = 0x%x", use_network_order));
4967
4968
4969         /*
4970          * Starting with 0.7 (binary major 2), a full byte is dedicated to the
4971          * minor version of the protocol.  See magic_write().
4972          */
4973
4974         if (version_major > 1)
4975                 GETMARK(version_minor);
4976
4977         cxt->ver_major = version_major;
4978         cxt->ver_minor = version_minor;
4979
4980         TRACEME(("binary image version is %d.%d", version_major, version_minor));
4981
4982         /*
4983          * Inter-operability sanity check: we can't retrieve something stored
4984          * using a format more recent than ours, because we have no way to
4985          * know what has changed, and letting retrieval go would mean a probable
4986          * failure reporting a "corrupted" storable file.
4987          */
4988
4989         if (
4990                 version_major > STORABLE_BIN_MAJOR ||
4991                         (version_major == STORABLE_BIN_MAJOR &&
4992                         version_minor > STORABLE_BIN_MINOR)
4993             ) {
4994             int croak_now = 1;
4995             TRACEME(("but I am version is %d.%d", STORABLE_BIN_MAJOR,
4996                      STORABLE_BIN_MINOR));
4997
4998             if (version_major == STORABLE_BIN_MAJOR) {
4999                 TRACEME(("cxt->accept_future_minor is %d",
5000                          cxt->accept_future_minor));
5001                 if (cxt->accept_future_minor < 0)
5002                     cxt->accept_future_minor
5003                         = (SvTRUE(perl_get_sv("Storable::accept_future_minor",
5004                                               TRUE))
5005                            ? 1 : 0);
5006                 if (cxt->accept_future_minor == 1)
5007                     croak_now = 0;  /* Don't croak yet.  */
5008             }
5009             if (croak_now) {
5010                 CROAK(("Storable binary image v%d.%d more recent than I am (v%d.%d)",
5011                        version_major, version_minor,
5012                        STORABLE_BIN_MAJOR, STORABLE_BIN_MINOR));
5013             }
5014         }
5015
5016         /*
5017          * If they stored using network order, there's no byte ordering
5018          * information to check.
5019          */
5020
5021         if ((cxt->netorder = (use_network_order & 0x1)))        /* Extra () for -Wall */
5022                 return &PL_sv_undef;                    /* No byte ordering info */
5023
5024         sprintf(byteorder, "%lx", (unsigned long) BYTEORDER);
5025         GETMARK(c);
5026         READ(buf, c);                                           /* Not null-terminated */
5027         buf[c] = '\0';                                          /* Is now */
5028
5029         TRACEME(("byte order '%s'", buf));
5030
5031         if (strcmp(buf, byteorder))
5032                 CROAK(("Byte order is not compatible"));
5033         
5034         GETMARK(c);             /* sizeof(int) */
5035         if ((int) c != sizeof(int))
5036                 CROAK(("Integer size is not compatible"));
5037
5038         GETMARK(c);             /* sizeof(long) */
5039         if ((int) c != sizeof(long))
5040                 CROAK(("Long integer size is not compatible"));
5041
5042         GETMARK(c);             /* sizeof(char *) */
5043         if ((int) c != sizeof(char *))
5044                 CROAK(("Pointer integer size is not compatible"));
5045
5046         if (version_major >= 2 && version_minor >= 2) {
5047                 GETMARK(c);             /* sizeof(NV) */
5048                 if ((int) c != sizeof(NV))
5049                         CROAK(("Double size is not compatible"));
5050         }
5051
5052         return &PL_sv_undef;    /* OK */
5053 }
5054
5055 /*
5056  * retrieve
5057  *
5058  * Recursively retrieve objects from the specified file and return their
5059  * root SV (which may be an AV or an HV for what we care).
5060  * Returns null if there is a problem.
5061  */
5062 static SV *retrieve(stcxt_t *cxt, char *cname)
5063 {
5064         int type;
5065         SV **svh;
5066         SV *sv;
5067
5068         TRACEME(("retrieve"));
5069
5070         /*
5071          * Grab address tag which identifies the object if we are retrieving
5072          * an older format. Since the new binary format counts objects and no
5073          * longer explicitely tags them, we must keep track of the correspondance
5074          * ourselves.
5075          *
5076          * The following section will disappear one day when the old format is
5077          * no longer supported, hence the final "goto" in the "if" block.
5078          */
5079
5080         if (cxt->hseen) {                                               /* Retrieving old binary */
5081                 stag_t tag;
5082                 if (cxt->netorder) {
5083                         I32 nettag;
5084                         READ(&nettag, sizeof(I32));             /* Ordered sequence of I32 */
5085                         tag = (stag_t) nettag;
5086                 } else
5087                         READ(&tag, sizeof(stag_t));             /* Original address of the SV */
5088
5089                 GETMARK(type);
5090                 if (type == SX_OBJECT) {
5091                         I32 tagn;
5092                         svh = hv_fetch(cxt->hseen, (char *) &tag, sizeof(tag), FALSE);
5093                         if (!svh)
5094                                 CROAK(("Old tag 0x%"UVxf" should have been mapped already",
5095                                         (UV) tag));
5096                         tagn = SvIV(*svh);      /* Mapped tag number computed earlier below */
5097
5098                         /*
5099                          * The following code is common with the SX_OBJECT case below.
5100                          */
5101
5102                         svh = av_fetch(cxt->aseen, tagn, FALSE);
5103                         if (!svh)
5104                                 CROAK(("Object #%"IVdf" should have been retrieved already",
5105                                         (IV) tagn));
5106                         sv = *svh;
5107                         TRACEME(("has retrieved #%d at 0x%"UVxf, tagn, PTR2UV(sv)));
5108                         SvREFCNT_inc(sv);       /* One more reference to this same sv */
5109                         return sv;                      /* The SV pointer where object was retrieved */
5110                 }
5111
5112                 /*
5113                  * Map new object, but don't increase tagnum. This will be done
5114                  * by each of the retrieve_* functions when they call SEEN().
5115                  *
5116                  * The mapping associates the "tag" initially present with a unique
5117                  * tag number. See test for SX_OBJECT above to see how this is perused.
5118                  */
5119
5120                 if (!hv_store(cxt->hseen, (char *) &tag, sizeof(tag),
5121                                 newSViv(cxt->tagnum), 0))
5122                         return (SV *) 0;
5123
5124                 goto first_time;
5125         }
5126
5127         /*
5128          * Regular post-0.6 binary format.
5129          */
5130
5131         GETMARK(type);
5132
5133         TRACEME(("retrieve type = %d", type));
5134
5135         /*
5136          * Are we dealing with an object we should have already retrieved?
5137          */
5138
5139         if (type == SX_OBJECT) {
5140                 I32 tag;
5141                 READ_I32(tag);
5142                 tag = ntohl(tag);
5143                 svh = av_fetch(cxt->aseen, tag, FALSE);
5144                 if (!svh)
5145                         CROAK(("Object #%"IVdf" should have been retrieved already",
5146                                 (IV) tag));
5147                 sv = *svh;
5148                 TRACEME(("had retrieved #%d at 0x%"UVxf, tag, PTR2UV(sv)));
5149                 SvREFCNT_inc(sv);       /* One more reference to this same sv */
5150                 return sv;                      /* The SV pointer where object was retrieved */
5151         } else if (type >= SX_ERROR && cxt->ver_minor > STORABLE_BIN_MINOR) {
5152             if (cxt->accept_future_minor < 0)
5153                 cxt->accept_future_minor
5154                     = (SvTRUE(perl_get_sv("Storable::accept_future_minor",
5155                                           TRUE))
5156                        ? 1 : 0);
5157             if (cxt->accept_future_minor == 1) {
5158                 CROAK(("Storable binary image v%d.%d contains data of type %d. "
5159                        "This Storable is v%d.%d and can only handle data types up to %d",
5160                        cxt->ver_major, cxt->ver_minor, type,
5161                        STORABLE_BIN_MAJOR, STORABLE_BIN_MINOR, SX_ERROR - 1));
5162             }
5163         }
5164
5165 first_time:             /* Will disappear when support for old format is dropped */
5166
5167         /*
5168          * Okay, first time through for this one.
5169          */
5170
5171         sv = RETRIEVE(cxt, type)(cxt, cname);
5172         if (!sv)
5173                 return (SV *) 0;                        /* Failed */
5174
5175         /*
5176          * Old binary formats (pre-0.7).
5177          *
5178          * Final notifications, ended by SX_STORED may now follow.
5179          * Currently, the only pertinent notification to apply on the
5180          * freshly retrieved object is either:
5181          *    SX_CLASS <char-len> <classname> for short classnames.
5182          *    SX_LG_CLASS <int-len> <classname> for larger one (rare!).
5183          * Class name is then read into the key buffer pool used by
5184          * hash table key retrieval.
5185          */
5186
5187         if (cxt->ver_major < 2) {
5188                 while ((type = GETCHAR()) != SX_STORED) {
5189                         I32 len;
5190                         switch (type) {
5191                         case SX_CLASS:
5192                                 GETMARK(len);                   /* Length coded on a single char */
5193                                 break;
5194                         case SX_LG_CLASS:                       /* Length coded on a regular integer */
5195                                 RLEN(len);
5196                                 break;
5197                         case EOF:
5198                         default:
5199                                 return (SV *) 0;                /* Failed */
5200                         }
5201                         KBUFCHK((STRLEN)len);                   /* Grow buffer as necessary */
5202                         if (len)
5203                                 READ(kbuf, len);
5204                         kbuf[len] = '\0';                       /* Mark string end */
5205                         BLESS(sv, kbuf);
5206                 }
5207         }
5208
5209         TRACEME(("ok (retrieved 0x%"UVxf", refcnt=%d, %s)", PTR2UV(sv),
5210                 SvREFCNT(sv) - 1, sv_reftype(sv, FALSE)));
5211
5212         return sv;      /* Ok */
5213 }
5214
5215 /*
5216  * do_retrieve
5217  *
5218  * Retrieve data held in file and return the root object.
5219  * Common routine for pretrieve and mretrieve.
5220  */
5221 static SV *do_retrieve(
5222         PerlIO *f,
5223         SV *in,
5224         int optype)
5225 {
5226         dSTCXT;
5227         SV *sv;
5228         int is_tainted;                         /* Is input source tainted? */
5229         int pre_06_fmt = 0;                     /* True with pre Storable 0.6 formats */
5230
5231         TRACEME(("do_retrieve (optype = 0x%x)", optype));
5232
5233         optype |= ST_RETRIEVE;
5234
5235         /*
5236          * Sanity assertions for retrieve dispatch tables.
5237          */
5238
5239         ASSERT(sizeof(sv_old_retrieve) == sizeof(sv_retrieve),
5240                 ("old and new retrieve dispatch table have same size"));
5241         ASSERT(sv_old_retrieve[SX_ERROR] == retrieve_other,
5242                 ("SX_ERROR entry correctly initialized in old dispatch table"));
5243         ASSERT(sv_retrieve[SX_ERROR] == retrieve_other,
5244                 ("SX_ERROR entry correctly initialized in new dispatch table"));
5245
5246         /*
5247          * Workaround for CROAK leak: if they enter with a "dirty" context,
5248          * free up memory for them now.
5249          */
5250
5251         if (cxt->s_dirty)
5252                 clean_context(cxt);
5253
5254         /*
5255          * Now that STORABLE_xxx hooks exist, it is possible that they try to
5256          * re-enter retrieve() via the hooks.
5257          */
5258
5259         if (cxt->entry)
5260                 cxt = allocate_context(cxt);
5261
5262         cxt->entry++;
5263
5264         ASSERT(cxt->entry == 1, ("starting new recursion"));
5265         ASSERT(!cxt->s_dirty, ("clean context"));
5266
5267         /*
5268          * Prepare context.
5269          *
5270          * Data is loaded into the memory buffer when f is NULL, unless `in' is
5271          * also NULL, in which case we're expecting the data to already lie
5272          * in the buffer (dclone case).
5273          */
5274
5275         KBUFINIT();                                     /* Allocate hash key reading pool once */
5276
5277         if (!f && in)
5278                 MBUF_SAVE_AND_LOAD(in);
5279
5280         /*
5281          * Magic number verifications.
5282          *
5283          * This needs to be done before calling init_retrieve_context()
5284          * since the format indication in the file are necessary to conduct
5285          * some of the initializations.
5286          */
5287
5288         cxt->fio = f;                           /* Where I/O are performed */
5289
5290         if (!magic_check(cxt))
5291                 CROAK(("Magic number checking on storable %s failed",
5292                         cxt->fio ? "file" : "string"));
5293
5294         TRACEME(("data stored in %s format",
5295                 cxt->netorder ? "net order" : "native"));
5296
5297         /*
5298          * Check whether input source is tainted, so that we don't wrongly
5299          * taint perfectly good values...
5300          *
5301          * We assume file input is always tainted.  If both `f' and `in' are
5302          * NULL, then we come from dclone, and tainted is already filled in
5303          * the context.  That's a kludge, but the whole dclone() thing is
5304          * already quite a kludge anyway! -- RAM, 15/09/2000.
5305          */
5306
5307         is_tainted = f ? 1 : (in ? SvTAINTED(in) : cxt->s_tainted);
5308         TRACEME(("input source is %s", is_tainted ? "tainted" : "trusted"));
5309         init_retrieve_context(cxt, optype, is_tainted);
5310
5311         ASSERT(is_retrieving(), ("within retrieve operation"));
5312
5313         sv = retrieve(cxt, 0);          /* Recursively retrieve object, get root SV */
5314
5315         /*
5316          * Final cleanup.
5317          */
5318
5319         if (!f && in)
5320                 MBUF_RESTORE();
5321
5322         pre_06_fmt = cxt->hseen != NULL;        /* Before we clean context */
5323
5324         /*
5325          * The "root" context is never freed.
5326          */
5327
5328         clean_retrieve_context(cxt);
5329         if (cxt->prev)                          /* This context was stacked */
5330                 free_context(cxt);              /* It was not the "root" context */
5331
5332         /*
5333          * Prepare returned value.
5334          */
5335
5336         if (!sv) {
5337                 TRACEME(("retrieve ERROR"));
5338                 return &PL_sv_undef;            /* Something went wrong, return undef */
5339         }
5340
5341         TRACEME(("retrieve got %s(0x%"UVxf")",
5342                 sv_reftype(sv, FALSE), PTR2UV(sv)));
5343
5344         /*
5345          * Backward compatibility with Storable-0.5@9 (which we know we
5346          * are retrieving if hseen is non-null): don't create an extra RV
5347          * for objects since we special-cased it at store time.
5348          *
5349          * Build a reference to the SV returned by pretrieve even if it is
5350          * already one and not a scalar, for consistency reasons.
5351          */
5352
5353         if (pre_06_fmt) {                       /* Was not handling overloading by then */
5354                 SV *rv;
5355                 TRACEME(("fixing for old formats -- pre 0.6"));
5356                 if (sv_type(sv) == svis_REF && (rv = SvRV(sv)) && SvOBJECT(rv)) {
5357                         TRACEME(("ended do_retrieve() with an object -- pre 0.6"));
5358                         return sv;
5359                 }
5360         }
5361
5362         /*
5363          * If reference is overloaded, restore behaviour.
5364          *
5365          * NB: minor glitch here: normally, overloaded refs are stored specially
5366          * so that we can croak when behaviour cannot be re-installed, and also
5367          * avoid testing for overloading magic at each reference retrieval.
5368          *
5369          * Unfortunately, the root reference is implicitely stored, so we must
5370          * check for possible overloading now.  Furthermore, if we don't restore
5371          * overloading, we cannot croak as if the original ref was, because we
5372          * have no way to determine whether it was an overloaded ref or not in
5373          * the first place.
5374          *
5375          * It's a pity that overloading magic is attached to the rv, and not to
5376          * the underlying sv as blessing is.
5377          */
5378
5379         if (SvOBJECT(sv)) {
5380                 HV *stash = (HV *) SvSTASH(sv);
5381                 SV *rv = newRV_noinc(sv);
5382                 if (stash && Gv_AMG(stash)) {
5383                         SvAMAGIC_on(rv);
5384                         TRACEME(("restored overloading on root reference"));
5385                 }
5386                 TRACEME(("ended do_retrieve() with an object"));
5387                 return rv;
5388         }
5389
5390         TRACEME(("regular do_retrieve() end"));
5391
5392         return newRV_noinc(sv);
5393 }
5394
5395 /*
5396  * pretrieve
5397  *
5398  * Retrieve data held in file and return the root object, undef on error.
5399  */
5400 SV *pretrieve(PerlIO *f)
5401 {
5402         TRACEME(("pretrieve"));
5403         return do_retrieve(f, Nullsv, 0);
5404 }
5405
5406 /*
5407  * mretrieve
5408  *
5409  * Retrieve data held in scalar and return the root object, undef on error.
5410  */
5411 SV *mretrieve(SV *sv)
5412 {
5413         TRACEME(("mretrieve"));
5414         return do_retrieve((PerlIO*) 0, sv, 0);
5415 }
5416
5417 /***
5418  *** Deep cloning
5419  ***/
5420
5421 /*
5422  * dclone
5423  *
5424  * Deep clone: returns a fresh copy of the original referenced SV tree.
5425  *
5426  * This is achieved by storing the object in memory and restoring from
5427  * there. Not that efficient, but it should be faster than doing it from
5428  * pure perl anyway.
5429  */
5430 SV *dclone(SV *sv)
5431 {
5432         dSTCXT;
5433         int size;
5434         stcxt_t *real_context;
5435         SV *out;
5436
5437         TRACEME(("dclone"));
5438
5439         /*
5440          * Workaround for CROAK leak: if they enter with a "dirty" context,
5441          * free up memory for them now.
5442          */
5443
5444         if (cxt->s_dirty)
5445                 clean_context(cxt);
5446
5447         /*
5448          * do_store() optimizes for dclone by not freeing its context, should
5449          * we need to allocate one because we're deep cloning from a hook.
5450          */
5451
5452         if (!do_store((PerlIO*) 0, sv, ST_CLONE, FALSE, (SV**) 0))
5453                 return &PL_sv_undef;                            /* Error during store */
5454
5455         /*
5456          * Because of the above optimization, we have to refresh the context,
5457          * since a new one could have been allocated and stacked by do_store().
5458          */
5459
5460         { dSTCXT; real_context = cxt; }         /* Sub-block needed for macro */
5461         cxt = real_context;                                     /* And we need this temporary... */
5462
5463         /*
5464          * Now, `cxt' may refer to a new context.
5465          */
5466
5467         ASSERT(!cxt->s_dirty, ("clean context"));
5468         ASSERT(!cxt->entry, ("entry will not cause new context allocation"));
5469
5470         size = MBUF_SIZE();
5471         TRACEME(("dclone stored %d bytes", size));
5472         MBUF_INIT(size);
5473
5474         /*
5475          * Since we're passing do_retrieve() both a NULL file and sv, we need
5476          * to pre-compute the taintedness of the input by setting cxt->tainted
5477          * to whatever state our own input string was.  -- RAM, 15/09/2000
5478          *
5479          * do_retrieve() will free non-root context.
5480          */
5481
5482         cxt->s_tainted = SvTAINTED(sv);
5483         out = do_retrieve((PerlIO*) 0, Nullsv, ST_CLONE);
5484
5485         TRACEME(("dclone returns 0x%"UVxf, PTR2UV(out)));
5486
5487         return out;
5488 }
5489
5490 /***
5491  *** Glue with perl.
5492  ***/
5493
5494 /*
5495  * The Perl IO GV object distinguishes between input and output for sockets
5496  * but not for plain files. To allow Storable to transparently work on
5497  * plain files and sockets transparently, we have to ask xsubpp to fetch the
5498  * right object for us. Hence the OutputStream and InputStream declarations.
5499  *
5500  * Before perl 5.004_05, those entries in the standard typemap are not
5501  * defined in perl include files, so we do that here.
5502  */
5503
5504 #ifndef OutputStream
5505 #define OutputStream    PerlIO *
5506 #define InputStream             PerlIO *
5507 #endif  /* !OutputStream */
5508
5509 MODULE = Storable       PACKAGE = Storable::Cxt
5510
5511 void
5512 DESTROY(self)
5513     SV *self
5514 PREINIT:
5515         stcxt_t *cxt = (stcxt_t *)SvPVX(SvRV(self));
5516 PPCODE:
5517         if (kbuf)
5518                 Safefree(kbuf);
5519         if (!cxt->membuf_ro && mbase)
5520                 Safefree(mbase);
5521         if (cxt->membuf_ro && (cxt->msaved).arena)
5522                 Safefree((cxt->msaved).arena);
5523
5524
5525 MODULE = Storable       PACKAGE = Storable
5526
5527 PROTOTYPES: ENABLE
5528
5529 BOOT:
5530     init_perinterp();
5531 #ifdef DEBUGME
5532     /* Only disable the used only once warning if we are in debugging mode.  */
5533     gv_fetchpv("Storable::DEBUGME",   GV_ADDMULTI, SVt_PV);
5534 #endif
5535
5536 int
5537 pstore(f,obj)
5538 OutputStream    f
5539 SV *    obj
5540
5541 int
5542 net_pstore(f,obj)
5543 OutputStream    f
5544 SV *    obj
5545
5546 SV *
5547 mstore(obj)
5548 SV *    obj
5549
5550 SV *
5551 net_mstore(obj)
5552 SV *    obj
5553
5554 SV *
5555 pretrieve(f)
5556 InputStream     f
5557
5558 SV *
5559 mretrieve(sv)
5560 SV *    sv
5561
5562 SV *
5563 dclone(sv)
5564 SV *    sv
5565
5566 int
5567 last_op_in_netorder()
5568
5569 int
5570 is_storing()
5571
5572 int
5573 is_retrieving()
5574