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