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