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