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