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