This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
6960d6c551e87179ccef1d389fed1f3d031e05f5
[perl5.git] / dist / 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 < 10 || (PERL_VERSION == 10 && PERL_SUBVERSION < 1)
21 #define NEED_load_module
22 #define NEED_vload_module
23 #define NEED_newCONSTSUB
24 #define NEED_newSVpvn_flags
25 #define NEED_newRV_noinc
26 #include "ppport.h"             /* handle old perls */
27 #endif
28
29 #if 0
30 #define DEBUGME /* Debug mode, turns assertions on as well */
31 #define DASSERT /* Assertion mode */
32 #endif
33
34 /*
35  * Pre PerlIO time when none of USE_PERLIO and PERLIO_IS_STDIO is defined
36  * Provide them with the necessary defines so they can build with pre-5.004.
37  */
38 #ifndef USE_PERLIO
39 #ifndef PERLIO_IS_STDIO
40 #define PerlIO FILE
41 #define PerlIO_getc(x) getc(x)
42 #define PerlIO_putc(f,x) putc(x,f)
43 #define PerlIO_read(x,y,z) fread(y,1,z,x)
44 #define PerlIO_write(x,y,z) fwrite(y,1,z,x)
45 #define PerlIO_stdoutf printf
46 #endif  /* PERLIO_IS_STDIO */
47 #endif  /* USE_PERLIO */
48
49 /*
50  * Earlier versions of perl might be used, we can't assume they have the latest!
51  */
52
53 #ifndef HvSHAREKEYS_off
54 #define HvSHAREKEYS_off(hv)     /* Ignore */
55 #endif
56
57 /* perl <= 5.8.2 needs this */
58 #ifndef SvIsCOW
59 # define SvIsCOW(sv) 0
60 #endif
61
62 #ifndef HvRITER_set
63 #  define HvRITER_set(hv,r)     (HvRITER(hv) = r)
64 #endif
65 #ifndef HvEITER_set
66 #  define HvEITER_set(hv,r)     (HvEITER(hv) = r)
67 #endif
68
69 #ifndef HvRITER_get
70 #  define HvRITER_get HvRITER
71 #endif
72 #ifndef HvEITER_get
73 #  define HvEITER_get HvEITER
74 #endif
75
76 #ifndef HvPLACEHOLDERS_get
77 #  define HvPLACEHOLDERS_get HvPLACEHOLDERS
78 #endif
79
80 #ifndef HvTOTALKEYS
81 #  define HvTOTALKEYS(hv)       HvKEYS(hv)
82 #endif
83
84 #ifdef SVf_IsCOW
85 #  define SvTRULYREADONLY(sv)   SvREADONLY(sv)
86 #else
87 #  define SvTRULYREADONLY(sv)   (SvREADONLY(sv) && !SvIsCOW(sv))
88 #endif
89
90 #ifdef DEBUGME
91
92 #ifndef DASSERT
93 #define DASSERT
94 #endif
95
96 /*
97  * TRACEME() will only output things when the $Storable::DEBUGME is true.
98  */
99
100 #define TRACEME(x)                                                                              \
101   STMT_START {                                                                                  \
102         if (SvTRUE(perl_get_sv("Storable::DEBUGME", GV_ADD)))   \
103                 { PerlIO_stdoutf x; PerlIO_stdoutf("\n"); }             \
104   } STMT_END
105 #else
106 #define TRACEME(x)
107 #endif  /* DEBUGME */
108
109 #ifdef DASSERT
110 #define ASSERT(x,y)                                                                             \
111   STMT_START {                                                                                  \
112         if (!(x)) {                                                                                             \
113                 PerlIO_stdoutf("ASSERT FAILED (\"%s\", line %d): ",     \
114                         __FILE__, __LINE__);                                                    \
115                 PerlIO_stdoutf y; PerlIO_stdoutf("\n");                         \
116         }                                                                                                               \
117   } STMT_END
118 #else
119 #define ASSERT(x,y)
120 #endif
121
122 /*
123  * Type markers.
124  */
125
126 #define C(x) ((char) (x))       /* For markers with dynamic retrieval handling */
127
128 #define SX_OBJECT       C(0)    /* Already stored object */
129 #define SX_LSCALAR      C(1)    /* Scalar (large binary) follows (length, data) */
130 #define SX_ARRAY        C(2)    /* Array forthcoming (size, item list) */
131 #define SX_HASH         C(3)    /* Hash forthcoming (size, key/value pair list) */
132 #define SX_REF          C(4)    /* Reference to object forthcoming */
133 #define SX_UNDEF        C(5)    /* Undefined scalar */
134 #define SX_INTEGER      C(6)    /* Integer forthcoming */
135 #define SX_DOUBLE       C(7)    /* Double forthcoming */
136 #define SX_BYTE         C(8)    /* (signed) byte forthcoming */
137 #define SX_NETINT       C(9)    /* Integer in network order forthcoming */
138 #define SX_SCALAR       C(10)   /* Scalar (binary, small) follows (length, data) */
139 #define SX_TIED_ARRAY   C(11)   /* Tied array forthcoming */
140 #define SX_TIED_HASH    C(12)   /* Tied hash forthcoming */
141 #define SX_TIED_SCALAR  C(13)   /* Tied scalar forthcoming */
142 #define SX_SV_UNDEF     C(14)   /* Perl's immortal PL_sv_undef */
143 #define SX_SV_YES       C(15)   /* Perl's immortal PL_sv_yes */
144 #define SX_SV_NO        C(16)   /* Perl's immortal PL_sv_no */
145 #define SX_BLESS        C(17)   /* Object is blessed */
146 #define SX_IX_BLESS     C(18)   /* Object is blessed, classname given by index */
147 #define SX_HOOK         C(19)   /* Stored via hook, user-defined */
148 #define SX_OVERLOAD     C(20)   /* Overloaded reference */
149 #define SX_TIED_KEY     C(21)   /* Tied magic key forthcoming */
150 #define SX_TIED_IDX     C(22)   /* Tied magic index forthcoming */
151 #define SX_UTF8STR      C(23)   /* UTF-8 string forthcoming (small) */
152 #define SX_LUTF8STR     C(24)   /* UTF-8 string forthcoming (large) */
153 #define SX_FLAG_HASH    C(25)   /* Hash with flags forthcoming (size, flags, key/flags/value triplet list) */
154 #define SX_CODE         C(26)   /* Code references as perl source code */
155 #define SX_WEAKREF      C(27)   /* Weak reference to object forthcoming */
156 #define SX_WEAKOVERLOAD C(28)   /* Overloaded weak reference */
157 #define SX_VSTRING      C(29)   /* vstring forthcoming (small) */
158 #define SX_LVSTRING     C(30)   /* vstring forthcoming (large) */
159 #define SX_SVUNDEF_ELEM C(31)   /* array element set to &PL_sv_undef */
160 #define SX_ERROR        C(32)   /* Error */
161
162 /*
163  * Those are only used to retrieve "old" pre-0.6 binary images.
164  */
165 #define SX_ITEM         'i'             /* An array item introducer */
166 #define SX_IT_UNDEF     'I'             /* Undefined array item */
167 #define SX_KEY          'k'             /* A hash key introducer */
168 #define SX_VALUE        'v'             /* A hash value introducer */
169 #define SX_VL_UNDEF     'V'             /* Undefined hash value */
170
171 /*
172  * Those are only used to retrieve "old" pre-0.7 binary images
173  */
174
175 #define SX_CLASS        'b'             /* Object is blessed, class name length <255 */
176 #define SX_LG_CLASS     'B'             /* Object is blessed, class name length >255 */
177 #define SX_STORED       'X'             /* End of object */
178
179 /*
180  * Limits between short/long length representation.
181  */
182
183 #define LG_SCALAR       255             /* Large scalar length limit */
184 #define LG_BLESS        127             /* Large classname bless limit */
185
186 /*
187  * Operation types
188  */
189
190 #define ST_STORE        0x1             /* Store operation */
191 #define ST_RETRIEVE     0x2             /* Retrieval operation */
192 #define ST_CLONE        0x4             /* Deep cloning operation */
193
194 /*
195  * The following structure is used for hash table key retrieval. Since, when
196  * retrieving objects, we'll be facing blessed hash references, it's best
197  * to pre-allocate that buffer once and resize it as the need arises, never
198  * freeing it (keys will be saved away someplace else anyway, so even large
199  * keys are not enough a motivation to reclaim that space).
200  *
201  * This structure is also used for memory store/retrieve operations which
202  * happen in a fixed place before being malloc'ed elsewhere if persistence
203  * is required. Hence the aptr pointer.
204  */
205 struct extendable {
206         char *arena;            /* Will hold hash key strings, resized as needed */
207         STRLEN asiz;            /* Size of aforementioned buffer */
208         char *aptr;                     /* Arena pointer, for in-place read/write ops */
209         char *aend;                     /* First invalid address */
210 };
211
212 /*
213  * At store time:
214  * A hash table records the objects which have already been stored.
215  * Those are referred to as SX_OBJECT in the file, and their "tag" (i.e.
216  * an arbitrary sequence number) is used to identify them.
217  *
218  * At retrieve time:
219  * An array table records the objects which have already been retrieved,
220  * as seen by the tag determined by counting the objects themselves. The
221  * reference to that retrieved object is kept in the table, and is returned
222  * when an SX_OBJECT is found bearing that same tag.
223  *
224  * The same processing is used to record "classname" for blessed objects:
225  * indexing by a hash at store time, and via an array at retrieve time.
226  */
227
228 typedef unsigned long stag_t;   /* Used by pre-0.6 binary format */
229
230 /*
231  * The following "thread-safe" related defines were contributed by
232  * Murray Nesbitt <murray@activestate.com> and integrated by RAM, who
233  * only renamed things a little bit to ensure consistency with surrounding
234  * code.        -- RAM, 14/09/1999
235  *
236  * The original patch suffered from the fact that the stcxt_t structure
237  * was global.  Murray tried to minimize the impact on the code as much as
238  * possible.
239  *
240  * Starting with 0.7, Storable can be re-entrant, via the STORABLE_xxx hooks
241  * on objects.  Therefore, the notion of context needs to be generalized,
242  * threading or not.
243  */
244
245 #define MY_VERSION "Storable(" XS_VERSION ")"
246
247
248 /*
249  * Conditional UTF8 support.
250  *
251  */
252 #ifdef SvUTF8_on
253 #define STORE_UTF8STR(pv, len)  STORE_PV_LEN(pv, len, SX_UTF8STR, SX_LUTF8STR)
254 #define HAS_UTF8_SCALARS
255 #ifdef HeKUTF8
256 #define HAS_UTF8_HASHES
257 #define HAS_UTF8_ALL
258 #else
259 /* 5.6 perl has utf8 scalars but not hashes */
260 #endif
261 #else
262 #define SvUTF8(sv) 0
263 #define STORE_UTF8STR(pv, len) CROAK(("panic: storing UTF8 in non-UTF8 perl"))
264 #endif
265 #ifndef HAS_UTF8_ALL
266 #define UTF8_CROAK() CROAK(("Cannot retrieve UTF8 data in non-UTF8 perl"))
267 #endif
268 #ifndef SvWEAKREF
269 #define WEAKREF_CROAK() CROAK(("Cannot retrieve weak references in this perl"))
270 #endif
271 #ifndef SvVOK
272 #define VSTRING_CROAK() CROAK(("Cannot retrieve vstring in this perl"))
273 #endif
274
275 #ifdef HvPLACEHOLDERS
276 #define HAS_RESTRICTED_HASHES
277 #else
278 #define HVhek_PLACEHOLD 0x200
279 #define RESTRICTED_HASH_CROAK() CROAK(("Cannot retrieve restricted hash"))
280 #endif
281
282 #ifdef HvHASKFLAGS
283 #define HAS_HASH_KEY_FLAGS
284 #endif
285
286 #ifdef ptr_table_new
287 #define USE_PTR_TABLE
288 #endif
289
290 /*
291  * Fields s_tainted and s_dirty are prefixed with s_ because Perl's include
292  * files remap tainted and dirty when threading is enabled.  That's bad for
293  * perl to remap such common words.     -- RAM, 29/09/00
294  */
295
296 struct stcxt;
297 typedef struct stcxt {
298         int entry;                      /* flags recursion */
299         int optype;                     /* type of traversal operation */
300         /* which objects have been seen, store time.
301            tags are numbers, which are cast to (SV *) and stored directly */
302 #ifdef USE_PTR_TABLE
303         /* use pseen if we have ptr_tables. We have to store tag+1, because
304            tag numbers start at 0, and we can't store (SV *) 0 in a ptr_table
305            without it being confused for a fetch lookup failure.  */
306         struct ptr_tbl *pseen;
307         /* Still need hseen for the 0.6 file format code. */
308 #endif
309         HV *hseen;                      
310         AV *hook_seen;          /* which SVs were returned by STORABLE_freeze() */
311         AV *aseen;                      /* which objects have been seen, retrieve time */
312         IV where_is_undef;              /* index in aseen of PL_sv_undef */
313         HV *hclass;                     /* which classnames have been seen, store time */
314         AV *aclass;                     /* which classnames have been seen, retrieve time */
315         HV *hook;                       /* cache for hook methods per class name */
316         IV tagnum;                      /* incremented at store time for each seen object */
317         IV classnum;            /* incremented at store time for each seen classname */
318         int netorder;           /* true if network order used */
319         int s_tainted;          /* true if input source is tainted, at retrieve time */
320         int forgive_me;         /* whether to be forgiving... */
321         int deparse;        /* whether to deparse code refs */
322         SV *eval;           /* whether to eval source code */
323         int canonical;          /* whether to store hashes sorted by key */
324 #ifndef HAS_RESTRICTED_HASHES
325         int derestrict;         /* whether to downgrade restricted hashes */
326 #endif
327 #ifndef HAS_UTF8_ALL
328         int use_bytes;         /* whether to bytes-ify utf8 */
329 #endif
330         int accept_future_minor; /* croak immediately on future minor versions?  */
331         int s_dirty;            /* context is dirty due to CROAK() -- can be cleaned */
332         int membuf_ro;          /* true means membuf is read-only and msaved is rw */
333         struct extendable keybuf;       /* for hash key retrieval */
334         struct extendable membuf;       /* for memory store/retrieve operations */
335         struct extendable msaved;       /* where potentially valid mbuf is saved */
336         PerlIO *fio;            /* where I/O are performed, NULL for memory */
337         int ver_major;          /* major of version for retrieved object */
338         int ver_minor;          /* minor of version for retrieved object */
339         SV *(**retrieve_vtbl)(pTHX_ struct stcxt *, const char *);      /* retrieve dispatch table */
340         SV *prev;               /* contexts chained backwards in real recursion */
341         SV *my_sv;              /* the blessed scalar who's SvPVX() I am */
342         int in_retrieve_overloaded; /* performance hack for retrieving overloaded objects */
343 } stcxt_t;
344
345 static int storable_free(pTHX_ SV *sv, MAGIC* mg);
346
347 static MGVTBL vtbl_storable = {
348     NULL, /* get */
349     NULL, /* set */
350     NULL, /* len */
351     NULL, /* clear */
352     storable_free,
353 #ifdef MGf_COPY
354     NULL, /* copy */
355 #endif
356 #ifdef MGf_DUP
357     NULL, /* dup */
358 #endif
359 #ifdef MGf_LOCAL
360     NULL /* local */
361 #endif
362 };
363
364 /* From Digest::MD5.  */
365 #ifndef sv_magicext
366 # define sv_magicext(sv, obj, type, vtbl, name, namlen) \
367     THX_sv_magicext(aTHX_ sv, obj, type, vtbl, name, namlen)
368 static MAGIC *THX_sv_magicext(pTHX_ SV *sv, SV *obj, int type,
369     MGVTBL const *vtbl, char const *name, I32 namlen)
370 {
371     MAGIC *mg;
372     if (obj || namlen)
373         /* exceeded intended usage of this reserve implementation */
374         return NULL;
375     Newxz(mg, 1, MAGIC);
376     mg->mg_virtual = (MGVTBL*)vtbl;
377     mg->mg_type = type;
378     mg->mg_ptr = (char *)name;
379     mg->mg_len = -1;
380     (void) SvUPGRADE(sv, SVt_PVMG);
381     mg->mg_moremagic = SvMAGIC(sv);
382     SvMAGIC_set(sv, mg);
383     SvMAGICAL_off(sv);
384     mg_magical(sv);
385     return mg;
386 }
387 #endif
388
389 #define NEW_STORABLE_CXT_OBJ(cxt)                                       \
390   STMT_START {                                                                          \
391         SV *self = newSV(sizeof(stcxt_t) - 1);                  \
392         SV *my_sv = newRV_noinc(self);                                  \
393         sv_magicext(self, NULL, PERL_MAGIC_ext, &vtbl_storable, NULL, 0); \
394         cxt = (stcxt_t *)SvPVX(self);                                   \
395         Zero(cxt, 1, stcxt_t);                                                  \
396         cxt->my_sv = my_sv;                                                             \
397   } STMT_END
398
399 #if defined(MULTIPLICITY) || defined(PERL_OBJECT) || defined(PERL_CAPI)
400
401 #if (PATCHLEVEL <= 4) && (SUBVERSION < 68)
402 #define dSTCXT_SV                                                                       \
403         SV *perinterp_sv = perl_get_sv(MY_VERSION, 0)
404 #else   /* >= perl5.004_68 */
405 #define dSTCXT_SV                                                                       \
406         SV *perinterp_sv = *hv_fetch(PL_modglobal,              \
407                 MY_VERSION, sizeof(MY_VERSION)-1, TRUE)
408 #endif  /* < perl5.004_68 */
409
410 #define dSTCXT_PTR(T,name)                                                      \
411         T name = ((perinterp_sv && SvIOK(perinterp_sv) && SvIVX(perinterp_sv)   \
412                                 ? (T)SvPVX(SvRV(INT2PTR(SV*,SvIVX(perinterp_sv)))) : (T) 0))
413 #define dSTCXT                                                                          \
414         dSTCXT_SV;                                                                              \
415         dSTCXT_PTR(stcxt_t *, cxt)
416
417 #define INIT_STCXT                                                      \
418         dSTCXT;                                                                 \
419         NEW_STORABLE_CXT_OBJ(cxt);                              \
420         sv_setiv(perinterp_sv, PTR2IV(cxt->my_sv))
421
422 #define SET_STCXT(x)                                                            \
423   STMT_START {                                                                          \
424         dSTCXT_SV;                                                                              \
425         sv_setiv(perinterp_sv, PTR2IV(x->my_sv));               \
426   } STMT_END
427
428 #else /* !MULTIPLICITY && !PERL_OBJECT && !PERL_CAPI */
429
430 static stcxt_t *Context_ptr = NULL;
431 #define dSTCXT                  stcxt_t *cxt = Context_ptr
432 #define SET_STCXT(x)            Context_ptr = x
433 #define INIT_STCXT                                              \
434         dSTCXT;                                                         \
435         NEW_STORABLE_CXT_OBJ(cxt);                      \
436         SET_STCXT(cxt)
437
438
439 #endif /* MULTIPLICITY || PERL_OBJECT || PERL_CAPI */
440
441 /*
442  * KNOWN BUG:
443  *   Croaking implies a memory leak, since we don't use setjmp/longjmp
444  *   to catch the exit and free memory used during store or retrieve
445  *   operations.  This is not too difficult to fix, but I need to understand
446  *   how Perl does it, and croaking is exceptional anyway, so I lack the
447  *   motivation to do it.
448  *
449  * The current workaround is to mark the context as dirty when croaking,
450  * so that data structures can be freed whenever we renter Storable code
451  * (but only *then*: it's a workaround, not a fix).
452  *
453  * This is also imperfect, because we don't really know how far they trapped
454  * the croak(), and when we were recursing, we won't be able to clean anything
455  * but the topmost context stacked.
456  */
457
458 #define CROAK(x)        STMT_START { cxt->s_dirty = 1; croak x; } STMT_END
459
460 /*
461  * End of "thread-safe" related definitions.
462  */
463
464 /*
465  * LOW_32BITS
466  *
467  * Keep only the low 32 bits of a pointer (used for tags, which are not
468  * really pointers).
469  */
470
471 #if PTRSIZE <= 4
472 #define LOW_32BITS(x)   ((I32) (x))
473 #else
474 #define LOW_32BITS(x)   ((I32) ((unsigned long) (x) & 0xffffffffUL))
475 #endif
476
477 /*
478  * oI, oS, oC
479  *
480  * Hack for Crays, where sizeof(I32) == 8, and which are big-endians.
481  * Used in the WLEN and RLEN macros.
482  */
483
484 #if INTSIZE > 4
485 #define oI(x)   ((I32 *) ((char *) (x) + 4))
486 #define oS(x)   ((x) - 4)
487 #define oC(x)   (x = 0)
488 #define CRAY_HACK
489 #else
490 #define oI(x)   (x)
491 #define oS(x)   (x)
492 #define oC(x)
493 #endif
494
495 /*
496  * key buffer handling
497  */
498 #define kbuf    (cxt->keybuf).arena
499 #define ksiz    (cxt->keybuf).asiz
500 #define KBUFINIT()                                              \
501   STMT_START {                                                  \
502         if (!kbuf) {                                            \
503                 TRACEME(("** allocating kbuf of 128 bytes")); \
504                 New(10003, kbuf, 128, char);    \
505                 ksiz = 128;                                             \
506         }                                                                       \
507   } STMT_END
508 #define KBUFCHK(x)                              \
509   STMT_START {                                  \
510         if (x >= ksiz) {                        \
511                 TRACEME(("** extending kbuf to %d bytes (had %d)", x+1, ksiz)); \
512                 Renew(kbuf, x+1, char); \
513                 ksiz = x+1;                             \
514         }                                                       \
515   } STMT_END
516
517 /*
518  * memory buffer handling
519  */
520 #define mbase   (cxt->membuf).arena
521 #define msiz    (cxt->membuf).asiz
522 #define mptr    (cxt->membuf).aptr
523 #define mend    (cxt->membuf).aend
524
525 #define MGROW   (1 << 13)
526 #define MMASK   (MGROW - 1)
527
528 #define round_mgrow(x)  \
529         ((unsigned long) (((unsigned long) (x) + MMASK) & ~MMASK))
530 #define trunc_int(x)    \
531         ((unsigned long) ((unsigned long) (x) & ~(sizeof(int)-1)))
532 #define int_aligned(x)  \
533         ((unsigned long) (x) == trunc_int(x))
534
535 #define MBUF_INIT(x)                                    \
536   STMT_START {                                                  \
537         if (!mbase) {                                           \
538                 TRACEME(("** allocating mbase of %d bytes", MGROW)); \
539                 New(10003, mbase, MGROW, char); \
540                 msiz = (STRLEN)MGROW;                                   \
541         }                                                                       \
542         mptr = mbase;                                           \
543         if (x)                                                          \
544                 mend = mbase + x;                               \
545         else                                                            \
546                 mend = mbase + msiz;                    \
547   } STMT_END
548
549 #define MBUF_TRUNC(x)   mptr = mbase + x
550 #define MBUF_SIZE()             (mptr - mbase)
551
552 /*
553  * MBUF_SAVE_AND_LOAD
554  * MBUF_RESTORE
555  *
556  * Those macros are used in do_retrieve() to save the current memory
557  * buffer into cxt->msaved, before MBUF_LOAD() can be used to retrieve
558  * data from a string.
559  */
560 #define MBUF_SAVE_AND_LOAD(in)                  \
561   STMT_START {                                                  \
562         ASSERT(!cxt->membuf_ro, ("mbase not already saved")); \
563         cxt->membuf_ro = 1;                                     \
564         TRACEME(("saving mbuf"));                       \
565         StructCopy(&cxt->membuf, &cxt->msaved, struct extendable); \
566         MBUF_LOAD(in);                                          \
567   } STMT_END
568
569 #define MBUF_RESTORE()                                  \
570   STMT_START {                                                  \
571         ASSERT(cxt->membuf_ro, ("mbase is read-only")); \
572         cxt->membuf_ro = 0;                                     \
573         TRACEME(("restoring mbuf"));            \
574         StructCopy(&cxt->msaved, &cxt->membuf, struct extendable); \
575   } STMT_END
576
577 /*
578  * Use SvPOKp(), because SvPOK() fails on tainted scalars.
579  * See store_scalar() for other usage of this workaround.
580  */
581 #define MBUF_LOAD(v)                                    \
582   STMT_START {                                                  \
583         ASSERT(cxt->membuf_ro, ("mbase is read-only")); \
584         if (!SvPOKp(v))                                         \
585                 CROAK(("Not a scalar string")); \
586         mptr = mbase = SvPV(v, msiz);           \
587         mend = mbase + msiz;                            \
588   } STMT_END
589
590 #define MBUF_XTEND(x)                           \
591   STMT_START {                                          \
592         int nsz = (int) round_mgrow((x)+msiz);  \
593         int offset = mptr - mbase;              \
594         ASSERT(!cxt->membuf_ro, ("mbase is not read-only")); \
595         TRACEME(("** extending mbase from %d to %d bytes (wants %d new)", \
596                 msiz, nsz, (x)));                       \
597         Renew(mbase, nsz, char);                \
598         msiz = nsz;                                             \
599         mptr = mbase + offset;                  \
600         mend = mbase + nsz;                             \
601   } STMT_END
602
603 #define MBUF_CHK(x)                             \
604   STMT_START {                                          \
605         if ((mptr + (x)) > mend)                \
606                 MBUF_XTEND(x);                          \
607   } STMT_END
608
609 #define MBUF_GETC(x)                            \
610   STMT_START {                                          \
611         if (mptr < mend)                                \
612                 x = (int) (unsigned char) *mptr++;      \
613         else                                                    \
614                 return (SV *) 0;                        \
615   } STMT_END
616
617 #ifdef CRAY_HACK
618 #define MBUF_GETINT(x)                                  \
619   STMT_START {                                                  \
620         oC(x);                                                          \
621         if ((mptr + 4) <= mend) {                       \
622                 memcpy(oI(&x), mptr, 4);                \
623                 mptr += 4;                                              \
624         } else                                                          \
625                 return (SV *) 0;                                \
626   } STMT_END
627 #else
628 #define MBUF_GETINT(x)                                  \
629   STMT_START {                                                  \
630         if ((mptr + sizeof(int)) <= mend) {     \
631                 if (int_aligned(mptr))                  \
632                         x = *(int *) mptr;                      \
633                 else                                                    \
634                         memcpy(&x, mptr, sizeof(int));  \
635                 mptr += sizeof(int);                    \
636         } else                                                          \
637                 return (SV *) 0;                                \
638   } STMT_END
639 #endif
640
641 #define MBUF_READ(x,s)                          \
642   STMT_START {                                          \
643         if ((mptr + (s)) <= mend) {             \
644                 memcpy(x, mptr, s);                     \
645                 mptr += s;                                      \
646         } else                                                  \
647                 return (SV *) 0;                        \
648   } STMT_END
649
650 #define MBUF_SAFEREAD(x,s,z)            \
651   STMT_START {                                          \
652         if ((mptr + (s)) <= mend) {             \
653                 memcpy(x, mptr, s);                     \
654                 mptr += s;                                      \
655         } else {                                                \
656                 sv_free(z);                                     \
657                 return (SV *) 0;                        \
658         }                                                               \
659   } STMT_END
660
661 #define MBUF_SAFEPVREAD(x,s,z)                  \
662   STMT_START {                                  \
663         if ((mptr + (s)) <= mend) {             \
664                 memcpy(x, mptr, s);             \
665                 mptr += s;                      \
666         } else {                                \
667                 Safefree(z);                    \
668                 return (SV *) 0;                \
669         }                                       \
670   } STMT_END
671
672 #define MBUF_PUTC(c)                            \
673   STMT_START {                                          \
674         if (mptr < mend)                                \
675                 *mptr++ = (char) c;                     \
676         else {                                                  \
677                 MBUF_XTEND(1);                          \
678                 *mptr++ = (char) c;                     \
679         }                                                               \
680   } STMT_END
681
682 #ifdef CRAY_HACK
683 #define MBUF_PUTINT(i)                          \
684   STMT_START {                                          \
685         MBUF_CHK(4);                                    \
686         memcpy(mptr, oI(&i), 4);                \
687         mptr += 4;                                              \
688   } STMT_END
689 #else
690 #define MBUF_PUTINT(i)                          \
691   STMT_START {                                          \
692         MBUF_CHK(sizeof(int));                  \
693         if (int_aligned(mptr))                  \
694                 *(int *) mptr = i;                      \
695         else                                                    \
696                 memcpy(mptr, &i, sizeof(int));  \
697         mptr += sizeof(int);                    \
698   } STMT_END
699 #endif
700
701 #define MBUF_WRITE(x,s)                         \
702   STMT_START {                                          \
703         MBUF_CHK(s);                                    \
704         memcpy(mptr, x, s);                             \
705         mptr += s;                                              \
706   } STMT_END
707
708 /*
709  * Possible return values for sv_type().
710  */
711
712 #define svis_REF                0
713 #define svis_SCALAR             1
714 #define svis_ARRAY              2
715 #define svis_HASH               3
716 #define svis_TIED               4
717 #define svis_TIED_ITEM  5
718 #define svis_CODE               6
719 #define svis_OTHER              7
720
721 /*
722  * Flags for SX_HOOK.
723  */
724
725 #define SHF_TYPE_MASK           0x03
726 #define SHF_LARGE_CLASSLEN      0x04
727 #define SHF_LARGE_STRLEN        0x08
728 #define SHF_LARGE_LISTLEN       0x10
729 #define SHF_IDX_CLASSNAME       0x20
730 #define SHF_NEED_RECURSE        0x40
731 #define SHF_HAS_LIST            0x80
732
733 /*
734  * Types for SX_HOOK (last 2 bits in flags).
735  */
736
737 #define SHT_SCALAR                      0
738 #define SHT_ARRAY                       1
739 #define SHT_HASH                        2
740 #define SHT_EXTRA                       3               /* Read extra byte for type */
741
742 /*
743  * The following are held in the "extra byte"...
744  */
745
746 #define SHT_TSCALAR                     4               /* 4 + 0 -- tied scalar */
747 #define SHT_TARRAY                      5               /* 4 + 1 -- tied array */
748 #define SHT_THASH                       6               /* 4 + 2 -- tied hash */
749
750 /*
751  * per hash flags for flagged hashes
752  */
753
754 #define SHV_RESTRICTED          0x01
755
756 /*
757  * per key flags for flagged hashes
758  */
759
760 #define SHV_K_UTF8              0x01
761 #define SHV_K_WASUTF8           0x02
762 #define SHV_K_LOCKED            0x04
763 #define SHV_K_ISSV              0x08
764 #define SHV_K_PLACEHOLDER       0x10
765
766 /*
767  * Before 0.6, the magic string was "perl-store" (binary version number 0).
768  *
769  * Since 0.6 introduced many binary incompatibilities, the magic string has
770  * been changed to "pst0" to allow an old image to be properly retrieved by
771  * a newer Storable, but ensure a newer image cannot be retrieved with an
772  * older version.
773  *
774  * At 0.7, objects are given the ability to serialize themselves, and the
775  * set of markers is extended, backward compatibility is not jeopardized,
776  * so the binary version number could have remained unchanged.  To correctly
777  * spot errors if a file making use of 0.7-specific extensions is given to
778  * 0.6 for retrieval, the binary version was moved to "2".  And I'm introducing
779  * a "minor" version, to better track this kind of evolution from now on.
780  * 
781  */
782 static const char old_magicstr[] = "perl-store"; /* Magic number before 0.6 */
783 static const char magicstr[] = "pst0";           /* Used as a magic number */
784
785 #define MAGICSTR_BYTES  'p','s','t','0'
786 #define OLDMAGICSTR_BYTES  'p','e','r','l','-','s','t','o','r','e'
787
788 /* 5.6.x introduced the ability to have IVs as long long.
789    However, Configure still defined BYTEORDER based on the size of a long.
790    Storable uses the BYTEORDER value as part of the header, but doesn't
791    explicitly store sizeof(IV) anywhere in the header.  Hence on 5.6.x built
792    with IV as long long on a platform that uses Configure (ie most things
793    except VMS and Windows) headers are identical for the different IV sizes,
794    despite the files containing some fields based on sizeof(IV)
795    Erk. Broken-ness.
796    5.8 is consistent - the following redefinition kludge is only needed on
797    5.6.x, but the interwork is needed on 5.8 while data survives in files
798    with the 5.6 header.
799
800 */
801
802 #if defined (IVSIZE) && (IVSIZE == 8) && (LONGSIZE == 4)
803 #ifndef NO_56_INTERWORK_KLUDGE
804 #define USE_56_INTERWORK_KLUDGE
805 #endif
806 #if BYTEORDER == 0x1234
807 #undef BYTEORDER
808 #define BYTEORDER 0x12345678
809 #else
810 #if BYTEORDER == 0x4321
811 #undef BYTEORDER
812 #define BYTEORDER 0x87654321
813 #endif
814 #endif
815 #endif
816
817 #if BYTEORDER == 0x1234
818 #define BYTEORDER_BYTES  '1','2','3','4'
819 #else
820 #if BYTEORDER == 0x12345678
821 #define BYTEORDER_BYTES  '1','2','3','4','5','6','7','8'
822 #ifdef USE_56_INTERWORK_KLUDGE
823 #define BYTEORDER_BYTES_56  '1','2','3','4'
824 #endif
825 #else
826 #if BYTEORDER == 0x87654321
827 #define BYTEORDER_BYTES  '8','7','6','5','4','3','2','1'
828 #ifdef USE_56_INTERWORK_KLUDGE
829 #define BYTEORDER_BYTES_56  '4','3','2','1'
830 #endif
831 #else
832 #if BYTEORDER == 0x4321
833 #define BYTEORDER_BYTES  '4','3','2','1'
834 #else
835 #error Unknown byteorder. Please append your byteorder to Storable.xs
836 #endif
837 #endif
838 #endif
839 #endif
840
841 static const char byteorderstr[] = {BYTEORDER_BYTES, 0};
842 #ifdef USE_56_INTERWORK_KLUDGE
843 static const char byteorderstr_56[] = {BYTEORDER_BYTES_56, 0};
844 #endif
845
846 #define STORABLE_BIN_MAJOR      2               /* Binary major "version" */
847 #define STORABLE_BIN_MINOR      10              /* Binary minor "version" */
848
849 #if (PATCHLEVEL <= 5)
850 #define STORABLE_BIN_WRITE_MINOR        4
851 #elif !defined (SvVOK)
852 /*
853  * Perl 5.6.0-5.8.0 can do weak references, but not vstring magic.
854 */
855 #define STORABLE_BIN_WRITE_MINOR        8
856 #elif PATCHLEVEL >= 19
857 /* Perl 5.19 takes away the special meaning of PL_sv_undef in arrays. */
858 #define STORABLE_BIN_WRITE_MINOR        10
859 #else
860 #define STORABLE_BIN_WRITE_MINOR        9
861 #endif /* (PATCHLEVEL <= 5) */
862
863 #if (PATCHLEVEL < 8 || (PATCHLEVEL == 8 && SUBVERSION < 1))
864 #define PL_sv_placeholder PL_sv_undef
865 #endif
866
867 /*
868  * Useful store shortcuts...
869  */
870
871 /*
872  * Note that if you put more than one mark for storing a particular
873  * type of thing, *and* in the retrieve_foo() function you mark both
874  * the thingy's you get off with SEEN(), you *must* increase the
875  * tagnum with cxt->tagnum++ along with this macro!
876  *     - samv 20Jan04
877  */
878 #define PUTMARK(x)                                                      \
879   STMT_START {                                                          \
880         if (!cxt->fio)                                                  \
881                 MBUF_PUTC(x);                                           \
882         else if (PerlIO_putc(cxt->fio, x) == EOF)       \
883                 return -1;                                                      \
884   } STMT_END
885
886 #define WRITE_I32(x)                                    \
887   STMT_START {                                                  \
888         ASSERT(sizeof(x) == sizeof(I32), ("writing an I32"));   \
889         if (!cxt->fio)                                          \
890                 MBUF_PUTINT(x);                                 \
891         else if (PerlIO_write(cxt->fio, oI(&x), oS(sizeof(x))) != oS(sizeof(x))) \
892                 return -1;                                      \
893   } STMT_END
894
895 #ifdef HAS_HTONL
896 #define WLEN(x)                                         \
897   STMT_START {                                          \
898         ASSERT(sizeof(x) == sizeof(int), ("WLEN writing an int"));      \
899         if (cxt->netorder) {                    \
900                 int y = (int) htonl(x);         \
901                 if (!cxt->fio)                          \
902                         MBUF_PUTINT(y);                 \
903                 else if (PerlIO_write(cxt->fio,oI(&y),oS(sizeof(y))) != oS(sizeof(y))) \
904                         return -1;                              \
905         } else {                                                \
906                 if (!cxt->fio)                          \
907                         MBUF_PUTINT(x);                 \
908                 else if (PerlIO_write(cxt->fio,oI(&x),oS(sizeof(x))) != oS(sizeof(x))) \
909                         return -1;                              \
910         }                                                               \
911   } STMT_END
912 #else
913 #define WLEN(x) WRITE_I32(x)
914 #endif
915
916 #define WRITE(x,y)                                                      \
917   STMT_START {                                                          \
918         if (!cxt->fio)                                                  \
919                 MBUF_WRITE(x,y);                                        \
920         else if (PerlIO_write(cxt->fio, x, y) != y)     \
921                 return -1;                                                      \
922   } STMT_END
923
924 #define STORE_PV_LEN(pv, len, small, large)                     \
925   STMT_START {                                                  \
926         if (len <= LG_SCALAR) {                         \
927                 unsigned char clen = (unsigned char) len;       \
928                 PUTMARK(small);                                 \
929                 PUTMARK(clen);                                  \
930                 if (len)                                                \
931                         WRITE(pv, len);                         \
932         } else {                                                        \
933                 PUTMARK(large);                                 \
934                 WLEN(len);                                              \
935                 WRITE(pv, len);                                 \
936         }                                                                       \
937   } STMT_END
938
939 #define STORE_SCALAR(pv, len)   STORE_PV_LEN(pv, len, SX_SCALAR, SX_LSCALAR)
940
941 /*
942  * Store &PL_sv_undef in arrays without recursing through store().  We
943  * actually use this to represent nonexistent elements, for historical
944  * reasons.
945  */
946 #define STORE_SV_UNDEF()                                        \
947   STMT_START {                                                  \
948         cxt->tagnum++;                                          \
949         PUTMARK(SX_SV_UNDEF);                                   \
950   } STMT_END
951
952 /*
953  * Useful retrieve shortcuts...
954  */
955
956 #define GETCHAR() \
957         (cxt->fio ? PerlIO_getc(cxt->fio) : (mptr >= mend ? EOF : (int) *mptr++))
958
959 #define GETMARK(x)                                                              \
960   STMT_START {                                                                  \
961         if (!cxt->fio)                                                          \
962                 MBUF_GETC(x);                                                   \
963         else if ((int) (x = PerlIO_getc(cxt->fio)) == EOF)      \
964                 return (SV *) 0;                                                \
965   } STMT_END
966
967 #define READ_I32(x)                                             \
968   STMT_START {                                                  \
969         ASSERT(sizeof(x) == sizeof(I32), ("reading an I32"));   \
970         oC(x);                                                          \
971         if (!cxt->fio)                                          \
972                 MBUF_GETINT(x);                                 \
973         else if (PerlIO_read(cxt->fio, oI(&x), oS(sizeof(x))) != oS(sizeof(x))) \
974                 return (SV *) 0;                                \
975   } STMT_END
976
977 #ifdef HAS_NTOHL
978 #define RLEN(x)                                                 \
979   STMT_START {                                                  \
980         oC(x);                                                          \
981         if (!cxt->fio)                                          \
982                 MBUF_GETINT(x);                                 \
983         else if (PerlIO_read(cxt->fio, oI(&x), oS(sizeof(x))) != oS(sizeof(x))) \
984                 return (SV *) 0;                                \
985         if (cxt->netorder)                                      \
986                 x = (int) ntohl(x);                             \
987   } STMT_END
988 #else
989 #define RLEN(x) READ_I32(x)
990 #endif
991
992 #define READ(x,y)                                                       \
993   STMT_START {                                                          \
994         if (!cxt->fio)                                                  \
995                 MBUF_READ(x, y);                                        \
996         else if (PerlIO_read(cxt->fio, x, y) != y)      \
997                 return (SV *) 0;                                        \
998   } STMT_END
999
1000 #define SAFEREAD(x,y,z)                                                 \
1001   STMT_START {                                                                  \
1002         if (!cxt->fio)                                                          \
1003                 MBUF_SAFEREAD(x,y,z);                                   \
1004         else if (PerlIO_read(cxt->fio, x, y) != y)       {      \
1005                 sv_free(z);                                                             \
1006                 return (SV *) 0;                                                \
1007         }                                                                                       \
1008   } STMT_END
1009
1010 #define SAFEPVREAD(x,y,z)                                       \
1011   STMT_START {                                                  \
1012         if (!cxt->fio)                                          \
1013                 MBUF_SAFEPVREAD(x,y,z);                         \
1014         else if (PerlIO_read(cxt->fio, x, y) != y)       {      \
1015                 Safefree(z);                                    \
1016                 return (SV *) 0;                                \
1017         }                                                       \
1018   } STMT_END
1019
1020 /*
1021  * SEEN() is used at retrieve time, to remember where object 'y', bearing a
1022  * given tag 'tagnum', has been retrieved. Next time we see an SX_OBJECT marker,
1023  * we'll therefore know where it has been retrieved and will be able to
1024  * share the same reference, as in the original stored memory image.
1025  *
1026  * We also need to bless objects ASAP for hooks (which may compute "ref $x"
1027  * on the objects given to STORABLE_thaw and expect that to be defined), and
1028  * also for overloaded objects (for which we might not find the stash if the
1029  * object is not blessed yet--this might occur for overloaded objects that
1030  * refer to themselves indirectly: if we blessed upon return from a sub
1031  * retrieve(), the SX_OBJECT marker we'd found could not have overloading
1032  * restored on it because the underlying object would not be blessed yet!).
1033  *
1034  * To achieve that, the class name of the last retrieved object is passed down
1035  * recursively, and the first SEEN() call for which the class name is not NULL
1036  * will bless the object.
1037  *
1038  * i should be true iff sv is immortal (ie PL_sv_yes, PL_sv_no or PL_sv_undef)
1039  *
1040  * SEEN0() is a short-cut where stash is always NULL.
1041  */
1042 #define SEEN0(y,i)                                                      \
1043     STMT_START {                                                        \
1044         if (!y)                                                         \
1045                 return (SV *) 0;                                        \
1046         if (av_store(cxt->aseen, cxt->tagnum++, i ? (SV*)(y) : SvREFCNT_inc(y)) == 0) \
1047                 return (SV *) 0;                                        \
1048         TRACEME(("aseen(#%d) = 0x%"UVxf" (refcnt=%d)", cxt->tagnum-1,   \
1049                  PTR2UV(y), SvREFCNT(y)-1));                            \
1050     } STMT_END
1051
1052 #define SEEN(y,stash,i)                                                 \
1053     STMT_START {                                                        \
1054         SEEN0(y,i);                                                     \
1055         if (stash)                                                      \
1056                 BLESS((SV *) (y), (HV *)(stash));                       \
1057     } STMT_END
1058
1059 /*
1060  * Bless 's' in 'p', via a temporary reference, required by sv_bless().
1061  * "A" magic is added before the sv_bless for overloaded classes, this avoids
1062  * an expensive call to S_reset_amagic in sv_bless.
1063  */
1064 #define BLESS(s,stash)                                          \
1065   STMT_START {                                                          \
1066         SV *ref;                                                                \
1067         TRACEME(("blessing 0x%"UVxf" in %s", PTR2UV(s), (HvNAME_get(stash)))); \
1068         ref = newRV_noinc(s);                                   \
1069         if (cxt->in_retrieve_overloaded && Gv_AMG(stash)) \
1070         { \
1071             cxt->in_retrieve_overloaded = 0; \
1072                 SvAMAGIC_on(ref);                            \
1073         } \
1074         (void) sv_bless(ref, stash);                    \
1075         SvRV_set(ref, NULL);                                            \
1076         SvREFCNT_dec(ref);                                              \
1077   } STMT_END
1078 /*
1079  * sort (used in store_hash) - conditionally use qsort when
1080  * sortsv is not available ( <= 5.6.1 ).
1081  */
1082
1083 #if (PATCHLEVEL <= 6)
1084
1085 #if defined(USE_ITHREADS)
1086
1087 #define STORE_HASH_SORT \
1088         ENTER; { \
1089         PerlInterpreter *orig_perl = PERL_GET_CONTEXT; \
1090         SAVESPTR(orig_perl); \
1091         PERL_SET_CONTEXT(aTHX); \
1092         qsort((char *) AvARRAY(av), len, sizeof(SV *), sortcmp); \
1093         } LEAVE;
1094
1095 #else /* ! USE_ITHREADS */
1096
1097 #define STORE_HASH_SORT \
1098         qsort((char *) AvARRAY(av), len, sizeof(SV *), sortcmp);
1099
1100 #endif  /* USE_ITHREADS */
1101
1102 #else /* PATCHLEVEL > 6 */
1103
1104 #define STORE_HASH_SORT \
1105         sortsv(AvARRAY(av), len, Perl_sv_cmp);  
1106
1107 #endif /* PATCHLEVEL <= 6 */
1108
1109 static int store(pTHX_ stcxt_t *cxt, SV *sv);
1110 static SV *retrieve(pTHX_ stcxt_t *cxt, const char *cname);
1111
1112 #define UNSEE()                             \
1113   STMT_START {                              \
1114     av_pop(cxt->aseen);                     \
1115     cxt->tagnum--;                          \
1116   } STMT_END
1117
1118 /*
1119  * Dynamic dispatching table for SV store.
1120  */
1121
1122 static int store_ref(pTHX_ stcxt_t *cxt, SV *sv);
1123 static int store_scalar(pTHX_ stcxt_t *cxt, SV *sv);
1124 static int store_array(pTHX_ stcxt_t *cxt, AV *av);
1125 static int store_hash(pTHX_ stcxt_t *cxt, HV *hv);
1126 static int store_tied(pTHX_ stcxt_t *cxt, SV *sv);
1127 static int store_tied_item(pTHX_ stcxt_t *cxt, SV *sv);
1128 static int store_code(pTHX_ stcxt_t *cxt, CV *cv);
1129 static int store_other(pTHX_ stcxt_t *cxt, SV *sv);
1130 static int store_blessed(pTHX_ stcxt_t *cxt, SV *sv, int type, HV *pkg);
1131
1132 typedef int (*sv_store_t)(pTHX_ stcxt_t *cxt, SV *sv);
1133
1134 static const sv_store_t sv_store[] = {
1135         (sv_store_t)store_ref,          /* svis_REF */
1136         (sv_store_t)store_scalar,       /* svis_SCALAR */
1137         (sv_store_t)store_array,        /* svis_ARRAY */
1138         (sv_store_t)store_hash,         /* svis_HASH */
1139         (sv_store_t)store_tied,         /* svis_TIED */
1140         (sv_store_t)store_tied_item,    /* svis_TIED_ITEM */
1141         (sv_store_t)store_code,         /* svis_CODE */
1142         (sv_store_t)store_other,        /* svis_OTHER */
1143 };
1144
1145 #define SV_STORE(x)     (*sv_store[x])
1146
1147 /*
1148  * Dynamic dispatching tables for SV retrieval.
1149  */
1150
1151 static SV *retrieve_lscalar(pTHX_ stcxt_t *cxt, const char *cname);
1152 static SV *retrieve_lutf8str(pTHX_ stcxt_t *cxt, const char *cname);
1153 static SV *old_retrieve_array(pTHX_ stcxt_t *cxt, const char *cname);
1154 static SV *old_retrieve_hash(pTHX_ stcxt_t *cxt, const char *cname);
1155 static SV *retrieve_ref(pTHX_ stcxt_t *cxt, const char *cname);
1156 static SV *retrieve_undef(pTHX_ stcxt_t *cxt, const char *cname);
1157 static SV *retrieve_integer(pTHX_ stcxt_t *cxt, const char *cname);
1158 static SV *retrieve_double(pTHX_ stcxt_t *cxt, const char *cname);
1159 static SV *retrieve_byte(pTHX_ stcxt_t *cxt, const char *cname);
1160 static SV *retrieve_netint(pTHX_ stcxt_t *cxt, const char *cname);
1161 static SV *retrieve_scalar(pTHX_ stcxt_t *cxt, const char *cname);
1162 static SV *retrieve_utf8str(pTHX_ stcxt_t *cxt, const char *cname);
1163 static SV *retrieve_tied_array(pTHX_ stcxt_t *cxt, const char *cname);
1164 static SV *retrieve_tied_hash(pTHX_ stcxt_t *cxt, const char *cname);
1165 static SV *retrieve_tied_scalar(pTHX_ stcxt_t *cxt, const char *cname);
1166 static SV *retrieve_other(pTHX_ stcxt_t *cxt, const char *cname);
1167
1168 typedef SV* (*sv_retrieve_t)(pTHX_ stcxt_t *cxt, const char *name);
1169
1170 static const sv_retrieve_t sv_old_retrieve[] = {
1171         0,                      /* SX_OBJECT -- entry unused dynamically */
1172         (sv_retrieve_t)retrieve_lscalar,        /* SX_LSCALAR */
1173         (sv_retrieve_t)old_retrieve_array,      /* SX_ARRAY -- for pre-0.6 binaries */
1174         (sv_retrieve_t)old_retrieve_hash,       /* SX_HASH -- for pre-0.6 binaries */
1175         (sv_retrieve_t)retrieve_ref,            /* SX_REF */
1176         (sv_retrieve_t)retrieve_undef,          /* SX_UNDEF */
1177         (sv_retrieve_t)retrieve_integer,        /* SX_INTEGER */
1178         (sv_retrieve_t)retrieve_double,         /* SX_DOUBLE */
1179         (sv_retrieve_t)retrieve_byte,           /* SX_BYTE */
1180         (sv_retrieve_t)retrieve_netint,         /* SX_NETINT */
1181         (sv_retrieve_t)retrieve_scalar,         /* SX_SCALAR */
1182         (sv_retrieve_t)retrieve_tied_array,     /* SX_TIED_ARRAY */
1183         (sv_retrieve_t)retrieve_tied_hash,      /* SX_TIED_HASH */
1184         (sv_retrieve_t)retrieve_tied_scalar,    /* SX_TIED_SCALAR */
1185         (sv_retrieve_t)retrieve_other,  /* SX_SV_UNDEF not supported */
1186         (sv_retrieve_t)retrieve_other,  /* SX_SV_YES not supported */
1187         (sv_retrieve_t)retrieve_other,  /* SX_SV_NO not supported */
1188         (sv_retrieve_t)retrieve_other,  /* SX_BLESS not supported */
1189         (sv_retrieve_t)retrieve_other,  /* SX_IX_BLESS not supported */
1190         (sv_retrieve_t)retrieve_other,  /* SX_HOOK not supported */
1191         (sv_retrieve_t)retrieve_other,  /* SX_OVERLOADED not supported */
1192         (sv_retrieve_t)retrieve_other,  /* SX_TIED_KEY not supported */
1193         (sv_retrieve_t)retrieve_other,  /* SX_TIED_IDX not supported */
1194         (sv_retrieve_t)retrieve_other,  /* SX_UTF8STR not supported */
1195         (sv_retrieve_t)retrieve_other,  /* SX_LUTF8STR not supported */
1196         (sv_retrieve_t)retrieve_other,  /* SX_FLAG_HASH not supported */
1197         (sv_retrieve_t)retrieve_other,  /* SX_CODE not supported */
1198         (sv_retrieve_t)retrieve_other,  /* SX_WEAKREF not supported */
1199         (sv_retrieve_t)retrieve_other,  /* SX_WEAKOVERLOAD not supported */
1200         (sv_retrieve_t)retrieve_other,  /* SX_VSTRING not supported */
1201         (sv_retrieve_t)retrieve_other,  /* SX_LVSTRING not supported */
1202         (sv_retrieve_t)retrieve_other,  /* SX_SVUNDEF_ELEM not supported */
1203         (sv_retrieve_t)retrieve_other,  /* SX_ERROR */
1204 };
1205
1206 static SV *retrieve_array(pTHX_ stcxt_t *cxt, const char *cname);
1207 static SV *retrieve_hash(pTHX_ stcxt_t *cxt, const char *cname);
1208 static SV *retrieve_sv_undef(pTHX_ stcxt_t *cxt, const char *cname);
1209 static SV *retrieve_sv_yes(pTHX_ stcxt_t *cxt, const char *cname);
1210 static SV *retrieve_sv_no(pTHX_ stcxt_t *cxt, const char *cname);
1211 static SV *retrieve_blessed(pTHX_ stcxt_t *cxt, const char *cname);
1212 static SV *retrieve_idx_blessed(pTHX_ stcxt_t *cxt, const char *cname);
1213 static SV *retrieve_hook(pTHX_ stcxt_t *cxt, const char *cname);
1214 static SV *retrieve_overloaded(pTHX_ stcxt_t *cxt, const char *cname);
1215 static SV *retrieve_tied_key(pTHX_ stcxt_t *cxt, const char *cname);
1216 static SV *retrieve_tied_idx(pTHX_ stcxt_t *cxt, const char *cname);
1217 static SV *retrieve_flag_hash(pTHX_ stcxt_t *cxt, const char *cname);
1218 static SV *retrieve_code(pTHX_ stcxt_t *cxt, const char *cname);
1219 static SV *retrieve_weakref(pTHX_ stcxt_t *cxt, const char *cname);
1220 static SV *retrieve_weakoverloaded(pTHX_ stcxt_t *cxt, const char *cname);
1221 static SV *retrieve_vstring(pTHX_ stcxt_t *cxt, const char *cname);
1222 static SV *retrieve_lvstring(pTHX_ stcxt_t *cxt, const char *cname);
1223 static SV *retrieve_svundef_elem(pTHX_ stcxt_t *cxt, const char *cname);
1224
1225 static const sv_retrieve_t sv_retrieve[] = {
1226         0,                      /* SX_OBJECT -- entry unused dynamically */
1227         (sv_retrieve_t)retrieve_lscalar,        /* SX_LSCALAR */
1228         (sv_retrieve_t)retrieve_array,          /* SX_ARRAY */
1229         (sv_retrieve_t)retrieve_hash,           /* SX_HASH */
1230         (sv_retrieve_t)retrieve_ref,            /* SX_REF */
1231         (sv_retrieve_t)retrieve_undef,          /* SX_UNDEF */
1232         (sv_retrieve_t)retrieve_integer,        /* SX_INTEGER */
1233         (sv_retrieve_t)retrieve_double,         /* SX_DOUBLE */
1234         (sv_retrieve_t)retrieve_byte,           /* SX_BYTE */
1235         (sv_retrieve_t)retrieve_netint,         /* SX_NETINT */
1236         (sv_retrieve_t)retrieve_scalar,         /* SX_SCALAR */
1237         (sv_retrieve_t)retrieve_tied_array,     /* SX_TIED_ARRAY */
1238         (sv_retrieve_t)retrieve_tied_hash,      /* SX_TIED_HASH */
1239         (sv_retrieve_t)retrieve_tied_scalar,    /* SX_TIED_SCALAR */
1240         (sv_retrieve_t)retrieve_sv_undef,       /* SX_SV_UNDEF */
1241         (sv_retrieve_t)retrieve_sv_yes,         /* SX_SV_YES */
1242         (sv_retrieve_t)retrieve_sv_no,          /* SX_SV_NO */
1243         (sv_retrieve_t)retrieve_blessed,        /* SX_BLESS */
1244         (sv_retrieve_t)retrieve_idx_blessed,    /* SX_IX_BLESS */
1245         (sv_retrieve_t)retrieve_hook,           /* SX_HOOK */
1246         (sv_retrieve_t)retrieve_overloaded,     /* SX_OVERLOAD */
1247         (sv_retrieve_t)retrieve_tied_key,       /* SX_TIED_KEY */
1248         (sv_retrieve_t)retrieve_tied_idx,       /* SX_TIED_IDX */
1249         (sv_retrieve_t)retrieve_utf8str,        /* SX_UTF8STR  */
1250         (sv_retrieve_t)retrieve_lutf8str,       /* SX_LUTF8STR */
1251         (sv_retrieve_t)retrieve_flag_hash,      /* SX_HASH */
1252         (sv_retrieve_t)retrieve_code,           /* SX_CODE */
1253         (sv_retrieve_t)retrieve_weakref,        /* SX_WEAKREF */
1254         (sv_retrieve_t)retrieve_weakoverloaded, /* SX_WEAKOVERLOAD */
1255         (sv_retrieve_t)retrieve_vstring,        /* SX_VSTRING */
1256         (sv_retrieve_t)retrieve_lvstring,       /* SX_LVSTRING */
1257         (sv_retrieve_t)retrieve_svundef_elem,   /* SX_SVUNDEF_ELEM */
1258         (sv_retrieve_t)retrieve_other,          /* SX_ERROR */
1259 };
1260
1261 #define RETRIEVE(c,x) (*(c)->retrieve_vtbl[(x) >= SX_ERROR ? SX_ERROR : (x)])
1262
1263 static SV *mbuf2sv(pTHX);
1264
1265 /***
1266  *** Context management.
1267  ***/
1268
1269 /*
1270  * init_perinterp
1271  *
1272  * Called once per "thread" (interpreter) to initialize some global context.
1273  */
1274 static void init_perinterp(pTHX)
1275 {
1276     INIT_STCXT;
1277
1278     cxt->netorder = 0;          /* true if network order used */
1279     cxt->forgive_me = -1;       /* whether to be forgiving... */
1280     cxt->accept_future_minor = -1; /* would otherwise occur too late */
1281 }
1282
1283 /*
1284  * reset_context
1285  *
1286  * Called at the end of every context cleaning, to perform common reset
1287  * operations.
1288  */
1289 static void reset_context(stcxt_t *cxt)
1290 {
1291         cxt->entry = 0;
1292         cxt->s_dirty = 0;
1293         cxt->optype &= ~(ST_STORE|ST_RETRIEVE);         /* Leave ST_CLONE alone */
1294 }
1295
1296 /*
1297  * init_store_context
1298  *
1299  * Initialize a new store context for real recursion.
1300  */
1301 static void init_store_context(
1302         pTHX_
1303         stcxt_t *cxt,
1304         PerlIO *f,
1305         int optype,
1306         int network_order)
1307 {
1308         TRACEME(("init_store_context"));
1309
1310         cxt->netorder = network_order;
1311         cxt->forgive_me = -1;                   /* Fetched from perl if needed */
1312         cxt->deparse = -1;                              /* Idem */
1313         cxt->eval = NULL;                               /* Idem */
1314         cxt->canonical = -1;                    /* Idem */
1315         cxt->tagnum = -1;                               /* Reset tag numbers */
1316         cxt->classnum = -1;                             /* Reset class numbers */
1317         cxt->fio = f;                                   /* Where I/O are performed */
1318         cxt->optype = optype;                   /* A store, or a deep clone */
1319         cxt->entry = 1;                                 /* No recursion yet */
1320
1321         /*
1322          * The 'hseen' table is used to keep track of each SV stored and their
1323          * associated tag numbers is special. It is "abused" because the
1324          * values stored are not real SV, just integers cast to (SV *),
1325          * which explains the freeing below.
1326          *
1327          * It is also one possible bottleneck to achieve good storing speed,
1328          * so the "shared keys" optimization is turned off (unlikely to be
1329          * of any use here), and the hash table is "pre-extended". Together,
1330          * those optimizations increase the throughput by 12%.
1331          */
1332
1333 #ifdef USE_PTR_TABLE
1334         cxt->pseen = ptr_table_new();
1335         cxt->hseen = 0;
1336 #else
1337         cxt->hseen = newHV();                   /* Table where seen objects are stored */
1338         HvSHAREKEYS_off(cxt->hseen);
1339 #endif
1340         /*
1341          * The following does not work well with perl5.004_04, and causes
1342          * a core dump later on, in a completely unrelated spot, which
1343          * makes me think there is a memory corruption going on.
1344          *
1345          * Calling hv_ksplit(hseen, HBUCKETS) instead of manually hacking
1346          * it below does not make any difference. It seems to work fine
1347          * with perl5.004_68 but given the probable nature of the bug,
1348          * that does not prove anything.
1349          *
1350          * It's a shame because increasing the amount of buckets raises
1351          * store() throughput by 5%, but until I figure this out, I can't
1352          * allow for this to go into production.
1353          *
1354          * It is reported fixed in 5.005, hence the #if.
1355          */
1356 #if PERL_VERSION >= 5
1357 #define HBUCKETS        4096                            /* Buckets for %hseen */
1358 #ifndef USE_PTR_TABLE
1359         HvMAX(cxt->hseen) = HBUCKETS - 1;       /* keys %hseen = $HBUCKETS; */
1360 #endif
1361 #endif
1362
1363         /*
1364          * The 'hclass' hash uses the same settings as 'hseen' above, but it is
1365          * used to assign sequential tags (numbers) to class names for blessed
1366          * objects.
1367          *
1368          * We turn the shared key optimization on.
1369          */
1370
1371         cxt->hclass = newHV();                  /* Where seen classnames are stored */
1372
1373 #if PERL_VERSION >= 5
1374         HvMAX(cxt->hclass) = HBUCKETS - 1;      /* keys %hclass = $HBUCKETS; */
1375 #endif
1376
1377         /*
1378          * The 'hook' hash table is used to keep track of the references on
1379          * the STORABLE_freeze hook routines, when found in some class name.
1380          *
1381          * It is assumed that the inheritance tree will not be changed during
1382          * storing, and that no new method will be dynamically created by the
1383          * hooks.
1384          */
1385
1386         cxt->hook = newHV();                    /* Table where hooks are cached */
1387
1388         /*
1389          * The 'hook_seen' array keeps track of all the SVs returned by
1390          * STORABLE_freeze hooks for us to serialize, so that they are not
1391          * reclaimed until the end of the serialization process.  Each SV is
1392          * only stored once, the first time it is seen.
1393          */
1394
1395         cxt->hook_seen = newAV();               /* Lists SVs returned by STORABLE_freeze */
1396 }
1397
1398 /*
1399  * clean_store_context
1400  *
1401  * Clean store context by
1402  */
1403 static void clean_store_context(pTHX_ stcxt_t *cxt)
1404 {
1405         HE *he;
1406
1407         TRACEME(("clean_store_context"));
1408
1409         ASSERT(cxt->optype & ST_STORE, ("was performing a store()"));
1410
1411         /*
1412          * Insert real values into hashes where we stored faked pointers.
1413          */
1414
1415 #ifndef USE_PTR_TABLE
1416         if (cxt->hseen) {
1417                 hv_iterinit(cxt->hseen);
1418                 while ((he = hv_iternext(cxt->hseen)))  /* Extra () for -Wall, grr.. */
1419                         HeVAL(he) = &PL_sv_undef;
1420         }
1421 #endif
1422
1423         if (cxt->hclass) {
1424                 hv_iterinit(cxt->hclass);
1425                 while ((he = hv_iternext(cxt->hclass))) /* Extra () for -Wall, grr.. */
1426                         HeVAL(he) = &PL_sv_undef;
1427         }
1428
1429         /*
1430          * And now dispose of them...
1431          *
1432          * The surrounding if() protection has been added because there might be
1433          * some cases where this routine is called more than once, during
1434          * exceptional events.  This was reported by Marc Lehmann when Storable
1435          * is executed from mod_perl, and the fix was suggested by him.
1436          *              -- RAM, 20/12/2000
1437          */
1438
1439 #ifdef USE_PTR_TABLE
1440         if (cxt->pseen) {
1441                 struct ptr_tbl *pseen = cxt->pseen;
1442                 cxt->pseen = 0;
1443                 ptr_table_free(pseen);
1444         }
1445         assert(!cxt->hseen);
1446 #else
1447         if (cxt->hseen) {
1448                 HV *hseen = cxt->hseen;
1449                 cxt->hseen = 0;
1450                 hv_undef(hseen);
1451                 sv_free((SV *) hseen);
1452         }
1453 #endif
1454
1455         if (cxt->hclass) {
1456                 HV *hclass = cxt->hclass;
1457                 cxt->hclass = 0;
1458                 hv_undef(hclass);
1459                 sv_free((SV *) hclass);
1460         }
1461
1462         if (cxt->hook) {
1463                 HV *hook = cxt->hook;
1464                 cxt->hook = 0;
1465                 hv_undef(hook);
1466                 sv_free((SV *) hook);
1467         }
1468
1469         if (cxt->hook_seen) {
1470                 AV *hook_seen = cxt->hook_seen;
1471                 cxt->hook_seen = 0;
1472                 av_undef(hook_seen);
1473                 sv_free((SV *) hook_seen);
1474         }
1475
1476         cxt->forgive_me = -1;                   /* Fetched from perl if needed */
1477         cxt->deparse = -1;                              /* Idem */
1478         if (cxt->eval) {
1479             SvREFCNT_dec(cxt->eval);
1480         }
1481         cxt->eval = NULL;                               /* Idem */
1482         cxt->canonical = -1;                    /* Idem */
1483
1484         reset_context(cxt);
1485 }
1486
1487 /*
1488  * init_retrieve_context
1489  *
1490  * Initialize a new retrieve context for real recursion.
1491  */
1492 static void init_retrieve_context(pTHX_ stcxt_t *cxt, int optype, int is_tainted)
1493 {
1494         TRACEME(("init_retrieve_context"));
1495
1496         /*
1497          * The hook hash table is used to keep track of the references on
1498          * the STORABLE_thaw hook routines, when found in some class name.
1499          *
1500          * It is assumed that the inheritance tree will not be changed during
1501          * storing, and that no new method will be dynamically created by the
1502          * hooks.
1503          */
1504
1505         cxt->hook  = newHV();                   /* Caches STORABLE_thaw */
1506
1507 #ifdef USE_PTR_TABLE
1508         cxt->pseen = 0;
1509 #endif
1510
1511         /*
1512          * If retrieving an old binary version, the cxt->retrieve_vtbl variable
1513          * was set to sv_old_retrieve. We'll need a hash table to keep track of
1514          * the correspondence between the tags and the tag number used by the
1515          * new retrieve routines.
1516          */
1517
1518         cxt->hseen = (((void*)cxt->retrieve_vtbl == (void*)sv_old_retrieve)
1519                       ? newHV() : 0);
1520
1521         cxt->aseen = newAV();                   /* Where retrieved objects are kept */
1522         cxt->where_is_undef = -1;               /* Special case for PL_sv_undef */
1523         cxt->aclass = newAV();                  /* Where seen classnames are kept */
1524         cxt->tagnum = 0;                                /* Have to count objects... */
1525         cxt->classnum = 0;                              /* ...and class names as well */
1526         cxt->optype = optype;
1527         cxt->s_tainted = is_tainted;
1528         cxt->entry = 1;                                 /* No recursion yet */
1529 #ifndef HAS_RESTRICTED_HASHES
1530         cxt->derestrict = -1;           /* Fetched from perl if needed */
1531 #endif
1532 #ifndef HAS_UTF8_ALL
1533         cxt->use_bytes = -1;            /* Fetched from perl if needed */
1534 #endif
1535         cxt->accept_future_minor = -1;  /* Fetched from perl if needed */
1536         cxt->in_retrieve_overloaded = 0;
1537 }
1538
1539 /*
1540  * clean_retrieve_context
1541  *
1542  * Clean retrieve context by
1543  */
1544 static void clean_retrieve_context(pTHX_ stcxt_t *cxt)
1545 {
1546         TRACEME(("clean_retrieve_context"));
1547
1548         ASSERT(cxt->optype & ST_RETRIEVE, ("was performing a retrieve()"));
1549
1550         if (cxt->aseen) {
1551                 AV *aseen = cxt->aseen;
1552                 cxt->aseen = 0;
1553                 av_undef(aseen);
1554                 sv_free((SV *) aseen);
1555         }
1556         cxt->where_is_undef = -1;
1557
1558         if (cxt->aclass) {
1559                 AV *aclass = cxt->aclass;
1560                 cxt->aclass = 0;
1561                 av_undef(aclass);
1562                 sv_free((SV *) aclass);
1563         }
1564
1565         if (cxt->hook) {
1566                 HV *hook = cxt->hook;
1567                 cxt->hook = 0;
1568                 hv_undef(hook);
1569                 sv_free((SV *) hook);
1570         }
1571
1572         if (cxt->hseen) {
1573                 HV *hseen = cxt->hseen;
1574                 cxt->hseen = 0;
1575                 hv_undef(hseen);
1576                 sv_free((SV *) hseen);          /* optional HV, for backward compat. */
1577         }
1578
1579 #ifndef HAS_RESTRICTED_HASHES
1580         cxt->derestrict = -1;           /* Fetched from perl if needed */
1581 #endif
1582 #ifndef HAS_UTF8_ALL
1583         cxt->use_bytes = -1;            /* Fetched from perl if needed */
1584 #endif
1585         cxt->accept_future_minor = -1;  /* Fetched from perl if needed */
1586
1587         cxt->in_retrieve_overloaded = 0;
1588         reset_context(cxt);
1589 }
1590
1591 /*
1592  * clean_context
1593  *
1594  * A workaround for the CROAK bug: cleanup the last context.
1595  */
1596 static void clean_context(pTHX_ stcxt_t *cxt)
1597 {
1598         TRACEME(("clean_context"));
1599
1600         ASSERT(cxt->s_dirty, ("dirty context"));
1601
1602         if (cxt->membuf_ro)
1603                 MBUF_RESTORE();
1604
1605         ASSERT(!cxt->membuf_ro, ("mbase is not read-only"));
1606
1607         if (cxt->optype & ST_RETRIEVE)
1608                 clean_retrieve_context(aTHX_ cxt);
1609         else if (cxt->optype & ST_STORE)
1610                 clean_store_context(aTHX_ cxt);
1611         else
1612                 reset_context(cxt);
1613
1614         ASSERT(!cxt->s_dirty, ("context is clean"));
1615         ASSERT(cxt->entry == 0, ("context is reset"));
1616 }
1617
1618 /*
1619  * allocate_context
1620  *
1621  * Allocate a new context and push it on top of the parent one.
1622  * This new context is made globally visible via SET_STCXT().
1623  */
1624 static stcxt_t *allocate_context(pTHX_ stcxt_t *parent_cxt)
1625 {
1626         stcxt_t *cxt;
1627
1628         TRACEME(("allocate_context"));
1629
1630         ASSERT(!parent_cxt->s_dirty, ("parent context clean"));
1631
1632         NEW_STORABLE_CXT_OBJ(cxt);
1633         cxt->prev = parent_cxt->my_sv;
1634         SET_STCXT(cxt);
1635
1636         ASSERT(!cxt->s_dirty, ("clean context"));
1637
1638         return cxt;
1639 }
1640
1641 /*
1642  * free_context
1643  *
1644  * Free current context, which cannot be the "root" one.
1645  * Make the context underneath globally visible via SET_STCXT().
1646  */
1647 static void free_context(pTHX_ stcxt_t *cxt)
1648 {
1649         stcxt_t *prev = (stcxt_t *)(cxt->prev ? SvPVX(SvRV(cxt->prev)) : 0);
1650
1651         TRACEME(("free_context"));
1652
1653         ASSERT(!cxt->s_dirty, ("clean context"));
1654         ASSERT(prev, ("not freeing root context"));
1655
1656         SvREFCNT_dec(cxt->my_sv);
1657         SET_STCXT(prev);
1658
1659         ASSERT(cxt, ("context not void"));
1660 }
1661
1662 /***
1663  *** Predicates.
1664  ***/
1665
1666 /*
1667  * is_storing
1668  *
1669  * Tells whether we're in the middle of a store operation.
1670  */
1671 static int is_storing(pTHX)
1672 {
1673         dSTCXT;
1674
1675         return cxt->entry && (cxt->optype & ST_STORE);
1676 }
1677
1678 /*
1679  * is_retrieving
1680  *
1681  * Tells whether we're in the middle of a retrieve operation.
1682  */
1683 static int is_retrieving(pTHX)
1684 {
1685         dSTCXT;
1686
1687         return cxt->entry && (cxt->optype & ST_RETRIEVE);
1688 }
1689
1690 /*
1691  * last_op_in_netorder
1692  *
1693  * Returns whether last operation was made using network order.
1694  *
1695  * This is typically out-of-band information that might prove useful
1696  * to people wishing to convert native to network order data when used.
1697  */
1698 static int last_op_in_netorder(pTHX)
1699 {
1700         dSTCXT;
1701
1702         return cxt->netorder;
1703 }
1704
1705 /***
1706  *** Hook lookup and calling routines.
1707  ***/
1708
1709 /*
1710  * pkg_fetchmeth
1711  *
1712  * A wrapper on gv_fetchmethod_autoload() which caches results.
1713  *
1714  * Returns the routine reference as an SV*, or null if neither the package
1715  * nor its ancestors know about the method.
1716  */
1717 static SV *pkg_fetchmeth(
1718         pTHX_
1719         HV *cache,
1720         HV *pkg,
1721         const char *method)
1722 {
1723         GV *gv;
1724         SV *sv;
1725         const char *hvname = HvNAME_get(pkg);
1726
1727
1728         /*
1729          * The following code is the same as the one performed by UNIVERSAL::can
1730          * in the Perl core.
1731          */
1732
1733         gv = gv_fetchmethod_autoload(pkg, method, FALSE);
1734         if (gv && isGV(gv)) {
1735                 sv = newRV((SV*) GvCV(gv));
1736                 TRACEME(("%s->%s: 0x%"UVxf, hvname, method, PTR2UV(sv)));
1737         } else {
1738                 sv = newSVsv(&PL_sv_undef);
1739                 TRACEME(("%s->%s: not found", hvname, method));
1740         }
1741
1742         /*
1743          * Cache the result, ignoring failure: if we can't store the value,
1744          * it just won't be cached.
1745          */
1746
1747         (void) hv_store(cache, hvname, strlen(hvname), sv, 0);
1748
1749         return SvOK(sv) ? sv : (SV *) 0;
1750 }
1751
1752 /*
1753  * pkg_hide
1754  *
1755  * Force cached value to be undef: hook ignored even if present.
1756  */
1757 static void pkg_hide(
1758         pTHX_
1759         HV *cache,
1760         HV *pkg,
1761         const char *method)
1762 {
1763         const char *hvname = HvNAME_get(pkg);
1764         PERL_UNUSED_ARG(method);
1765         (void) hv_store(cache,
1766                 hvname, strlen(hvname), newSVsv(&PL_sv_undef), 0);
1767 }
1768
1769 /*
1770  * pkg_uncache
1771  *
1772  * Discard cached value: a whole fetch loop will be retried at next lookup.
1773  */
1774 static void pkg_uncache(
1775         pTHX_
1776         HV *cache,
1777         HV *pkg,
1778         const char *method)
1779 {
1780         const char *hvname = HvNAME_get(pkg);
1781         PERL_UNUSED_ARG(method);
1782         (void) hv_delete(cache, hvname, strlen(hvname), G_DISCARD);
1783 }
1784
1785 /*
1786  * pkg_can
1787  *
1788  * Our own "UNIVERSAL::can", which caches results.
1789  *
1790  * Returns the routine reference as an SV*, or null if the object does not
1791  * know about the method.
1792  */
1793 static SV *pkg_can(
1794         pTHX_
1795         HV *cache,
1796         HV *pkg,
1797         const char *method)
1798 {
1799         SV **svh;
1800         SV *sv;
1801         const char *hvname = HvNAME_get(pkg);
1802
1803         TRACEME(("pkg_can for %s->%s", hvname, method));
1804
1805         /*
1806          * Look into the cache to see whether we already have determined
1807          * where the routine was, if any.
1808          *
1809          * NOTA BENE: we don't use 'method' at all in our lookup, since we know
1810          * that only one hook (i.e. always the same) is cached in a given cache.
1811          */
1812
1813         svh = hv_fetch(cache, hvname, strlen(hvname), FALSE);
1814         if (svh) {
1815                 sv = *svh;
1816                 if (!SvOK(sv)) {
1817                         TRACEME(("cached %s->%s: not found", hvname, method));
1818                         return (SV *) 0;
1819                 } else {
1820                         TRACEME(("cached %s->%s: 0x%"UVxf,
1821                                 hvname, method, PTR2UV(sv)));
1822                         return sv;
1823                 }
1824         }
1825
1826         TRACEME(("not cached yet"));
1827         return pkg_fetchmeth(aTHX_ cache, pkg, method);         /* Fetch and cache */
1828 }
1829
1830 /*
1831  * scalar_call
1832  *
1833  * Call routine as obj->hook(av) in scalar context.
1834  * Propagates the single returned value if not called in void context.
1835  */
1836 static SV *scalar_call(
1837         pTHX_
1838         SV *obj,
1839         SV *hook,
1840         int cloning,
1841         AV *av,
1842         I32 flags)
1843 {
1844         dSP;
1845         int count;
1846         SV *sv = 0;
1847
1848         TRACEME(("scalar_call (cloning=%d)", cloning));
1849
1850         ENTER;
1851         SAVETMPS;
1852
1853         PUSHMARK(sp);
1854         XPUSHs(obj);
1855         XPUSHs(sv_2mortal(newSViv(cloning)));           /* Cloning flag */
1856         if (av) {
1857                 SV **ary = AvARRAY(av);
1858                 int cnt = AvFILLp(av) + 1;
1859                 int i;
1860                 XPUSHs(ary[0]);                                                 /* Frozen string */
1861                 for (i = 1; i < cnt; i++) {
1862                         TRACEME(("pushing arg #%d (0x%"UVxf")...",
1863                                  i, PTR2UV(ary[i])));
1864                         XPUSHs(sv_2mortal(newRV(ary[i])));
1865                 }
1866         }
1867         PUTBACK;
1868
1869         TRACEME(("calling..."));
1870         count = perl_call_sv(hook, flags);              /* Go back to Perl code */
1871         TRACEME(("count = %d", count));
1872
1873         SPAGAIN;
1874
1875         if (count) {
1876                 sv = POPs;
1877                 SvREFCNT_inc(sv);               /* We're returning it, must stay alive! */
1878         }
1879
1880         PUTBACK;
1881         FREETMPS;
1882         LEAVE;
1883
1884         return sv;
1885 }
1886
1887 /*
1888  * array_call
1889  *
1890  * Call routine obj->hook(cloning) in list context.
1891  * Returns the list of returned values in an array.
1892  */
1893 static AV *array_call(
1894         pTHX_
1895         SV *obj,
1896         SV *hook,
1897         int cloning)
1898 {
1899         dSP;
1900         int count;
1901         AV *av;
1902         int i;
1903
1904         TRACEME(("array_call (cloning=%d)", cloning));
1905
1906         ENTER;
1907         SAVETMPS;
1908
1909         PUSHMARK(sp);
1910         XPUSHs(obj);                                                            /* Target object */
1911         XPUSHs(sv_2mortal(newSViv(cloning)));           /* Cloning flag */
1912         PUTBACK;
1913
1914         count = perl_call_sv(hook, G_ARRAY);            /* Go back to Perl code */
1915
1916         SPAGAIN;
1917
1918         av = newAV();
1919         for (i = count - 1; i >= 0; i--) {
1920                 SV *sv = POPs;
1921                 av_store(av, i, SvREFCNT_inc(sv));
1922         }
1923
1924         PUTBACK;
1925         FREETMPS;
1926         LEAVE;
1927
1928         return av;
1929 }
1930
1931 /*
1932  * known_class
1933  *
1934  * Lookup the class name in the 'hclass' table and either assign it a new ID
1935  * or return the existing one, by filling in 'classnum'.
1936  *
1937  * Return true if the class was known, false if the ID was just generated.
1938  */
1939 static int known_class(
1940         pTHX_
1941         stcxt_t *cxt,
1942         char *name,             /* Class name */
1943         int len,                /* Name length */
1944         I32 *classnum)
1945 {
1946         SV **svh;
1947         HV *hclass = cxt->hclass;
1948
1949         TRACEME(("known_class (%s)", name));
1950
1951         /*
1952          * Recall that we don't store pointers in this hash table, but tags.
1953          * Therefore, we need LOW_32BITS() to extract the relevant parts.
1954          */
1955
1956         svh = hv_fetch(hclass, name, len, FALSE);
1957         if (svh) {
1958                 *classnum = LOW_32BITS(*svh);
1959                 return TRUE;
1960         }
1961
1962         /*
1963          * Unknown classname, we need to record it.
1964          */
1965
1966         cxt->classnum++;
1967         if (!hv_store(hclass, name, len, INT2PTR(SV*, cxt->classnum), 0))
1968                 CROAK(("Unable to record new classname"));
1969
1970         *classnum = cxt->classnum;
1971         return FALSE;
1972 }
1973
1974 /***
1975  *** Specific store routines.
1976  ***/
1977
1978 /*
1979  * store_ref
1980  *
1981  * Store a reference.
1982  * Layout is SX_REF <object> or SX_OVERLOAD <object>.
1983  */
1984 static int store_ref(pTHX_ stcxt_t *cxt, SV *sv)
1985 {
1986         int is_weak = 0;
1987         TRACEME(("store_ref (0x%"UVxf")", PTR2UV(sv)));
1988
1989         /*
1990          * Follow reference, and check if target is overloaded.
1991          */
1992
1993 #ifdef SvWEAKREF
1994         if (SvWEAKREF(sv))
1995                 is_weak = 1;
1996         TRACEME(("ref (0x%"UVxf") is%s weak", PTR2UV(sv), is_weak ? "" : "n't"));
1997 #endif
1998         sv = SvRV(sv);
1999
2000         if (SvOBJECT(sv)) {
2001                 HV *stash = (HV *) SvSTASH(sv);
2002                 if (stash && Gv_AMG(stash)) {
2003                         TRACEME(("ref (0x%"UVxf") is overloaded", PTR2UV(sv)));
2004                         PUTMARK(is_weak ? SX_WEAKOVERLOAD : SX_OVERLOAD);
2005                 } else
2006                         PUTMARK(is_weak ? SX_WEAKREF : SX_REF);
2007         } else
2008                 PUTMARK(is_weak ? SX_WEAKREF : SX_REF);
2009
2010         return store(aTHX_ cxt, sv);
2011 }
2012
2013 /*
2014  * store_scalar
2015  *
2016  * Store a scalar.
2017  *
2018  * Layout is SX_LSCALAR <length> <data>, SX_SCALAR <length> <data> or SX_UNDEF.
2019  * SX_LUTF8STR and SX_UTF8STR are used for UTF-8 strings.
2020  * The <data> section is omitted if <length> is 0.
2021  *
2022  * For vstrings, the vstring portion is stored first with
2023  * SX_LVSTRING <length> <data> or SX_VSTRING <length> <data>, followed by
2024  * SX_(L)SCALAR or SX_(L)UTF8STR with the actual PV.
2025  *
2026  * If integer or double, the layout is SX_INTEGER <data> or SX_DOUBLE <data>.
2027  * Small integers (within [-127, +127]) are stored as SX_BYTE <byte>.
2028  */
2029 static int store_scalar(pTHX_ stcxt_t *cxt, SV *sv)
2030 {
2031         IV iv;
2032         char *pv;
2033         STRLEN len;
2034         U32 flags = SvFLAGS(sv);                        /* "cc -O" may put it in register */
2035
2036         TRACEME(("store_scalar (0x%"UVxf")", PTR2UV(sv)));
2037
2038         /*
2039          * For efficiency, break the SV encapsulation by peaking at the flags
2040          * directly without using the Perl macros to avoid dereferencing
2041          * sv->sv_flags each time we wish to check the flags.
2042          */
2043
2044         if (!(flags & SVf_OK)) {                        /* !SvOK(sv) */
2045                 if (sv == &PL_sv_undef) {
2046                         TRACEME(("immortal undef"));
2047                         PUTMARK(SX_SV_UNDEF);
2048                 } else {
2049                         TRACEME(("undef at 0x%"UVxf, PTR2UV(sv)));
2050                         PUTMARK(SX_UNDEF);
2051                 }
2052                 return 0;
2053         }
2054
2055         /*
2056          * Always store the string representation of a scalar if it exists.
2057          * Gisle Aas provided me with this test case, better than a long speach:
2058          *
2059          *  perl -MDevel::Peek -le '$a="abc"; $a+0; Dump($a)'
2060          *  SV = PVNV(0x80c8520)
2061          *       REFCNT = 1
2062          *       FLAGS = (NOK,POK,pNOK,pPOK)
2063          *       IV = 0
2064          *       NV = 0
2065          *       PV = 0x80c83d0 "abc"\0
2066          *       CUR = 3
2067          *       LEN = 4
2068          *
2069          * Write SX_SCALAR, length, followed by the actual data.
2070          *
2071          * Otherwise, write an SX_BYTE, SX_INTEGER or an SX_DOUBLE as
2072          * appropriate, followed by the actual (binary) data. A double
2073          * is written as a string if network order, for portability.
2074          *
2075          * NOTE: instead of using SvNOK(sv), we test for SvNOKp(sv).
2076          * The reason is that when the scalar value is tainted, the SvNOK(sv)
2077          * value is false.
2078          *
2079          * The test for a read-only scalar with both POK and NOK set is meant
2080          * to quickly detect &PL_sv_yes and &PL_sv_no without having to pay the
2081          * address comparison for each scalar we store.
2082          */
2083
2084 #define SV_MAYBE_IMMORTAL (SVf_READONLY|SVf_POK|SVf_NOK)
2085
2086         if ((flags & SV_MAYBE_IMMORTAL) == SV_MAYBE_IMMORTAL) {
2087                 if (sv == &PL_sv_yes) {
2088                         TRACEME(("immortal yes"));
2089                         PUTMARK(SX_SV_YES);
2090                 } else if (sv == &PL_sv_no) {
2091                         TRACEME(("immortal no"));
2092                         PUTMARK(SX_SV_NO);
2093                 } else {
2094                         pv = SvPV(sv, len);                     /* We know it's SvPOK */
2095                         goto string;                            /* Share code below */
2096                 }
2097         } else if (flags & SVf_POK) {
2098             /* public string - go direct to string read.  */
2099             goto string_readlen;
2100         } else if (
2101 #if (PATCHLEVEL <= 6)
2102             /* For 5.6 and earlier NV flag trumps IV flag, so only use integer
2103                direct if NV flag is off.  */
2104             (flags & (SVf_NOK | SVf_IOK)) == SVf_IOK
2105 #else
2106             /* 5.7 rules are that if IV public flag is set, IV value is as
2107                good, if not better, than NV value.  */
2108             flags & SVf_IOK
2109 #endif
2110             ) {
2111             iv = SvIV(sv);
2112             /*
2113              * Will come here from below with iv set if double is an integer.
2114              */
2115           integer:
2116
2117             /* Sorry. This isn't in 5.005_56 (IIRC) or earlier.  */
2118 #ifdef SVf_IVisUV
2119             /* Need to do this out here, else 0xFFFFFFFF becomes iv of -1
2120              * (for example) and that ends up in the optimised small integer
2121              * case. 
2122              */
2123             if ((flags & SVf_IVisUV) && SvUV(sv) > IV_MAX) {
2124                 TRACEME(("large unsigned integer as string, value = %"UVuf, SvUV(sv)));
2125                 goto string_readlen;
2126             }
2127 #endif
2128             /*
2129              * Optimize small integers into a single byte, otherwise store as
2130              * a real integer (converted into network order if they asked).
2131              */
2132
2133             if (iv >= -128 && iv <= 127) {
2134                 unsigned char siv = (unsigned char) (iv + 128); /* [0,255] */
2135                 PUTMARK(SX_BYTE);
2136                 PUTMARK(siv);
2137                 TRACEME(("small integer stored as %d", siv));
2138             } else if (cxt->netorder) {
2139 #ifndef HAS_HTONL
2140                 TRACEME(("no htonl, fall back to string for integer"));
2141                 goto string_readlen;
2142 #else
2143                 I32 niv;
2144
2145
2146 #if IVSIZE > 4
2147                 if (
2148 #ifdef SVf_IVisUV
2149                     /* Sorry. This isn't in 5.005_56 (IIRC) or earlier.  */
2150                     ((flags & SVf_IVisUV) && SvUV(sv) > (UV)0x7FFFFFFF) ||
2151 #endif
2152                     (iv > (IV)0x7FFFFFFF) || (iv < -(IV)0x80000000)) {
2153                     /* Bigger than 32 bits.  */
2154                     TRACEME(("large network order integer as string, value = %"IVdf, iv));
2155                     goto string_readlen;
2156                 }
2157 #endif
2158
2159                 niv = (I32) htonl((I32) iv);
2160                 TRACEME(("using network order"));
2161                 PUTMARK(SX_NETINT);
2162                 WRITE_I32(niv);
2163 #endif
2164             } else {
2165                 PUTMARK(SX_INTEGER);
2166                 WRITE(&iv, sizeof(iv));
2167             }
2168             
2169             TRACEME(("ok (integer 0x%"UVxf", value = %"IVdf")", PTR2UV(sv), iv));
2170         } else if (flags & SVf_NOK) {
2171             NV nv;
2172 #if (PATCHLEVEL <= 6)
2173             nv = SvNV(sv);
2174             /*
2175              * Watch for number being an integer in disguise.
2176              */
2177             if (nv == (NV) (iv = I_V(nv))) {
2178                 TRACEME(("double %"NVff" is actually integer %"IVdf, nv, iv));
2179                 goto integer;           /* Share code above */
2180             }
2181 #else
2182
2183             SvIV_please(sv);
2184             if (SvIOK_notUV(sv)) {
2185                 iv = SvIV(sv);
2186                 goto integer;           /* Share code above */
2187             }
2188             nv = SvNV(sv);
2189 #endif
2190
2191             if (cxt->netorder) {
2192                 TRACEME(("double %"NVff" stored as string", nv));
2193                 goto string_readlen;            /* Share code below */
2194             }
2195
2196             PUTMARK(SX_DOUBLE);
2197             WRITE(&nv, sizeof(nv));
2198
2199             TRACEME(("ok (double 0x%"UVxf", value = %"NVff")", PTR2UV(sv), nv));
2200
2201         } else if (flags & (SVp_POK | SVp_NOK | SVp_IOK)) {
2202 #ifdef SvVOK
2203             MAGIC *mg;
2204 #endif
2205             I32 wlen; /* For 64-bit machines */
2206
2207           string_readlen:
2208             pv = SvPV(sv, len);
2209
2210             /*
2211              * Will come here from above  if it was readonly, POK and NOK but
2212              * neither &PL_sv_yes nor &PL_sv_no.
2213              */
2214           string:
2215
2216 #ifdef SvVOK
2217             if (SvMAGICAL(sv) && (mg = mg_find(sv, 'V'))) {
2218                 /* The macro passes this by address, not value, and a lot of
2219                    called code assumes that it's 32 bits without checking.  */
2220                 const int len = mg->mg_len;
2221                 STORE_PV_LEN((const char *)mg->mg_ptr,
2222                              len, SX_VSTRING, SX_LVSTRING);
2223             }
2224 #endif
2225
2226             wlen = (I32) len; /* WLEN via STORE_SCALAR expects I32 */
2227             if (SvUTF8 (sv))
2228                 STORE_UTF8STR(pv, wlen);
2229             else
2230                 STORE_SCALAR(pv, wlen);
2231             TRACEME(("ok (scalar 0x%"UVxf" '%s', length = %"IVdf")",
2232                      PTR2UV(sv), SvPVX(sv), (IV)len));
2233         } else
2234             CROAK(("Can't determine type of %s(0x%"UVxf")",
2235                    sv_reftype(sv, FALSE),
2236                    PTR2UV(sv)));
2237         return 0;               /* Ok, no recursion on scalars */
2238 }
2239
2240 /*
2241  * store_array
2242  *
2243  * Store an array.
2244  *
2245  * Layout is SX_ARRAY <size> followed by each item, in increasing index order.
2246  * Each item is stored as <object>.
2247  */
2248 static int store_array(pTHX_ stcxt_t *cxt, AV *av)
2249 {
2250         SV **sav;
2251         I32 len = av_len(av) + 1;
2252         I32 i;
2253         int ret;
2254
2255         TRACEME(("store_array (0x%"UVxf")", PTR2UV(av)));
2256
2257         /* 
2258          * Signal array by emitting SX_ARRAY, followed by the array length.
2259          */
2260
2261         PUTMARK(SX_ARRAY);
2262         WLEN(len);
2263         TRACEME(("size = %d", len));
2264
2265         /*
2266          * Now store each item recursively.
2267          */
2268
2269         for (i = 0; i < len; i++) {
2270                 sav = av_fetch(av, i, 0);
2271                 if (!sav) {
2272                         TRACEME(("(#%d) nonexistent item", i));
2273                         STORE_SV_UNDEF();
2274                         continue;
2275                 }
2276 #if PATCHLEVEL >= 19
2277                 /* In 5.19.3 and up, &PL_sv_undef can actually be stored in
2278                  * an array; it no longer represents nonexistent elements.
2279                  * Historically, we have used SX_SV_UNDEF in arrays for
2280                  * nonexistent elements, so we use SX_SVUNDEF_ELEM for
2281                  * &PL_sv_undef itself. */
2282                 if (*sav == &PL_sv_undef) {
2283                         TRACEME(("(#%d) undef item", i));
2284                         cxt->tagnum++;
2285                         PUTMARK(SX_SVUNDEF_ELEM);
2286                         continue;
2287                 }
2288 #endif                  
2289                 TRACEME(("(#%d) item", i));
2290                 if ((ret = store(aTHX_ cxt, *sav)))     /* Extra () for -Wall, grr... */
2291                         return ret;
2292         }
2293
2294         TRACEME(("ok (array)"));
2295
2296         return 0;
2297 }
2298
2299
2300 #if (PATCHLEVEL <= 6)
2301
2302 /*
2303  * sortcmp
2304  *
2305  * Sort two SVs
2306  * Borrowed from perl source file pp_ctl.c, where it is used by pp_sort.
2307  */
2308 static int
2309 sortcmp(const void *a, const void *b)
2310 {
2311 #if defined(USE_ITHREADS)
2312         dTHX;
2313 #endif /* USE_ITHREADS */
2314         return sv_cmp(*(SV * const *) a, *(SV * const *) b);
2315 }
2316
2317 #endif /* PATCHLEVEL <= 6 */
2318
2319 /*
2320  * store_hash
2321  *
2322  * Store a hash table.
2323  *
2324  * For a "normal" hash (not restricted, no utf8 keys):
2325  *
2326  * Layout is SX_HASH <size> followed by each key/value pair, in random order.
2327  * Values are stored as <object>.
2328  * Keys are stored as <length> <data>, the <data> section being omitted
2329  * if length is 0.
2330  *
2331  * For a "fancy" hash (restricted or utf8 keys):
2332  *
2333  * Layout is SX_FLAG_HASH <size> <hash flags> followed by each key/value pair,
2334  * in random order.
2335  * Values are stored as <object>.
2336  * Keys are stored as <flags> <length> <data>, the <data> section being omitted
2337  * if length is 0.
2338  * Currently the only hash flag is "restricted"
2339  * Key flags are as for hv.h
2340  */
2341 static int store_hash(pTHX_ stcxt_t *cxt, HV *hv)
2342 {
2343         dVAR;
2344         I32 len = HvTOTALKEYS(hv);
2345         I32 i;
2346         int ret = 0;
2347         I32 riter;
2348         HE *eiter;
2349         int flagged_hash = ((SvREADONLY(hv)
2350 #ifdef HAS_HASH_KEY_FLAGS
2351                              || HvHASKFLAGS(hv)
2352 #endif
2353                                 ) ? 1 : 0);
2354         unsigned char hash_flags = (SvREADONLY(hv) ? SHV_RESTRICTED : 0);
2355
2356         if (flagged_hash) {
2357             /* needs int cast for C++ compilers, doesn't it?  */
2358             TRACEME(("store_hash (0x%"UVxf") (flags %x)", PTR2UV(hv),
2359                      (int) hash_flags));
2360         } else {
2361             TRACEME(("store_hash (0x%"UVxf")", PTR2UV(hv)));
2362         }
2363
2364         /* 
2365          * Signal hash by emitting SX_HASH, followed by the table length.
2366          */
2367
2368         if (flagged_hash) {
2369             PUTMARK(SX_FLAG_HASH);
2370             PUTMARK(hash_flags);
2371         } else {
2372             PUTMARK(SX_HASH);
2373         }
2374         WLEN(len);
2375         TRACEME(("size = %d", len));
2376
2377         /*
2378          * Save possible iteration state via each() on that table.
2379          */
2380
2381         riter = HvRITER_get(hv);
2382         eiter = HvEITER_get(hv);
2383         hv_iterinit(hv);
2384
2385         /*
2386          * Now store each item recursively.
2387          *
2388      * If canonical is defined to some true value then store each
2389      * key/value pair in sorted order otherwise the order is random.
2390          * Canonical order is irrelevant when a deep clone operation is performed.
2391          *
2392          * Fetch the value from perl only once per store() operation, and only
2393          * when needed.
2394          */
2395
2396         if (
2397                 !(cxt->optype & ST_CLONE) && (cxt->canonical == 1 ||
2398                 (cxt->canonical < 0 && (cxt->canonical =
2399                         (SvTRUE(perl_get_sv("Storable::canonical", GV_ADD)) ? 1 : 0))))
2400         ) {
2401                 /*
2402                  * Storing in order, sorted by key.
2403                  * Run through the hash, building up an array of keys in a
2404                  * mortal array, sort the array and then run through the
2405                  * array.  
2406                  */
2407
2408                 AV *av = newAV();
2409
2410                 /*av_extend (av, len);*/
2411
2412                 TRACEME(("using canonical order"));
2413
2414                 for (i = 0; i < len; i++) {
2415 #ifdef HAS_RESTRICTED_HASHES
2416                         HE *he = hv_iternext_flags(hv, HV_ITERNEXT_WANTPLACEHOLDERS);
2417 #else
2418                         HE *he = hv_iternext(hv);
2419 #endif
2420                         SV *key;
2421
2422                         if (!he)
2423                                 CROAK(("Hash %p inconsistent - expected %d keys, %dth is NULL", hv, (int)len, (int)i));
2424                         key = hv_iterkeysv(he);
2425                         av_store(av, AvFILLp(av)+1, key);       /* av_push(), really */
2426                 }
2427                         
2428                 STORE_HASH_SORT;
2429
2430                 for (i = 0; i < len; i++) {
2431 #ifdef HAS_RESTRICTED_HASHES
2432                         int placeholders = (int)HvPLACEHOLDERS_get(hv);
2433 #endif
2434                         unsigned char flags = 0;
2435                         char *keyval;
2436                         STRLEN keylen_tmp;
2437                         I32 keylen;
2438                         SV *key = av_shift(av);
2439                         /* This will fail if key is a placeholder.
2440                            Track how many placeholders we have, and error if we
2441                            "see" too many.  */
2442                         HE *he  = hv_fetch_ent(hv, key, 0, 0);
2443                         SV *val;
2444
2445                         if (he) {
2446                                 if (!(val =  HeVAL(he))) {
2447                                         /* Internal error, not I/O error */
2448                                         return 1;
2449                                 }
2450                         } else {
2451 #ifdef HAS_RESTRICTED_HASHES
2452                                 /* Should be a placeholder.  */
2453                                 if (placeholders-- < 0) {
2454                                         /* This should not happen - number of
2455                                            retrieves should be identical to
2456                                            number of placeholders.  */
2457                                         return 1;
2458                                 }
2459                                 /* Value is never needed, and PL_sv_undef is
2460                                    more space efficient to store.  */
2461                                 val = &PL_sv_undef;
2462                                 ASSERT (flags == 0,
2463                                         ("Flags not 0 but %d", flags));
2464                                 flags = SHV_K_PLACEHOLDER;
2465 #else
2466                                 return 1;
2467 #endif
2468                         }
2469                         
2470                         /*
2471                          * Store value first.
2472                          */
2473                         
2474                         TRACEME(("(#%d) value 0x%"UVxf, i, PTR2UV(val)));
2475
2476                         if ((ret = store(aTHX_ cxt, val)))      /* Extra () for -Wall, grr... */
2477                                 goto out;
2478
2479                         /*
2480                          * Write key string.
2481                          * Keys are written after values to make sure retrieval
2482                          * can be optimal in terms of memory usage, where keys are
2483                          * read into a fixed unique buffer called kbuf.
2484                          * See retrieve_hash() for details.
2485                          */
2486                          
2487                         /* Implementation of restricted hashes isn't nicely
2488                            abstracted:  */
2489                         if ((hash_flags & SHV_RESTRICTED)
2490                          && SvTRULYREADONLY(val)) {
2491                                 flags |= SHV_K_LOCKED;
2492                         }
2493
2494                         keyval = SvPV(key, keylen_tmp);
2495                         keylen = keylen_tmp;
2496 #ifdef HAS_UTF8_HASHES
2497                         /* If you build without optimisation on pre 5.6
2498                            then nothing spots that SvUTF8(key) is always 0,
2499                            so the block isn't optimised away, at which point
2500                            the linker dislikes the reference to
2501                            bytes_from_utf8.  */
2502                         if (SvUTF8(key)) {
2503                             const char *keysave = keyval;
2504                             bool is_utf8 = TRUE;
2505
2506                             /* Just casting the &klen to (STRLEN) won't work
2507                                well if STRLEN and I32 are of different widths.
2508                                --jhi */
2509                             keyval = (char*)bytes_from_utf8((U8*)keyval,
2510                                                             &keylen_tmp,
2511                                                             &is_utf8);
2512
2513                             /* If we were able to downgrade here, then than
2514                                means that we have  a key which only had chars
2515                                0-255, but was utf8 encoded.  */
2516
2517                             if (keyval != keysave) {
2518                                 keylen = keylen_tmp;
2519                                 flags |= SHV_K_WASUTF8;
2520                             } else {
2521                                 /* keylen_tmp can't have changed, so no need
2522                                    to assign back to keylen.  */
2523                                 flags |= SHV_K_UTF8;
2524                             }
2525                         }
2526 #endif
2527
2528                         if (flagged_hash) {
2529                             PUTMARK(flags);
2530                             TRACEME(("(#%d) key '%s' flags %x %u", i, keyval, flags, *keyval));
2531                         } else {
2532                             /* This is a workaround for a bug in 5.8.0
2533                                that causes the HEK_WASUTF8 flag to be
2534                                set on an HEK without the hash being
2535                                marked as having key flags. We just
2536                                cross our fingers and drop the flag.
2537                                AMS 20030901 */
2538                             assert (flags == 0 || flags == SHV_K_WASUTF8);
2539                             TRACEME(("(#%d) key '%s'", i, keyval));
2540                         }
2541                         WLEN(keylen);
2542                         if (keylen)
2543                                 WRITE(keyval, keylen);
2544                         if (flags & SHV_K_WASUTF8)
2545                             Safefree (keyval);
2546                 }
2547
2548                 /* 
2549                  * Free up the temporary array
2550                  */
2551
2552                 av_undef(av);
2553                 sv_free((SV *) av);
2554
2555         } else {
2556
2557                 /*
2558                  * Storing in "random" order (in the order the keys are stored
2559                  * within the hash).  This is the default and will be faster!
2560                  */
2561   
2562                 for (i = 0; i < len; i++) {
2563                         char *key = 0;
2564                         I32 len;
2565                         unsigned char flags;
2566 #ifdef HV_ITERNEXT_WANTPLACEHOLDERS
2567                         HE *he = hv_iternext_flags(hv, HV_ITERNEXT_WANTPLACEHOLDERS);
2568 #else
2569                         HE *he = hv_iternext(hv);
2570 #endif
2571                         SV *val = (he ? hv_iterval(hv, he) : 0);
2572                         SV *key_sv = NULL;
2573                         HEK *hek;
2574
2575                         if (val == 0)
2576                                 return 1;               /* Internal error, not I/O error */
2577
2578                         /* Implementation of restricted hashes isn't nicely
2579                            abstracted:  */
2580                         flags
2581                             = (((hash_flags & SHV_RESTRICTED)
2582                                 && SvTRULYREADONLY(val))
2583                                              ? SHV_K_LOCKED : 0);
2584
2585                         if (val == &PL_sv_placeholder) {
2586                             flags |= SHV_K_PLACEHOLDER;
2587                             val = &PL_sv_undef;
2588                         }
2589
2590                         /*
2591                          * Store value first.
2592                          */
2593
2594                         TRACEME(("(#%d) value 0x%"UVxf, i, PTR2UV(val)));
2595
2596                         if ((ret = store(aTHX_ cxt, val)))      /* Extra () for -Wall, grr... */
2597                                 goto out;
2598
2599
2600                         hek = HeKEY_hek(he);
2601                         len = HEK_LEN(hek);
2602                         if (len == HEf_SVKEY) {
2603                             /* This is somewhat sick, but the internal APIs are
2604                              * such that XS code could put one of these in in
2605                              * a regular hash.
2606                              * Maybe we should be capable of storing one if
2607                              * found.
2608                              */
2609                             key_sv = HeKEY_sv(he);
2610                             flags |= SHV_K_ISSV;
2611                         } else {
2612                             /* Regular string key. */
2613 #ifdef HAS_HASH_KEY_FLAGS
2614                             if (HEK_UTF8(hek))
2615                                 flags |= SHV_K_UTF8;
2616                             if (HEK_WASUTF8(hek))
2617                                 flags |= SHV_K_WASUTF8;
2618 #endif
2619                             key = HEK_KEY(hek);
2620                         }
2621                         /*
2622                          * Write key string.
2623                          * Keys are written after values to make sure retrieval
2624                          * can be optimal in terms of memory usage, where keys are
2625                          * read into a fixed unique buffer called kbuf.
2626                          * See retrieve_hash() for details.
2627                          */
2628
2629                         if (flagged_hash) {
2630                             PUTMARK(flags);
2631                             TRACEME(("(#%d) key '%s' flags %x", i, key, flags));
2632                         } else {
2633                             /* This is a workaround for a bug in 5.8.0
2634                                that causes the HEK_WASUTF8 flag to be
2635                                set on an HEK without the hash being
2636                                marked as having key flags. We just
2637                                cross our fingers and drop the flag.
2638                                AMS 20030901 */
2639                             assert (flags == 0 || flags == SHV_K_WASUTF8);
2640                             TRACEME(("(#%d) key '%s'", i, key));
2641                         }
2642                         if (flags & SHV_K_ISSV) {
2643                             store(aTHX_ cxt, key_sv);
2644                         } else {
2645                             WLEN(len);
2646                             if (len)
2647                                 WRITE(key, len);
2648                         }
2649                 }
2650     }
2651
2652         TRACEME(("ok (hash 0x%"UVxf")", PTR2UV(hv)));
2653
2654 out:
2655         HvRITER_set(hv, riter);         /* Restore hash iterator state */
2656         HvEITER_set(hv, eiter);
2657
2658         return ret;
2659 }
2660
2661 /*
2662  * store_code
2663  *
2664  * Store a code reference.
2665  *
2666  * Layout is SX_CODE <length> followed by a scalar containing the perl
2667  * source code of the code reference.
2668  */
2669 static int store_code(pTHX_ stcxt_t *cxt, CV *cv)
2670 {
2671 #if PERL_VERSION < 6
2672     /*
2673          * retrieve_code does not work with perl 5.005 or less
2674          */
2675         return store_other(aTHX_ cxt, (SV*)cv);
2676 #else
2677         dSP;
2678         I32 len;
2679         int count, reallen;
2680         SV *text, *bdeparse;
2681
2682         TRACEME(("store_code (0x%"UVxf")", PTR2UV(cv)));
2683
2684         if (
2685                 cxt->deparse == 0 ||
2686                 (cxt->deparse < 0 && !(cxt->deparse =
2687                         SvTRUE(perl_get_sv("Storable::Deparse", GV_ADD)) ? 1 : 0))
2688         ) {
2689                 return store_other(aTHX_ cxt, (SV*)cv);
2690         }
2691
2692         /*
2693          * Require B::Deparse. At least B::Deparse 0.61 is needed for
2694          * blessed code references.
2695          */
2696         /* Ownership of both SVs is passed to load_module, which frees them. */
2697         load_module(PERL_LOADMOD_NOIMPORT, newSVpvn("B::Deparse",10), newSVnv(0.61));
2698         SPAGAIN;
2699
2700         ENTER;
2701         SAVETMPS;
2702
2703         /*
2704          * create the B::Deparse object
2705          */
2706
2707         PUSHMARK(sp);
2708         XPUSHs(newSVpvs_flags("B::Deparse", SVs_TEMP));
2709         PUTBACK;
2710         count = call_method("new", G_SCALAR);
2711         SPAGAIN;
2712         if (count != 1)
2713                 CROAK(("Unexpected return value from B::Deparse::new\n"));
2714         bdeparse = POPs;
2715
2716         /*
2717          * call the coderef2text method
2718          */
2719
2720         PUSHMARK(sp);
2721         XPUSHs(bdeparse); /* XXX is this already mortal? */
2722         XPUSHs(sv_2mortal(newRV_inc((SV*)cv)));
2723         PUTBACK;
2724         count = call_method("coderef2text", G_SCALAR);
2725         SPAGAIN;
2726         if (count != 1)
2727                 CROAK(("Unexpected return value from B::Deparse::coderef2text\n"));
2728
2729         text = POPs;
2730         len = SvCUR(text);
2731         reallen = strlen(SvPV_nolen(text));
2732
2733         /*
2734          * Empty code references or XS functions are deparsed as
2735          * "(prototype) ;" or ";".
2736          */
2737
2738         if (len == 0 || *(SvPV_nolen(text)+reallen-1) == ';') {
2739             CROAK(("The result of B::Deparse::coderef2text was empty - maybe you're trying to serialize an XS function?\n"));
2740         }
2741
2742         /* 
2743          * Signal code by emitting SX_CODE.
2744          */
2745
2746         PUTMARK(SX_CODE);
2747         cxt->tagnum++;   /* necessary, as SX_CODE is a SEEN() candidate */
2748         TRACEME(("size = %d", len));
2749         TRACEME(("code = %s", SvPV_nolen(text)));
2750
2751         /*
2752          * Now store the source code.
2753          */
2754
2755         if(SvUTF8 (text))
2756                 STORE_UTF8STR(SvPV_nolen(text), len);
2757         else
2758                 STORE_SCALAR(SvPV_nolen(text), len);
2759
2760         FREETMPS;
2761         LEAVE;
2762
2763         TRACEME(("ok (code)"));
2764
2765         return 0;
2766 #endif
2767 }
2768
2769 /*
2770  * store_tied
2771  *
2772  * When storing a tied object (be it a tied scalar, array or hash), we lay out
2773  * a special mark, followed by the underlying tied object. For instance, when
2774  * dealing with a tied hash, we store SX_TIED_HASH <hash object>, where
2775  * <hash object> stands for the serialization of the tied hash.
2776  */
2777 static int store_tied(pTHX_ stcxt_t *cxt, SV *sv)
2778 {
2779         MAGIC *mg;
2780         SV *obj = NULL;
2781         int ret = 0;
2782         int svt = SvTYPE(sv);
2783         char mtype = 'P';
2784
2785         TRACEME(("store_tied (0x%"UVxf")", PTR2UV(sv)));
2786
2787         /*
2788          * We have a small run-time penalty here because we chose to factorise
2789          * all tieds objects into the same routine, and not have a store_tied_hash,
2790          * a store_tied_array, etc...
2791          *
2792          * Don't use a switch() statement, as most compilers don't optimize that
2793          * well for 2/3 values. An if() else if() cascade is just fine. We put
2794          * tied hashes first, as they are the most likely beasts.
2795          */
2796
2797         if (svt == SVt_PVHV) {
2798                 TRACEME(("tied hash"));
2799                 PUTMARK(SX_TIED_HASH);                  /* Introduces tied hash */
2800         } else if (svt == SVt_PVAV) {
2801                 TRACEME(("tied array"));
2802                 PUTMARK(SX_TIED_ARRAY);                 /* Introduces tied array */
2803         } else {
2804                 TRACEME(("tied scalar"));
2805                 PUTMARK(SX_TIED_SCALAR);                /* Introduces tied scalar */
2806                 mtype = 'q';
2807         }
2808
2809         if (!(mg = mg_find(sv, mtype)))
2810                 CROAK(("No magic '%c' found while storing tied %s", mtype,
2811                         (svt == SVt_PVHV) ? "hash" :
2812                                 (svt == SVt_PVAV) ? "array" : "scalar"));
2813
2814         /*
2815          * The mg->mg_obj found by mg_find() above actually points to the
2816          * underlying tied Perl object implementation. For instance, if the
2817          * original SV was that of a tied array, then mg->mg_obj is an AV.
2818          *
2819          * Note that we store the Perl object as-is. We don't call its FETCH
2820          * method along the way. At retrieval time, we won't call its STORE
2821          * method either, but the tieing magic will be re-installed. In itself,
2822          * that ensures that the tieing semantics are preserved since further
2823          * accesses on the retrieved object will indeed call the magic methods...
2824          */
2825
2826         /* [#17040] mg_obj is NULL for scalar self-ties. AMS 20030416 */
2827         obj = mg->mg_obj ? mg->mg_obj : newSV(0);
2828         if ((ret = store(aTHX_ cxt, obj)))
2829                 return ret;
2830
2831         TRACEME(("ok (tied)"));
2832
2833         return 0;
2834 }
2835
2836 /*
2837  * store_tied_item
2838  *
2839  * Stores a reference to an item within a tied structure:
2840  *
2841  *  . \$h{key}, stores both the (tied %h) object and 'key'.
2842  *  . \$a[idx], stores both the (tied @a) object and 'idx'.
2843  *
2844  * Layout is therefore either:
2845  *     SX_TIED_KEY <object> <key>
2846  *     SX_TIED_IDX <object> <index>
2847  */
2848 static int store_tied_item(pTHX_ stcxt_t *cxt, SV *sv)
2849 {
2850         MAGIC *mg;
2851         int ret;
2852
2853         TRACEME(("store_tied_item (0x%"UVxf")", PTR2UV(sv)));
2854
2855         if (!(mg = mg_find(sv, 'p')))
2856                 CROAK(("No magic 'p' found while storing reference to tied item"));
2857
2858         /*
2859          * We discriminate between \$h{key} and \$a[idx] via mg_ptr.
2860          */
2861
2862         if (mg->mg_ptr) {
2863                 TRACEME(("store_tied_item: storing a ref to a tied hash item"));
2864                 PUTMARK(SX_TIED_KEY);
2865                 TRACEME(("store_tied_item: storing OBJ 0x%"UVxf, PTR2UV(mg->mg_obj)));
2866
2867                 if ((ret = store(aTHX_ cxt, mg->mg_obj)))               /* Extra () for -Wall, grr... */
2868                         return ret;
2869
2870                 TRACEME(("store_tied_item: storing PTR 0x%"UVxf, PTR2UV(mg->mg_ptr)));
2871
2872                 if ((ret = store(aTHX_ cxt, (SV *) mg->mg_ptr)))        /* Idem, for -Wall */
2873                         return ret;
2874         } else {
2875                 I32 idx = mg->mg_len;
2876
2877                 TRACEME(("store_tied_item: storing a ref to a tied array item "));
2878                 PUTMARK(SX_TIED_IDX);
2879                 TRACEME(("store_tied_item: storing OBJ 0x%"UVxf, PTR2UV(mg->mg_obj)));
2880
2881                 if ((ret = store(aTHX_ cxt, mg->mg_obj)))               /* Idem, for -Wall */
2882                         return ret;
2883
2884                 TRACEME(("store_tied_item: storing IDX %d", idx));
2885
2886                 WLEN(idx);
2887         }
2888
2889         TRACEME(("ok (tied item)"));
2890
2891         return 0;
2892 }
2893
2894 /*
2895  * store_hook           -- dispatched manually, not via sv_store[]
2896  *
2897  * The blessed SV is serialized by a hook.
2898  *
2899  * Simple Layout is:
2900  *
2901  *     SX_HOOK <flags> <len> <classname> <len2> <str> [<len3> <object-IDs>]
2902  *
2903  * where <flags> indicates how long <len>, <len2> and <len3> are, whether
2904  * the trailing part [] is present, the type of object (scalar, array or hash).
2905  * There is also a bit which says how the classname is stored between:
2906  *
2907  *     <len> <classname>
2908  *     <index>
2909  *
2910  * and when the <index> form is used (classname already seen), the "large
2911  * classname" bit in <flags> indicates how large the <index> is.
2912  * 
2913  * The serialized string returned by the hook is of length <len2> and comes
2914  * next.  It is an opaque string for us.
2915  *
2916  * Those <len3> object IDs which are listed last represent the extra references
2917  * not directly serialized by the hook, but which are linked to the object.
2918  *
2919  * When recursion is mandated to resolve object-IDs not yet seen, we have
2920  * instead, with <header> being flags with bits set to indicate the object type
2921  * and that recursion was indeed needed:
2922  *
2923  *     SX_HOOK <header> <object> <header> <object> <flags>
2924  *
2925  * that same header being repeated between serialized objects obtained through
2926  * recursion, until we reach flags indicating no recursion, at which point
2927  * we know we've resynchronized with a single layout, after <flags>.
2928  *
2929  * When storing a blessed ref to a tied variable, the following format is
2930  * used:
2931  *
2932  *     SX_HOOK <flags> <extra> ... [<len3> <object-IDs>] <magic object>
2933  *
2934  * The first <flags> indication carries an object of type SHT_EXTRA, and the
2935  * real object type is held in the <extra> flag.  At the very end of the
2936  * serialization stream, the underlying magic object is serialized, just like
2937  * any other tied variable.
2938  */
2939 static int store_hook(
2940         pTHX_
2941         stcxt_t *cxt,
2942         SV *sv,
2943         int type,
2944         HV *pkg,
2945         SV *hook)
2946 {
2947         I32 len;
2948         char *classname;
2949         STRLEN len2;
2950         SV *ref;
2951         AV *av;
2952         SV **ary;
2953         int count;                              /* really len3 + 1 */
2954         unsigned char flags;
2955         char *pv;
2956         int i;
2957         int recursed = 0;               /* counts recursion */
2958         int obj_type;                   /* object type, on 2 bits */
2959         I32 classnum;
2960         int ret;
2961         int clone = cxt->optype & ST_CLONE;
2962         char mtype = '\0';                              /* for blessed ref to tied structures */
2963         unsigned char eflags = '\0';    /* used when object type is SHT_EXTRA */
2964
2965         TRACEME(("store_hook, classname \"%s\", tagged #%d", HvNAME_get(pkg), cxt->tagnum));
2966
2967         /*
2968          * Determine object type on 2 bits.
2969          */
2970
2971         switch (type) {
2972         case svis_REF:
2973         case svis_SCALAR:
2974                 obj_type = SHT_SCALAR;
2975                 break;
2976         case svis_ARRAY:
2977                 obj_type = SHT_ARRAY;
2978                 break;
2979         case svis_HASH:
2980                 obj_type = SHT_HASH;
2981                 break;
2982         case svis_TIED:
2983                 /*
2984                  * Produced by a blessed ref to a tied data structure, $o in the
2985                  * following Perl code.
2986                  *
2987                  *      my %h;
2988                  *  tie %h, 'FOO';
2989                  *      my $o = bless \%h, 'BAR';
2990                  *
2991                  * Signal the tie-ing magic by setting the object type as SHT_EXTRA
2992                  * (since we have only 2 bits in <flags> to store the type), and an
2993                  * <extra> byte flag will be emitted after the FIRST <flags> in the
2994                  * stream, carrying what we put in 'eflags'.
2995                  */
2996                 obj_type = SHT_EXTRA;
2997                 switch (SvTYPE(sv)) {
2998                 case SVt_PVHV:
2999                         eflags = (unsigned char) SHT_THASH;
3000                         mtype = 'P';
3001                         break;
3002                 case SVt_PVAV:
3003                         eflags = (unsigned char) SHT_TARRAY;
3004                         mtype = 'P';
3005                         break;
3006                 default:
3007                         eflags = (unsigned char) SHT_TSCALAR;
3008                         mtype = 'q';
3009                         break;
3010                 }
3011                 break;
3012         default:
3013                 CROAK(("Unexpected object type (%d) in store_hook()", type));
3014         }
3015         flags = SHF_NEED_RECURSE | obj_type;
3016
3017         classname = HvNAME_get(pkg);
3018         len = strlen(classname);
3019
3020         /*
3021          * To call the hook, we need to fake a call like:
3022          *
3023          *    $object->STORABLE_freeze($cloning);
3024          *
3025          * but we don't have the $object here.  For instance, if $object is
3026          * a blessed array, what we have in 'sv' is the array, and we can't
3027          * call a method on those.
3028          *
3029          * Therefore, we need to create a temporary reference to the object and
3030          * make the call on that reference.
3031          */
3032
3033         TRACEME(("about to call STORABLE_freeze on class %s", classname));
3034
3035         ref = newRV_inc(sv);                            /* Temporary reference */
3036         av = array_call(aTHX_ ref, hook, clone);        /* @a = $object->STORABLE_freeze($c) */
3037         SvREFCNT_dec(ref);                                      /* Reclaim temporary reference */
3038
3039         count = AvFILLp(av) + 1;
3040         TRACEME(("store_hook, array holds %d items", count));
3041
3042         /*
3043          * If they return an empty list, it means they wish to ignore the
3044          * hook for this class (and not just this instance -- that's for them
3045          * to handle if they so wish).
3046          *
3047          * Simply disable the cached entry for the hook (it won't be recomputed
3048          * since it's present in the cache) and recurse to store_blessed().
3049          */
3050
3051         if (!count) {
3052                 /*
3053                  * They must not change their mind in the middle of a serialization.
3054                  */
3055
3056                 if (hv_fetch(cxt->hclass, classname, len, FALSE))
3057                         CROAK(("Too late to ignore hooks for %s class \"%s\"",
3058                                 (cxt->optype & ST_CLONE) ? "cloning" : "storing", classname));
3059         
3060                 pkg_hide(aTHX_ cxt->hook, pkg, "STORABLE_freeze");
3061
3062                 ASSERT(!pkg_can(aTHX_ cxt->hook, pkg, "STORABLE_freeze"), ("hook invisible"));
3063                 TRACEME(("ignoring STORABLE_freeze in class \"%s\"", classname));
3064
3065                 return store_blessed(aTHX_ cxt, sv, type, pkg);
3066         }
3067
3068         /*
3069          * Get frozen string.
3070          */
3071
3072         ary = AvARRAY(av);
3073         pv = SvPV(ary[0], len2);
3074         /* We can't use pkg_can here because it only caches one method per
3075          * package */
3076         { 
3077             GV* gv = gv_fetchmethod_autoload(pkg, "STORABLE_attach", FALSE);
3078             if (gv && isGV(gv)) {
3079                 if (count > 1)
3080                     CROAK(("Freeze cannot return references if %s class is using STORABLE_attach", classname));
3081                 goto check_done;
3082             }
3083         }
3084
3085         /*
3086          * If they returned more than one item, we need to serialize some
3087          * extra references if not already done.
3088          *
3089          * Loop over the array, starting at position #1, and for each item,
3090          * ensure it is a reference, serialize it if not already done, and
3091          * replace the entry with the tag ID of the corresponding serialized
3092          * object.
3093          *
3094          * We CHEAT by not calling av_fetch() and read directly within the
3095          * array, for speed.
3096          */
3097
3098         for (i = 1; i < count; i++) {
3099 #ifdef USE_PTR_TABLE
3100                 char *fake_tag;
3101 #else
3102                 SV **svh;
3103 #endif
3104                 SV *rsv = ary[i];
3105                 SV *xsv;
3106                 SV *tag;
3107                 AV *av_hook = cxt->hook_seen;
3108
3109                 if (!SvROK(rsv))
3110                         CROAK(("Item #%d returned by STORABLE_freeze "
3111                                 "for %s is not a reference", i, classname));
3112                 xsv = SvRV(rsv);                /* Follow ref to know what to look for */
3113
3114                 /*
3115                  * Look in hseen and see if we have a tag already.
3116                  * Serialize entry if not done already, and get its tag.
3117                  */
3118         
3119 #ifdef USE_PTR_TABLE
3120                 /* Fakery needed because ptr_table_fetch returns zero for a
3121                    failure, whereas the existing code assumes that it can
3122                    safely store a tag zero. So for ptr_tables we store tag+1
3123                 */
3124                 if ((fake_tag = (char *)ptr_table_fetch(cxt->pseen, xsv)))
3125                         goto sv_seen;           /* Avoid moving code too far to the right */
3126 #else
3127                 if ((svh = hv_fetch(cxt->hseen, (char *) &xsv, sizeof(xsv), FALSE)))
3128                         goto sv_seen;           /* Avoid moving code too far to the right */
3129 #endif
3130
3131                 TRACEME(("listed object %d at 0x%"UVxf" is unknown", i-1, PTR2UV(xsv)));
3132
3133                 /*
3134                  * We need to recurse to store that object and get it to be known
3135                  * so that we can resolve the list of object-IDs at retrieve time.
3136                  *
3137                  * The first time we do this, we need to emit the proper header
3138                  * indicating that we recursed, and what the type of object is (the
3139                  * object we're storing via a user-hook).  Indeed, during retrieval,
3140                  * we'll have to create the object before recursing to retrieve the
3141                  * others, in case those would point back at that object.
3142                  */
3143
3144                 /* [SX_HOOK] <flags> [<extra>] <object>*/
3145                 if (!recursed++) {
3146                         PUTMARK(SX_HOOK);
3147                         PUTMARK(flags);
3148                         if (obj_type == SHT_EXTRA)
3149                                 PUTMARK(eflags);
3150                 } else
3151                         PUTMARK(flags);
3152
3153                 if ((ret = store(aTHX_ cxt, xsv)))      /* Given by hook for us to store */
3154                         return ret;
3155
3156 #ifdef USE_PTR_TABLE
3157                 fake_tag = (char *)ptr_table_fetch(cxt->pseen, xsv);
3158                 if (!sv)
3159                         CROAK(("Could not serialize item #%d from hook in %s", i, classname));
3160 #else
3161                 svh = hv_fetch(cxt->hseen, (char *) &xsv, sizeof(xsv), FALSE);
3162                 if (!svh)
3163                         CROAK(("Could not serialize item #%d from hook in %s", i, classname));
3164 #endif
3165                 /*
3166                  * It was the first time we serialized 'xsv'.
3167                  *
3168                  * Keep this SV alive until the end of the serialization: if we
3169                  * disposed of it right now by decrementing its refcount, and it was
3170                  * a temporary value, some next temporary value allocated during
3171                  * another STORABLE_freeze might take its place, and we'd wrongly
3172                  * assume that new SV was already serialized, based on its presence
3173                  * in cxt->hseen.
3174                  *
3175                  * Therefore, push it away in cxt->hook_seen.
3176                  */
3177
3178                 av_store(av_hook, AvFILLp(av_hook)+1, SvREFCNT_inc(xsv));
3179
3180         sv_seen:
3181                 /*
3182                  * Dispose of the REF they returned.  If we saved the 'xsv' away
3183                  * in the array of returned SVs, that will not cause the underlying
3184                  * referenced SV to be reclaimed.
3185                  */
3186
3187                 ASSERT(SvREFCNT(xsv) > 1, ("SV will survive disposal of its REF"));
3188                 SvREFCNT_dec(rsv);                      /* Dispose of reference */
3189
3190                 /*
3191                  * Replace entry with its tag (not a real SV, so no refcnt increment)
3192                  */
3193
3194 #ifdef USE_PTR_TABLE
3195                 tag = (SV *)--fake_tag;
3196 #else
3197                 tag = *svh;
3198 #endif
3199                 ary[i] = tag;
3200                 TRACEME(("listed object %d at 0x%"UVxf" is tag #%"UVuf,
3201                          i-1, PTR2UV(xsv), PTR2UV(tag)));
3202         }
3203
3204         /*
3205          * Allocate a class ID if not already done.
3206          *
3207          * This needs to be done after the recursion above, since at retrieval
3208          * time, we'll see the inner objects first.  Many thanks to
3209          * Salvador Ortiz Garcia <sog@msg.com.mx> who spot that bug and
3210          * proposed the right fix.  -- RAM, 15/09/2000
3211          */
3212
3213 check_done:
3214         if (!known_class(aTHX_ cxt, classname, len, &classnum)) {
3215                 TRACEME(("first time we see class %s, ID = %d", classname, classnum));
3216                 classnum = -1;                          /* Mark: we must store classname */
3217         } else {
3218                 TRACEME(("already seen class %s, ID = %d", classname, classnum));
3219         }
3220
3221         /*
3222          * Compute leading flags.
3223          */
3224
3225         flags = obj_type;
3226         if (((classnum == -1) ? len : classnum) > LG_SCALAR)
3227                 flags |= SHF_LARGE_CLASSLEN;
3228         if (classnum != -1)
3229                 flags |= SHF_IDX_CLASSNAME;
3230         if (len2 > LG_SCALAR)
3231                 flags |= SHF_LARGE_STRLEN;
3232         if (count > 1)
3233                 flags |= SHF_HAS_LIST;
3234         if (count > (LG_SCALAR + 1))
3235                 flags |= SHF_LARGE_LISTLEN;
3236
3237         /* 
3238          * We're ready to emit either serialized form:
3239          *
3240          *   SX_HOOK <flags> <len> <classname> <len2> <str> [<len3> <object-IDs>]
3241          *   SX_HOOK <flags> <index>           <len2> <str> [<len3> <object-IDs>]
3242          *
3243          * If we recursed, the SX_HOOK has already been emitted.
3244          */
3245
3246         TRACEME(("SX_HOOK (recursed=%d) flags=0x%x "
3247                         "class=%"IVdf" len=%"IVdf" len2=%"IVdf" len3=%d",
3248                  recursed, flags, (IV)classnum, (IV)len, (IV)len2, count-1));
3249
3250         /* SX_HOOK <flags> [<extra>] */
3251         if (!recursed) {
3252                 PUTMARK(SX_HOOK);
3253                 PUTMARK(flags);
3254                 if (obj_type == SHT_EXTRA)
3255                         PUTMARK(eflags);
3256         } else
3257                 PUTMARK(flags);
3258
3259         /* <len> <classname> or <index> */
3260         if (flags & SHF_IDX_CLASSNAME) {
3261                 if (flags & SHF_LARGE_CLASSLEN)
3262                         WLEN(classnum);
3263                 else {
3264                         unsigned char cnum = (unsigned char) classnum;
3265                         PUTMARK(cnum);
3266                 }
3267         } else {
3268                 if (flags & SHF_LARGE_CLASSLEN)
3269                         WLEN(len);
3270                 else {
3271                         unsigned char clen = (unsigned char) len;
3272                         PUTMARK(clen);
3273                 }
3274                 WRITE(classname, len);          /* Final \0 is omitted */
3275         }
3276
3277         /* <len2> <frozen-str> */
3278         if (flags & SHF_LARGE_STRLEN) {
3279                 I32 wlen2 = len2;               /* STRLEN might be 8 bytes */
3280                 WLEN(wlen2);                    /* Must write an I32 for 64-bit machines */
3281         } else {
3282                 unsigned char clen = (unsigned char) len2;
3283                 PUTMARK(clen);
3284         }
3285         if (len2)
3286                 WRITE(pv, (SSize_t)len2);       /* Final \0 is omitted */
3287
3288         /* [<len3> <object-IDs>] */
3289         if (flags & SHF_HAS_LIST) {
3290                 int len3 = count - 1;
3291                 if (flags & SHF_LARGE_LISTLEN)
3292                         WLEN(len3);
3293                 else {
3294                         unsigned char clen = (unsigned char) len3;
3295                         PUTMARK(clen);
3296                 }
3297
3298                 /*
3299                  * NOTA BENE, for 64-bit machines: the ary[i] below does not yield a
3300                  * real pointer, rather a tag number, well under the 32-bit limit.
3301                  */
3302
3303                 for (i = 1; i < count; i++) {
3304                         I32 tagval = htonl(LOW_32BITS(ary[i]));
3305                         WRITE_I32(tagval);
3306                         TRACEME(("object %d, tag #%d", i-1, ntohl(tagval)));
3307                 }
3308         }
3309
3310         /*
3311          * Free the array.  We need extra care for indices after 0, since they
3312          * don't hold real SVs but integers cast.
3313          */
3314
3315         if (count > 1)
3316                 AvFILLp(av) = 0;        /* Cheat, nothing after 0 interests us */
3317         av_undef(av);
3318         sv_free((SV *) av);
3319
3320         /*
3321          * If object was tied, need to insert serialization of the magic object.
3322          */
3323
3324         if (obj_type == SHT_EXTRA) {
3325                 MAGIC *mg;
3326
3327                 if (!(mg = mg_find(sv, mtype))) {
3328                         int svt = SvTYPE(sv);
3329                         CROAK(("No magic '%c' found while storing ref to tied %s with hook",
3330                                 mtype, (svt == SVt_PVHV) ? "hash" :
3331                                         (svt == SVt_PVAV) ? "array" : "scalar"));
3332                 }
3333
3334                 TRACEME(("handling the magic object 0x%"UVxf" part of 0x%"UVxf,
3335                         PTR2UV(mg->mg_obj), PTR2UV(sv)));
3336
3337                 /*
3338                  * [<magic object>]
3339                  */
3340
3341                 if ((ret = store(aTHX_ cxt, mg->mg_obj)))       /* Extra () for -Wall, grr... */
3342                         return ret;
3343         }
3344
3345         return 0;
3346 }
3347
3348 /*
3349  * store_blessed        -- dispatched manually, not via sv_store[]
3350  *
3351  * Check whether there is a STORABLE_xxx hook defined in the class or in one
3352  * of its ancestors.  If there is, then redispatch to store_hook();
3353  *
3354  * Otherwise, the blessed SV is stored using the following layout:
3355  *
3356  *    SX_BLESS <flag> <len> <classname> <object>
3357  *
3358  * where <flag> indicates whether <len> is stored on 0 or 4 bytes, depending
3359  * on the high-order bit in flag: if 1, then length follows on 4 bytes.
3360  * Otherwise, the low order bits give the length, thereby giving a compact
3361  * representation for class names less than 127 chars long.
3362  *
3363  * Each <classname> seen is remembered and indexed, so that the next time
3364  * an object in the blessed in the same <classname> is stored, the following
3365  * will be emitted:
3366  *
3367  *    SX_IX_BLESS <flag> <index> <object>
3368  *
3369  * where <index> is the classname index, stored on 0 or 4 bytes depending
3370  * on the high-order bit in flag (same encoding as above for <len>).
3371  */
3372 static int store_blessed(
3373         pTHX_
3374         stcxt_t *cxt,
3375         SV *sv,
3376         int type,
3377         HV *pkg)
3378 {
3379         SV *hook;
3380         I32 len;
3381         char *classname;
3382         I32 classnum;
3383
3384         TRACEME(("store_blessed, type %d, class \"%s\"", type, HvNAME_get(pkg)));
3385
3386         /*
3387          * Look for a hook for this blessed SV and redirect to store_hook()
3388          * if needed.
3389          */
3390
3391         hook = pkg_can(aTHX_ cxt->hook, pkg, "STORABLE_freeze");
3392         if (hook)
3393                 return store_hook(aTHX_ cxt, sv, type, pkg, hook);
3394
3395         /*
3396          * This is a blessed SV without any serialization hook.
3397          */
3398
3399         classname = HvNAME_get(pkg);
3400         len = strlen(classname);
3401
3402         TRACEME(("blessed 0x%"UVxf" in %s, no hook: tagged #%d",
3403                  PTR2UV(sv), classname, cxt->tagnum));
3404
3405         /*
3406          * Determine whether it is the first time we see that class name (in which
3407          * case it will be stored in the SX_BLESS form), or whether we already
3408          * saw that class name before (in which case the SX_IX_BLESS form will be
3409          * used).
3410          */
3411
3412         if (known_class(aTHX_ cxt, classname, len, &classnum)) {
3413                 TRACEME(("already seen class %s, ID = %d", classname, classnum));
3414                 PUTMARK(SX_IX_BLESS);
3415                 if (classnum <= LG_BLESS) {
3416                         unsigned char cnum = (unsigned char) classnum;
3417                         PUTMARK(cnum);
3418                 } else {
3419                         unsigned char flag = (unsigned char) 0x80;
3420                         PUTMARK(flag);
3421                         WLEN(classnum);
3422                 }
3423         } else {
3424                 TRACEME(("first time we see class %s, ID = %d", classname, classnum));
3425                 PUTMARK(SX_BLESS);
3426                 if (len <= LG_BLESS) {
3427                         unsigned char clen = (unsigned char) len;
3428                         PUTMARK(clen);
3429                 } else {
3430                         unsigned char flag = (unsigned char) 0x80;
3431                         PUTMARK(flag);
3432                         WLEN(len);                                      /* Don't BER-encode, this should be rare */
3433                 }
3434                 WRITE(classname, len);                          /* Final \0 is omitted */
3435         }
3436
3437         /*
3438          * Now emit the <object> part.
3439          */
3440
3441         return SV_STORE(type)(aTHX_ cxt, sv);
3442 }
3443
3444 /*
3445  * store_other
3446  *
3447  * We don't know how to store the item we reached, so return an error condition.
3448  * (it's probably a GLOB, some CODE reference, etc...)
3449  *
3450  * If they defined the 'forgive_me' variable at the Perl level to some
3451  * true value, then don't croak, just warn, and store a placeholder string
3452  * instead.
3453  */
3454 static int store_other(pTHX_ stcxt_t *cxt, SV *sv)
3455 {
3456         I32 len;
3457         char buf[80];
3458
3459         TRACEME(("store_other"));
3460
3461         /*
3462          * Fetch the value from perl only once per store() operation.
3463          */
3464
3465         if (
3466                 cxt->forgive_me == 0 ||
3467                 (cxt->forgive_me < 0 && !(cxt->forgive_me =
3468                         SvTRUE(perl_get_sv("Storable::forgive_me", GV_ADD)) ? 1 : 0))
3469         )
3470                 CROAK(("Can't store %s items", sv_reftype(sv, FALSE)));
3471
3472         warn("Can't store item %s(0x%"UVxf")",
3473                 sv_reftype(sv, FALSE), PTR2UV(sv));
3474
3475         /*
3476          * Store placeholder string as a scalar instead...
3477          */
3478
3479         (void) sprintf(buf, "You lost %s(0x%"UVxf")%c", sv_reftype(sv, FALSE),
3480                        PTR2UV(sv), (char) 0);
3481
3482         len = strlen(buf);
3483         STORE_SCALAR(buf, len);
3484         TRACEME(("ok (dummy \"%s\", length = %"IVdf")", buf, (IV) len));
3485
3486         return 0;
3487 }
3488
3489 /***
3490  *** Store driving routines
3491  ***/
3492
3493 /*
3494  * sv_type
3495  *
3496  * WARNING: partially duplicates Perl's sv_reftype for speed.
3497  *
3498  * Returns the type of the SV, identified by an integer. That integer
3499  * may then be used to index the dynamic routine dispatch table.
3500  */
3501 static int sv_type(pTHX_ SV *sv)
3502 {
3503         switch (SvTYPE(sv)) {
3504         case SVt_NULL:
3505 #if PERL_VERSION <= 10
3506         case SVt_IV:
3507 #endif
3508         case SVt_NV:
3509                 /*
3510                  * No need to check for ROK, that can't be set here since there
3511                  * is no field capable of hodling the xrv_rv reference.
3512                  */
3513                 return svis_SCALAR;
3514         case SVt_PV:
3515 #if PERL_VERSION <= 10
3516         case SVt_RV:
3517 #else
3518         case SVt_IV:
3519 #endif
3520         case SVt_PVIV:
3521         case SVt_PVNV:
3522                 /*
3523                  * Starting from SVt_PV, it is possible to have the ROK flag
3524                  * set, the pointer to the other SV being either stored in
3525                  * the xrv_rv (in the case of a pure SVt_RV), or as the
3526                  * xpv_pv field of an SVt_PV and its heirs.
3527                  *
3528                  * However, those SV cannot be magical or they would be an
3529                  * SVt_PVMG at least.
3530                  */
3531                 return SvROK(sv) ? svis_REF : svis_SCALAR;
3532         case SVt_PVMG:
3533         case SVt_PVLV:          /* Workaround for perl5.004_04 "LVALUE" bug */
3534                 if (SvRMAGICAL(sv) && (mg_find(sv, 'p')))
3535                         return svis_TIED_ITEM;
3536                 /* FALL THROUGH */
3537 #if PERL_VERSION < 9
3538         case SVt_PVBM:
3539 #endif
3540                 if (SvRMAGICAL(sv) && (mg_find(sv, 'q')))
3541                         return svis_TIED;
3542                 return SvROK(sv) ? svis_REF : svis_SCALAR;
3543         case SVt_PVAV:
3544                 if (SvRMAGICAL(sv) && (mg_find(sv, 'P')))
3545                         return svis_TIED;
3546                 return svis_ARRAY;
3547         case SVt_PVHV:
3548                 if (SvRMAGICAL(sv) && (mg_find(sv, 'P')))
3549                         return svis_TIED;
3550                 return svis_HASH;
3551         case SVt_PVCV:
3552                 return svis_CODE;
3553 #if PERL_VERSION > 8
3554         /* case SVt_INVLIST: */
3555 #endif
3556         default:
3557                 break;
3558         }
3559
3560         return svis_OTHER;
3561 }
3562
3563 /*
3564  * store
3565  *
3566  * Recursively store objects pointed to by the sv to the specified file.
3567  *
3568  * Layout is <content> or SX_OBJECT <tagnum> if we reach an already stored
3569  * object (one for which storage has started -- it may not be over if we have
3570  * a self-referenced structure). This data set forms a stored <object>.
3571  */
3572 static int store(pTHX_ stcxt_t *cxt, SV *sv)
3573 {
3574         SV **svh;
3575         int ret;
3576         int type;
3577 #ifdef USE_PTR_TABLE
3578         struct ptr_tbl *pseen = cxt->pseen;
3579 #else
3580         HV *hseen = cxt->hseen;
3581 #endif
3582
3583         TRACEME(("store (0x%"UVxf")", PTR2UV(sv)));
3584
3585         /*
3586          * If object has already been stored, do not duplicate data.
3587          * Simply emit the SX_OBJECT marker followed by its tag data.
3588          * The tag is always written in network order.
3589          *
3590          * NOTA BENE, for 64-bit machines: the "*svh" below does not yield a
3591          * real pointer, rather a tag number (watch the insertion code below).
3592          * That means it probably safe to assume it is well under the 32-bit limit,
3593          * and makes the truncation safe.
3594          *              -- RAM, 14/09/1999
3595          */
3596
3597 #ifdef USE_PTR_TABLE
3598         svh = (SV **)ptr_table_fetch(pseen, sv);
3599 #else
3600         svh = hv_fetch(hseen, (char *) &sv, sizeof(sv), FALSE);
3601 #endif
3602         if (svh) {
3603                 I32 tagval;
3604
3605                 if (sv == &PL_sv_undef) {
3606                         /* We have seen PL_sv_undef before, but fake it as
3607                            if we have not.
3608
3609                            Not the simplest solution to making restricted
3610                            hashes work on 5.8.0, but it does mean that
3611                            repeated references to the one true undef will
3612                            take up less space in the output file.
3613                         */
3614                         /* Need to jump past the next hv_store, because on the
3615                            second store of undef the old hash value will be
3616                            SvREFCNT_dec()ed, and as Storable cheats horribly
3617                            by storing non-SVs in the hash a SEGV will ensure.
3618                            Need to increase the tag number so that the
3619                            receiver has no idea what games we're up to.  This
3620                            special casing doesn't affect hooks that store
3621                            undef, as the hook routine does its own lookup into
3622                            hseen.  Also this means that any references back
3623                            to PL_sv_undef (from the pathological case of hooks
3624                            storing references to it) will find the seen hash
3625                            entry for the first time, as if we didn't have this
3626                            hackery here. (That hseen lookup works even on 5.8.0
3627                            because it's a key of &PL_sv_undef and a value
3628                            which is a tag number, not a value which is
3629                            PL_sv_undef.)  */
3630                         cxt->tagnum++;
3631                         type = svis_SCALAR;
3632                         goto undef_special_case;
3633                 }
3634                 
3635 #ifdef USE_PTR_TABLE
3636                 tagval = htonl(LOW_32BITS(((char *)svh)-1));
3637 #else
3638                 tagval = htonl(LOW_32BITS(*svh));
3639 #endif
3640
3641                 TRACEME(("object 0x%"UVxf" seen as #%d", PTR2UV(sv), ntohl(tagval)));
3642
3643                 PUTMARK(SX_OBJECT);
3644                 WRITE_I32(tagval);
3645                 return 0;
3646         }
3647
3648         /*
3649          * Allocate a new tag and associate it with the address of the sv being
3650          * stored, before recursing...
3651          *
3652          * In order to avoid creating new SvIVs to hold the tagnum we just
3653          * cast the tagnum to an SV pointer and store that in the hash.  This
3654          * means that we must clean up the hash manually afterwards, but gives
3655          * us a 15% throughput increase.
3656          *
3657          */
3658
3659         cxt->tagnum++;
3660 #ifdef USE_PTR_TABLE
3661         ptr_table_store(pseen, sv, INT2PTR(SV*, 1 + cxt->tagnum));
3662 #else
3663         if (!hv_store(hseen,
3664                         (char *) &sv, sizeof(sv), INT2PTR(SV*, cxt->tagnum), 0))
3665                 return -1;
3666 #endif
3667
3668         /*
3669          * Store 'sv' and everything beneath it, using appropriate routine.
3670          * Abort immediately if we get a non-zero status back.
3671          */
3672
3673         type = sv_type(aTHX_ sv);
3674
3675 undef_special_case:
3676         TRACEME(("storing 0x%"UVxf" tag #%d, type %d...",
3677                  PTR2UV(sv), cxt->tagnum, type));
3678
3679         if (SvOBJECT(sv)) {
3680                 HV *pkg = SvSTASH(sv);
3681                 ret = store_blessed(aTHX_ cxt, sv, type, pkg);
3682         } else
3683                 ret = SV_STORE(type)(aTHX_ cxt, sv);
3684
3685         TRACEME(("%s (stored 0x%"UVxf", refcnt=%d, %s)",
3686                 ret ? "FAILED" : "ok", PTR2UV(sv),
3687                 SvREFCNT(sv), sv_reftype(sv, FALSE)));
3688
3689         return ret;
3690 }
3691
3692 /*
3693  * magic_write
3694  *
3695  * Write magic number and system information into the file.
3696  * Layout is <magic> <network> [<len> <byteorder> <sizeof int> <sizeof long>
3697  * <sizeof ptr>] where <len> is the length of the byteorder hexa string.
3698  * All size and lenghts are written as single characters here.
3699  *
3700  * Note that no byte ordering info is emitted when <network> is true, since
3701  * integers will be emitted in network order in that case.
3702  */
3703 static int magic_write(pTHX_ stcxt_t *cxt)
3704 {
3705     /*
3706      * Starting with 0.6, the "use_network_order" byte flag is also used to
3707      * indicate the version number of the binary image, encoded in the upper
3708      * bits. The bit 0 is always used to indicate network order.
3709      */
3710     /*
3711      * Starting with 0.7, a full byte is dedicated to the minor version of
3712      * the binary format, which is incremented only when new markers are
3713      * introduced, for instance, but when backward compatibility is preserved.
3714      */
3715
3716     /* Make these at compile time.  The WRITE() macro is sufficiently complex
3717        that it saves about 200 bytes doing it this way and only using it
3718        once.  */
3719     static const unsigned char network_file_header[] = {
3720         MAGICSTR_BYTES,
3721         (STORABLE_BIN_MAJOR << 1) | 1,
3722         STORABLE_BIN_WRITE_MINOR
3723     };
3724     static const unsigned char file_header[] = {
3725         MAGICSTR_BYTES,
3726         (STORABLE_BIN_MAJOR << 1) | 0,
3727         STORABLE_BIN_WRITE_MINOR,
3728         /* sizeof the array includes the 0 byte at the end:  */
3729         (char) sizeof (byteorderstr) - 1,
3730         BYTEORDER_BYTES,
3731         (unsigned char) sizeof(int),
3732         (unsigned char) sizeof(long),
3733         (unsigned char) sizeof(char *),
3734         (unsigned char) sizeof(NV)
3735     };
3736 #ifdef USE_56_INTERWORK_KLUDGE
3737     static const unsigned char file_header_56[] = {
3738         MAGICSTR_BYTES,
3739         (STORABLE_BIN_MAJOR << 1) | 0,
3740         STORABLE_BIN_WRITE_MINOR,
3741         /* sizeof the array includes the 0 byte at the end:  */
3742         (char) sizeof (byteorderstr_56) - 1,
3743         BYTEORDER_BYTES_56,
3744         (unsigned char) sizeof(int),
3745         (unsigned char) sizeof(long),
3746         (unsigned char) sizeof(char *),
3747         (unsigned char) sizeof(NV)
3748     };
3749 #endif
3750     const unsigned char *header;
3751     SSize_t length;
3752
3753     TRACEME(("magic_write on fd=%d", cxt->fio ? PerlIO_fileno(cxt->fio) : -1));
3754
3755     if (cxt->netorder) {
3756         header = network_file_header;
3757         length = sizeof (network_file_header);
3758     } else {
3759 #ifdef USE_56_INTERWORK_KLUDGE
3760         if (SvTRUE(perl_get_sv("Storable::interwork_56_64bit", GV_ADD))) {
3761             header = file_header_56;
3762             length = sizeof (file_header_56);
3763         } else
3764 #endif
3765         {
3766             header = file_header;
3767             length = sizeof (file_header);
3768         }
3769     }        
3770
3771     if (!cxt->fio) {
3772         /* sizeof the array includes the 0 byte at the end.  */
3773         header += sizeof (magicstr) - 1;
3774         length -= sizeof (magicstr) - 1;
3775     }        
3776
3777     WRITE( (unsigned char*) header, length);
3778
3779     if (!cxt->netorder) {
3780         TRACEME(("ok (magic_write byteorder = 0x%lx [%d], I%d L%d P%d D%d)",
3781                  (unsigned long) BYTEORDER, (int) sizeof (byteorderstr) - 1,
3782                  (int) sizeof(int), (int) sizeof(long),
3783                  (int) sizeof(char *), (int) sizeof(NV)));
3784     }
3785     return 0;
3786 }
3787
3788 /*
3789  * do_store
3790  *
3791  * Common code for store operations.
3792  *
3793  * When memory store is requested (f = NULL) and a non null SV* is given in
3794  * 'res', it is filled with a new SV created out of the memory buffer.
3795  *
3796  * It is required to provide a non-null 'res' when the operation type is not
3797  * dclone() and store() is performed to memory.
3798  */
3799 static int do_store(
3800         pTHX_
3801         PerlIO *f,
3802         SV *sv,
3803         int optype,
3804         int network_order,
3805         SV **res)
3806 {
3807         dSTCXT;
3808         int status;
3809
3810         ASSERT(!(f == 0 && !(optype & ST_CLONE)) || res,
3811                 ("must supply result SV pointer for real recursion to memory"));
3812
3813         TRACEME(("do_store (optype=%d, netorder=%d)",
3814                 optype, network_order));
3815
3816         optype |= ST_STORE;
3817
3818         /*
3819          * Workaround for CROAK leak: if they enter with a "dirty" context,
3820          * free up memory for them now.
3821          */
3822
3823         if (cxt->s_dirty)
3824                 clean_context(aTHX_ cxt);
3825
3826         /*
3827          * Now that STORABLE_xxx hooks exist, it is possible that they try to
3828          * re-enter store() via the hooks.  We need to stack contexts.
3829          */
3830
3831         if (cxt->entry)
3832                 cxt = allocate_context(aTHX_ cxt);
3833
3834         cxt->entry++;
3835
3836         ASSERT(cxt->entry == 1, ("starting new recursion"));
3837         ASSERT(!cxt->s_dirty, ("clean context"));
3838
3839         /*
3840          * Ensure sv is actually a reference. From perl, we called something
3841          * like:
3842          *       pstore(aTHX_ FILE, \@array);
3843          * so we must get the scalar value behind that reference.
3844          */
3845
3846         if (!SvROK(sv))
3847                 CROAK(("Not a reference"));
3848         sv = SvRV(sv);                  /* So follow it to know what to store */
3849
3850         /* 
3851          * If we're going to store to memory, reset the buffer.
3852          */
3853
3854         if (!f)
3855                 MBUF_INIT(0);
3856
3857         /*
3858          * Prepare context and emit headers.
3859          */
3860
3861         init_store_context(aTHX_ cxt, f, optype, network_order);
3862
3863         if (-1 == magic_write(aTHX_ cxt))               /* Emit magic and ILP info */
3864                 return 0;                                       /* Error */
3865
3866         /*
3867          * Recursively store object...
3868          */
3869
3870         ASSERT(is_storing(aTHX), ("within store operation"));
3871
3872         status = store(aTHX_ cxt, sv);          /* Just do it! */
3873
3874         /*
3875          * If they asked for a memory store and they provided an SV pointer,
3876          * make an SV string out of the buffer and fill their pointer.
3877          *
3878          * When asking for ST_REAL, it's MANDATORY for the caller to provide
3879          * an SV, since context cleanup might free the buffer if we did recurse.
3880          * (unless caller is dclone(), which is aware of that).
3881          */
3882
3883         if (!cxt->fio && res)
3884                 *res = mbuf2sv(aTHX);
3885
3886         /*
3887          * Final cleanup.
3888          *
3889          * The "root" context is never freed, since it is meant to be always
3890          * handy for the common case where no recursion occurs at all (i.e.
3891          * we enter store() outside of any Storable code and leave it, period).
3892          * We know it's the "root" context because there's nothing stacked
3893          * underneath it.
3894          *
3895          * OPTIMIZATION:
3896          *
3897          * When deep cloning, we don't free the context: doing so would force
3898          * us to copy the data in the memory buffer.  Sicne we know we're
3899          * about to enter do_retrieve...
3900          */
3901
3902         clean_store_context(aTHX_ cxt);
3903         if (cxt->prev && !(cxt->optype & ST_CLONE))
3904                 free_context(aTHX_ cxt);
3905
3906         TRACEME(("do_store returns %d", status));
3907
3908         return status == 0;
3909 }
3910
3911 /***
3912  *** Memory stores.
3913  ***/
3914
3915 /*
3916  * mbuf2sv
3917  *
3918  * Build a new SV out of the content of the internal memory buffer.
3919  */
3920 static SV *mbuf2sv(pTHX)
3921 {
3922         dSTCXT;
3923
3924         return newSVpv(mbase, MBUF_SIZE());
3925 }
3926
3927 /***
3928  *** Specific retrieve callbacks.
3929  ***/
3930
3931 /*
3932  * retrieve_other
3933  *
3934  * Return an error via croak, since it is not possible that we get here
3935  * under normal conditions, when facing a file produced via pstore().
3936  */
3937 static SV *retrieve_other(pTHX_ stcxt_t *cxt, const char *cname)
3938 {
3939         PERL_UNUSED_ARG(cname);
3940         if (
3941                 cxt->ver_major != STORABLE_BIN_MAJOR &&
3942                 cxt->ver_minor != STORABLE_BIN_MINOR
3943         ) {
3944                 CROAK(("Corrupted storable %s (binary v%d.%d), current is v%d.%d",
3945                         cxt->fio ? "file" : "string",
3946                         cxt->ver_major, cxt->ver_minor,
3947