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