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