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