2 * Store and retrieve mechanism.
6 * $Id: Storable.xs,v 1.0.1.10 2001/08/28 21:52:14 ram Exp $
8 * Copyright (c) 1995-2000, Raphael Manfredi
10 * You may redistribute only under the same terms as Perl 5, as specified
11 * in the README file that comes with the distribution.
13 * $Log: Storable.xs,v $
14 * Revision 1.0.1.10 2001/08/28 21:52:14 ram
15 * patch13: removed spurious debugging messages
17 * Revision 1.0.1.9 2001/07/01 11:25:02 ram
18 * patch12: fixed memory corruption on croaks during thaw()
19 * patch12: made code compile cleanly with -Wall (Jarkko Hietaniemi)
20 * patch12: changed tagnum and classnum from I32 to IV in context
22 * Revision 1.0.1.8 2001/03/15 00:20:55 ram
23 * patch11: last version was wrongly compiling with assertions on
25 * Revision 1.0.1.7 2001/02/17 12:25:26 ram
26 * patch8: now bless objects ASAP at retrieve time
27 * patch8: added support for blessed ref to tied structures
29 * Revision 1.0.1.6 2001/01/03 09:40:40 ram
30 * patch7: prototype and casting cleanup
31 * patch7: trace offending package when overloading cannot be restored
32 * patch7: made context cleanup safer to avoid dup freeing
34 * Revision 1.0.1.5 2000/11/05 17:21:24 ram
35 * patch6: fixed severe "object lost" bug for STORABLE_freeze returns
37 * Revision 1.0.1.4 2000/10/26 17:11:04 ram
38 * patch5: auto requires module of blessed ref when STORABLE_thaw misses
40 * Revision 1.0.1.3 2000/09/29 19:49:57 ram
41 * patch3: avoid using "tainted" and "dirty" since Perl remaps them via cpp
43 * Revision 1.0.1.2 2000/09/28 21:43:10 ram
44 * patch2: perls before 5.004_04 lack newSVpvn
46 * Revision 1.0.1.1 2000/09/17 16:47:49 ram
47 * patch1: now only taint retrieved data when source was tainted
48 * patch1: added support for UTF-8 strings
49 * patch1: fixed store hook bug: was allocating class id too soon
51 * Revision 1.0 2000/09/01 19:40:41 ram
52 * Baseline for first official release.
58 #include <patchlevel.h> /* Perl's one, needed since 5.6 */
62 #define DEBUGME /* Debug mode, turns assertions on as well */
63 #define DASSERT /* Assertion mode */
67 * Pre PerlIO time when none of USE_PERLIO and PERLIO_IS_STDIO is defined
68 * Provide them with the necessary defines so they can build with pre-5.004.
71 #ifndef PERLIO_IS_STDIO
73 #define PerlIO_getc(x) getc(x)
74 #define PerlIO_putc(f,x) putc(x,f)
75 #define PerlIO_read(x,y,z) fread(y,1,z,x)
76 #define PerlIO_write(x,y,z) fwrite(y,1,z,x)
77 #define PerlIO_stdoutf printf
78 #endif /* PERLIO_IS_STDIO */
79 #endif /* USE_PERLIO */
82 * Earlier versions of perl might be used, we can't assume they have the latest!
85 #ifndef PERL_VERSION /* For perls < 5.6 */
86 #define PERL_VERSION PATCHLEVEL
88 #define newRV_noinc(sv) ((Sv = newRV(sv)), --SvREFCNT(SvRV(Sv)), Sv)
90 #if (PATCHLEVEL <= 4) /* Older perls (<= 5.004) lack PL_ namespace */
91 #define PL_sv_yes sv_yes
92 #define PL_sv_no sv_no
93 #define PL_sv_undef sv_undef
94 #if (SUBVERSION <= 4) /* 5.004_04 has been reported to lack newSVpvn */
95 #define newSVpvn newSVpv
97 #endif /* PATCHLEVEL <= 4 */
98 #ifndef HvSHAREKEYS_off
99 #define HvSHAREKEYS_off(hv) /* Ignore */
101 #ifndef AvFILLp /* Older perls (<=5.003) lack AvFILLp */
102 #define AvFILLp AvFILL
104 typedef double NV; /* Older perls lack the NV type */
105 #define IVdf "ld" /* Various printf formats for Perl types */
109 #define INT2PTR(t,v) (t)(IV)(v)
110 #define PTR2UV(v) (unsigned long)(v)
111 #endif /* PERL_VERSION -- perls < 5.6 */
113 #ifndef NVef /* The following were not part of perl 5.6 */
114 #if defined(USE_LONG_DOUBLE) && \
115 defined(HAS_LONG_DOUBLE) && defined(PERL_PRIfldbl)
116 #define NVef PERL_PRIeldbl
117 #define NVff PERL_PRIfldbl
118 #define NVgf PERL_PRIgldbl
133 * TRACEME() will only output things when the $Storable::DEBUGME is true.
136 #define TRACEME(x) do { \
137 if (SvTRUE(perl_get_sv("Storable::DEBUGME", TRUE))) \
138 { PerlIO_stdoutf x; PerlIO_stdoutf("\n"); } \
145 #define ASSERT(x,y) do { \
147 PerlIO_stdoutf("ASSERT FAILED (\"%s\", line %d): ", \
148 __FILE__, __LINE__); \
149 PerlIO_stdoutf y; PerlIO_stdoutf("\n"); \
160 #define C(x) ((char) (x)) /* For markers with dynamic retrieval handling */
162 #define SX_OBJECT C(0) /* Already stored object */
163 #define SX_LSCALAR C(1) /* Scalar (large binary) follows (length, data) */
164 #define SX_ARRAY C(2) /* Array forthcominng (size, item list) */
165 #define SX_HASH C(3) /* Hash forthcoming (size, key/value pair list) */
166 #define SX_REF C(4) /* Reference to object forthcoming */
167 #define SX_UNDEF C(5) /* Undefined scalar */
168 #define SX_INTEGER C(6) /* Integer forthcoming */
169 #define SX_DOUBLE C(7) /* Double forthcoming */
170 #define SX_BYTE C(8) /* (signed) byte forthcoming */
171 #define SX_NETINT C(9) /* Integer in network order forthcoming */
172 #define SX_SCALAR C(10) /* Scalar (binary, small) follows (length, data) */
173 #define SX_TIED_ARRAY C(11) /* Tied array forthcoming */
174 #define SX_TIED_HASH C(12) /* Tied hash forthcoming */
175 #define SX_TIED_SCALAR C(13) /* Tied scalar forthcoming */
176 #define SX_SV_UNDEF C(14) /* Perl's immortal PL_sv_undef */
177 #define SX_SV_YES C(15) /* Perl's immortal PL_sv_yes */
178 #define SX_SV_NO C(16) /* Perl's immortal PL_sv_no */
179 #define SX_BLESS C(17) /* Object is blessed */
180 #define SX_IX_BLESS C(18) /* Object is blessed, classname given by index */
181 #define SX_HOOK C(19) /* Stored via hook, user-defined */
182 #define SX_OVERLOAD C(20) /* Overloaded reference */
183 #define SX_TIED_KEY C(21) /* Tied magic key forthcoming */
184 #define SX_TIED_IDX C(22) /* Tied magic index forthcoming */
185 #define SX_UTF8STR C(23) /* UTF-8 string forthcoming (small) */
186 #define SX_LUTF8STR C(24) /* UTF-8 string forthcoming (large) */
187 #define SX_FLAG_HASH C(25) /* Hash with flags forthcoming (size, flags, key/flags/value triplet list) */
188 #define SX_ERROR C(26) /* Error */
191 * Those are only used to retrieve "old" pre-0.6 binary images.
193 #define SX_ITEM 'i' /* An array item introducer */
194 #define SX_IT_UNDEF 'I' /* Undefined array item */
195 #define SX_KEY 'k' /* A hash key introducer */
196 #define SX_VALUE 'v' /* A hash value introducer */
197 #define SX_VL_UNDEF 'V' /* Undefined hash value */
200 * Those are only used to retrieve "old" pre-0.7 binary images
203 #define SX_CLASS 'b' /* Object is blessed, class name length <255 */
204 #define SX_LG_CLASS 'B' /* Object is blessed, class name length >255 */
205 #define SX_STORED 'X' /* End of object */
208 * Limits between short/long length representation.
211 #define LG_SCALAR 255 /* Large scalar length limit */
212 #define LG_BLESS 127 /* Large classname bless limit */
218 #define ST_STORE 0x1 /* Store operation */
219 #define ST_RETRIEVE 0x2 /* Retrieval operation */
220 #define ST_CLONE 0x4 /* Deep cloning operation */
223 * The following structure is used for hash table key retrieval. Since, when
224 * retrieving objects, we'll be facing blessed hash references, it's best
225 * to pre-allocate that buffer once and resize it as the need arises, never
226 * freeing it (keys will be saved away someplace else anyway, so even large
227 * keys are not enough a motivation to reclaim that space).
229 * This structure is also used for memory store/retrieve operations which
230 * happen in a fixed place before being malloc'ed elsewhere if persistency
231 * is required. Hence the aptr pointer.
234 char *arena; /* Will hold hash key strings, resized as needed */
235 STRLEN asiz; /* Size of aforementionned buffer */
236 char *aptr; /* Arena pointer, for in-place read/write ops */
237 char *aend; /* First invalid address */
242 * A hash table records the objects which have already been stored.
243 * Those are referred to as SX_OBJECT in the file, and their "tag" (i.e.
244 * an arbitrary sequence number) is used to identify them.
247 * An array table records the objects which have already been retrieved,
248 * as seen by the tag determind by counting the objects themselves. The
249 * reference to that retrieved object is kept in the table, and is returned
250 * when an SX_OBJECT is found bearing that same tag.
252 * The same processing is used to record "classname" for blessed objects:
253 * indexing by a hash at store time, and via an array at retrieve time.
256 typedef unsigned long stag_t; /* Used by pre-0.6 binary format */
259 * The following "thread-safe" related defines were contributed by
260 * Murray Nesbitt <murray@activestate.com> and integrated by RAM, who
261 * only renamed things a little bit to ensure consistency with surrounding
262 * code. -- RAM, 14/09/1999
264 * The original patch suffered from the fact that the stcxt_t structure
265 * was global. Murray tried to minimize the impact on the code as much as
268 * Starting with 0.7, Storable can be re-entrant, via the STORABLE_xxx hooks
269 * on objects. Therefore, the notion of context needs to be generalized,
273 #define MY_VERSION "Storable(" XS_VERSION ")"
276 * Fields s_tainted and s_dirty are prefixed with s_ because Perl's include
277 * files remap tainted and dirty when threading is enabled. That's bad for
278 * perl to remap such common words. -- RAM, 29/09/00
281 typedef struct stcxt {
282 int entry; /* flags recursion */
283 int optype; /* type of traversal operation */
284 HV *hseen; /* which objects have been seen, store time */
285 AV *hook_seen; /* which SVs were returned by STORABLE_freeze() */
286 AV *aseen; /* which objects have been seen, retrieve time */
287 HV *hclass; /* which classnames have been seen, store time */
288 AV *aclass; /* which classnames have been seen, retrieve time */
289 HV *hook; /* cache for hook methods per class name */
290 IV tagnum; /* incremented at store time for each seen object */
291 IV classnum; /* incremented at store time for each seen classname */
292 int netorder; /* true if network order used */
293 int s_tainted; /* true if input source is tainted, at retrieve time */
294 int forgive_me; /* whether to be forgiving... */
295 int canonical; /* whether to store hashes sorted by key */
296 int s_dirty; /* context is dirty due to CROAK() -- can be cleaned */
297 int membuf_ro; /* true means membuf is read-only and msaved is rw */
298 struct extendable keybuf; /* for hash key retrieval */
299 struct extendable membuf; /* for memory store/retrieve operations */
300 struct extendable msaved; /* where potentially valid mbuf is saved */
301 PerlIO *fio; /* where I/O are performed, NULL for memory */
302 int ver_major; /* major of version for retrieved object */
303 int ver_minor; /* minor of version for retrieved object */
304 SV *(**retrieve_vtbl)(); /* retrieve dispatch table */
305 struct stcxt *prev; /* contexts chained backwards in real recursion */
308 #if defined(MULTIPLICITY) || defined(PERL_OBJECT) || defined(PERL_CAPI)
310 #if (PATCHLEVEL <= 4) && (SUBVERSION < 68)
312 SV *perinterp_sv = perl_get_sv(MY_VERSION, FALSE)
313 #else /* >= perl5.004_68 */
315 SV *perinterp_sv = *hv_fetch(PL_modglobal, \
316 MY_VERSION, sizeof(MY_VERSION)-1, TRUE)
317 #endif /* < perl5.004_68 */
319 #define dSTCXT_PTR(T,name) \
320 T name = ((perinterp_sv && SvIOK(perinterp_sv) \
321 ? INT2PTR(T, SvIVX(perinterp_sv)) : (T) 0))
324 dSTCXT_PTR(stcxt_t *, cxt)
328 Newz(0, cxt, 1, stcxt_t); \
329 sv_setiv(perinterp_sv, PTR2IV(cxt))
331 #define SET_STCXT(x) do { \
333 sv_setiv(perinterp_sv, PTR2IV(x)); \
336 #else /* !MULTIPLICITY && !PERL_OBJECT && !PERL_CAPI */
338 static stcxt_t Context;
339 static stcxt_t *Context_ptr = &Context;
340 #define dSTCXT stcxt_t *cxt = Context_ptr
341 #define INIT_STCXT dSTCXT
342 #define SET_STCXT(x) Context_ptr = x
344 #endif /* MULTIPLICITY || PERL_OBJECT || PERL_CAPI */
348 * Croaking implies a memory leak, since we don't use setjmp/longjmp
349 * to catch the exit and free memory used during store or retrieve
350 * operations. This is not too difficult to fix, but I need to understand
351 * how Perl does it, and croaking is exceptional anyway, so I lack the
352 * motivation to do it.
354 * The current workaround is to mark the context as dirty when croaking,
355 * so that data structures can be freed whenever we renter Storable code
356 * (but only *then*: it's a workaround, not a fix).
358 * This is also imperfect, because we don't really know how far they trapped
359 * the croak(), and when we were recursing, we won't be able to clean anything
360 * but the topmost context stacked.
363 #define CROAK(x) do { cxt->s_dirty = 1; croak x; } while (0)
366 * End of "thread-safe" related definitions.
372 * Keep only the low 32 bits of a pointer (used for tags, which are not
377 #define LOW_32BITS(x) ((I32) (x))
379 #define LOW_32BITS(x) ((I32) ((unsigned long) (x) & 0xffffffffUL))
385 * Hack for Crays, where sizeof(I32) == 8, and which are big-endians.
386 * Used in the WLEN and RLEN macros.
390 #define oI(x) ((I32 *) ((char *) (x) + 4))
391 #define oS(x) ((x) - 4)
392 #define oC(x) (x = 0)
401 * key buffer handling
403 #define kbuf (cxt->keybuf).arena
404 #define ksiz (cxt->keybuf).asiz
405 #define KBUFINIT() do { \
407 TRACEME(("** allocating kbuf of 128 bytes")); \
408 New(10003, kbuf, 128, char); \
412 #define KBUFCHK(x) do { \
414 TRACEME(("** extending kbuf to %d bytes (had %d)", x+1, ksiz)); \
415 Renew(kbuf, x+1, char); \
421 * memory buffer handling
423 #define mbase (cxt->membuf).arena
424 #define msiz (cxt->membuf).asiz
425 #define mptr (cxt->membuf).aptr
426 #define mend (cxt->membuf).aend
428 #define MGROW (1 << 13)
429 #define MMASK (MGROW - 1)
431 #define round_mgrow(x) \
432 ((unsigned long) (((unsigned long) (x) + MMASK) & ~MMASK))
433 #define trunc_int(x) \
434 ((unsigned long) ((unsigned long) (x) & ~(sizeof(int)-1)))
435 #define int_aligned(x) \
436 ((unsigned long) (x) == trunc_int(x))
438 #define MBUF_INIT(x) do { \
440 TRACEME(("** allocating mbase of %d bytes", MGROW)); \
441 New(10003, mbase, MGROW, char); \
448 mend = mbase + msiz; \
451 #define MBUF_TRUNC(x) mptr = mbase + x
452 #define MBUF_SIZE() (mptr - mbase)
458 * Those macros are used in do_retrieve() to save the current memory
459 * buffer into cxt->msaved, before MBUF_LOAD() can be used to retrieve
460 * data from a string.
462 #define MBUF_SAVE_AND_LOAD(in) do { \
463 ASSERT(!cxt->membuf_ro, ("mbase not already saved")); \
464 cxt->membuf_ro = 1; \
465 TRACEME(("saving mbuf")); \
466 StructCopy(&cxt->membuf, &cxt->msaved, struct extendable); \
470 #define MBUF_RESTORE() do { \
471 ASSERT(cxt->membuf_ro, ("mbase is read-only")); \
472 cxt->membuf_ro = 0; \
473 TRACEME(("restoring mbuf")); \
474 StructCopy(&cxt->msaved, &cxt->membuf, struct extendable); \
478 * Use SvPOKp(), because SvPOK() fails on tainted scalars.
479 * See store_scalar() for other usage of this workaround.
481 #define MBUF_LOAD(v) do { \
482 ASSERT(cxt->membuf_ro, ("mbase is read-only")); \
484 CROAK(("Not a scalar string")); \
485 mptr = mbase = SvPV(v, msiz); \
486 mend = mbase + msiz; \
489 #define MBUF_XTEND(x) do { \
490 int nsz = (int) round_mgrow((x)+msiz); \
491 int offset = mptr - mbase; \
492 ASSERT(!cxt->membuf_ro, ("mbase is not read-only")); \
493 TRACEME(("** extending mbase from %d to %d bytes (wants %d new)", \
495 Renew(mbase, nsz, char); \
497 mptr = mbase + offset; \
498 mend = mbase + nsz; \
501 #define MBUF_CHK(x) do { \
502 if ((mptr + (x)) > mend) \
506 #define MBUF_GETC(x) do { \
508 x = (int) (unsigned char) *mptr++; \
514 #define MBUF_GETINT(x) do { \
516 if ((mptr + 4) <= mend) { \
517 memcpy(oI(&x), mptr, 4); \
523 #define MBUF_GETINT(x) do { \
524 if ((mptr + sizeof(int)) <= mend) { \
525 if (int_aligned(mptr)) \
528 memcpy(&x, mptr, sizeof(int)); \
529 mptr += sizeof(int); \
535 #define MBUF_READ(x,s) do { \
536 if ((mptr + (s)) <= mend) { \
537 memcpy(x, mptr, s); \
543 #define MBUF_SAFEREAD(x,s,z) do { \
544 if ((mptr + (s)) <= mend) { \
545 memcpy(x, mptr, s); \
553 #define MBUF_PUTC(c) do { \
555 *mptr++ = (char) c; \
558 *mptr++ = (char) c; \
563 #define MBUF_PUTINT(i) do { \
565 memcpy(mptr, oI(&i), 4); \
569 #define MBUF_PUTINT(i) do { \
570 MBUF_CHK(sizeof(int)); \
571 if (int_aligned(mptr)) \
574 memcpy(mptr, &i, sizeof(int)); \
575 mptr += sizeof(int); \
579 #define MBUF_WRITE(x,s) do { \
581 memcpy(mptr, x, s); \
586 * Possible return values for sv_type().
590 #define svis_SCALAR 1
594 #define svis_TIED_ITEM 5
601 #define SHF_TYPE_MASK 0x03
602 #define SHF_LARGE_CLASSLEN 0x04
603 #define SHF_LARGE_STRLEN 0x08
604 #define SHF_LARGE_LISTLEN 0x10
605 #define SHF_IDX_CLASSNAME 0x20
606 #define SHF_NEED_RECURSE 0x40
607 #define SHF_HAS_LIST 0x80
610 * Types for SX_HOOK (last 2 bits in flags).
616 #define SHT_EXTRA 3 /* Read extra byte for type */
619 * The following are held in the "extra byte"...
622 #define SHT_TSCALAR 4 /* 4 + 0 -- tied scalar */
623 #define SHT_TARRAY 5 /* 4 + 1 -- tied array */
624 #define SHT_THASH 6 /* 4 + 2 -- tied hash */
627 * per hash flags for flagged hashes
630 #define SHV_RESTRICTED 0x01
633 * per key flags for flagged hashes
636 #define SHV_K_UTF8 0x01
637 #define SHV_K_WASUTF8 0x02
638 #define SHV_K_LOCKED 0x04
639 #define SHV_K_ISSV 0x08
640 #define SHV_K_PLACEHOLDER 0x10
643 * Before 0.6, the magic string was "perl-store" (binary version number 0).
645 * Since 0.6 introduced many binary incompatibilities, the magic string has
646 * been changed to "pst0" to allow an old image to be properly retrieved by
647 * a newer Storable, but ensure a newer image cannot be retrieved with an
650 * At 0.7, objects are given the ability to serialize themselves, and the
651 * set of markers is extended, backward compatibility is not jeopardized,
652 * so the binary version number could have remained unchanged. To correctly
653 * spot errors if a file making use of 0.7-specific extensions is given to
654 * 0.6 for retrieval, the binary version was moved to "2". And I'm introducing
655 * a "minor" version, to better track this kind of evolution from now on.
658 static char old_magicstr[] = "perl-store"; /* Magic number before 0.6 */
659 static char magicstr[] = "pst0"; /* Used as a magic number */
661 #define STORABLE_BIN_MAJOR 2 /* Binary major "version" */
662 #if (PATCHLEVEL <= 6)
663 #define STORABLE_BIN_MINOR 4 /* Binary minor "version" */
666 * As of perl 5.7.3, utf8 hash key is introduced.
667 * So this must change -- dankogai
669 #define STORABLE_BIN_MINOR 5 /* Binary minor "version" */
670 #endif /* (PATCHLEVEL <= 6) */
673 * Useful store shortcuts...
676 #define PUTMARK(x) do { \
679 else if (PerlIO_putc(cxt->fio, x) == EOF) \
683 #define WRITE_I32(x) do { \
684 ASSERT(sizeof(x) == sizeof(I32), ("writing an I32")); \
687 else if (PerlIO_write(cxt->fio, oI(&x), oS(sizeof(x))) != oS(sizeof(x))) \
692 #define WLEN(x) do { \
693 if (cxt->netorder) { \
694 int y = (int) htonl(x); \
697 else if (PerlIO_write(cxt->fio,oI(&y),oS(sizeof(y))) != oS(sizeof(y))) \
702 else if (PerlIO_write(cxt->fio,oI(&x),oS(sizeof(x))) != oS(sizeof(x))) \
707 #define WLEN(x) WRITE_I32(x)
710 #define WRITE(x,y) do { \
713 else if (PerlIO_write(cxt->fio, x, y) != y) \
717 #define STORE_PV_LEN(pv, len, small, large) do { \
718 if (len <= LG_SCALAR) { \
719 unsigned char clen = (unsigned char) len; \
731 #define STORE_SCALAR(pv, len) STORE_PV_LEN(pv, len, SX_SCALAR, SX_LSCALAR)
734 * Conditional UTF8 support.
735 * On non-UTF8 perls, UTF8 strings are returned as normal strings.
739 #define STORE_UTF8STR(pv, len) STORE_PV_LEN(pv, len, SX_UTF8STR, SX_LUTF8STR)
742 #define STORE_UTF8STR(pv, len) CROAK(("panic: storing UTF8 in non-UTF8 perl"))
743 #define SvUTF8_on(sv) CROAK(("Cannot retrieve UTF8 data in non-UTF8 perl"))
747 * Store undef in arrays and hashes without recursing through store().
749 #define STORE_UNDEF() do { \
755 * Useful retrieve shortcuts...
759 (cxt->fio ? PerlIO_getc(cxt->fio) : (mptr >= mend ? EOF : (int) *mptr++))
761 #define GETMARK(x) do { \
764 else if ((int) (x = PerlIO_getc(cxt->fio)) == EOF) \
768 #define READ_I32(x) do { \
769 ASSERT(sizeof(x) == sizeof(I32), ("reading an I32")); \
773 else if (PerlIO_read(cxt->fio, oI(&x), oS(sizeof(x))) != oS(sizeof(x))) \
778 #define RLEN(x) do { \
782 else if (PerlIO_read(cxt->fio, oI(&x), oS(sizeof(x))) != oS(sizeof(x))) \
785 x = (int) ntohl(x); \
788 #define RLEN(x) READ_I32(x)
791 #define READ(x,y) do { \
794 else if (PerlIO_read(cxt->fio, x, y) != y) \
798 #define SAFEREAD(x,y,z) do { \
800 MBUF_SAFEREAD(x,y,z); \
801 else if (PerlIO_read(cxt->fio, x, y) != y) { \
808 * This macro is used at retrieve time, to remember where object 'y', bearing a
809 * given tag 'tagnum', has been retrieved. Next time we see an SX_OBJECT marker,
810 * we'll therefore know where it has been retrieved and will be able to
811 * share the same reference, as in the original stored memory image.
813 * We also need to bless objects ASAP for hooks (which may compute "ref $x"
814 * on the objects given to STORABLE_thaw and expect that to be defined), and
815 * also for overloaded objects (for which we might not find the stash if the
816 * object is not blessed yet--this might occur for overloaded objects that
817 * refer to themselves indirectly: if we blessed upon return from a sub
818 * retrieve(), the SX_OBJECT marker we'd found could not have overloading
819 * restored on it because the underlying object would not be blessed yet!).
821 * To achieve that, the class name of the last retrieved object is passed down
822 * recursively, and the first SEEN() call for which the class name is not NULL
823 * will bless the object.
825 #define SEEN(y,c) do { \
828 if (av_store(cxt->aseen, cxt->tagnum++, SvREFCNT_inc(y)) == 0) \
830 TRACEME(("aseen(#%d) = 0x%"UVxf" (refcnt=%d)", cxt->tagnum-1, \
831 PTR2UV(y), SvREFCNT(y)-1)); \
833 BLESS((SV *) (y), c); \
837 * Bless `s' in `p', via a temporary reference, required by sv_bless().
839 #define BLESS(s,p) do { \
842 TRACEME(("blessing 0x%"UVxf" in %s", PTR2UV(s), (p))); \
843 stash = gv_stashpv((p), TRUE); \
844 ref = newRV_noinc(s); \
845 (void) sv_bless(ref, stash); \
851 static SV *retrieve(stcxt_t *cxt, char *cname);
854 * Dynamic dispatching table for SV store.
857 static int store_ref(stcxt_t *cxt, SV *sv);
858 static int store_scalar(stcxt_t *cxt, SV *sv);
859 static int store_array(stcxt_t *cxt, AV *av);
860 static int store_hash(stcxt_t *cxt, HV *hv);
861 static int store_tied(stcxt_t *cxt, SV *sv);
862 static int store_tied_item(stcxt_t *cxt, SV *sv);
863 static int store_other(stcxt_t *cxt, SV *sv);
864 static int store_blessed(stcxt_t *cxt, SV *sv, int type, HV *pkg);
866 static int (*sv_store[])(stcxt_t *cxt, SV *sv) = {
867 store_ref, /* svis_REF */
868 store_scalar, /* svis_SCALAR */
869 (int (*)(stcxt_t *cxt, SV *sv)) store_array, /* svis_ARRAY */
870 (int (*)(stcxt_t *cxt, SV *sv)) store_hash, /* svis_HASH */
871 store_tied, /* svis_TIED */
872 store_tied_item, /* svis_TIED_ITEM */
873 store_other, /* svis_OTHER */
876 #define SV_STORE(x) (*sv_store[x])
879 * Dynamic dispatching tables for SV retrieval.
882 static SV *retrieve_lscalar(stcxt_t *cxt, char *cname);
883 static SV *retrieve_lutf8str(stcxt_t *cxt, char *cname);
884 static SV *old_retrieve_array(stcxt_t *cxt, char *cname);
885 static SV *old_retrieve_hash(stcxt_t *cxt, char *cname);
886 static SV *retrieve_ref(stcxt_t *cxt, char *cname);
887 static SV *retrieve_undef(stcxt_t *cxt, char *cname);
888 static SV *retrieve_integer(stcxt_t *cxt, char *cname);
889 static SV *retrieve_double(stcxt_t *cxt, char *cname);
890 static SV *retrieve_byte(stcxt_t *cxt, char *cname);
891 static SV *retrieve_netint(stcxt_t *cxt, char *cname);
892 static SV *retrieve_scalar(stcxt_t *cxt, char *cname);
893 static SV *retrieve_utf8str(stcxt_t *cxt, char *cname);
894 static SV *retrieve_tied_array(stcxt_t *cxt, char *cname);
895 static SV *retrieve_tied_hash(stcxt_t *cxt, char *cname);
896 static SV *retrieve_tied_scalar(stcxt_t *cxt, char *cname);
897 static SV *retrieve_other(stcxt_t *cxt, char *cname);
899 static SV *(*sv_old_retrieve[])(stcxt_t *cxt, char *cname) = {
900 0, /* SX_OBJECT -- entry unused dynamically */
901 retrieve_lscalar, /* SX_LSCALAR */
902 old_retrieve_array, /* SX_ARRAY -- for pre-0.6 binaries */
903 old_retrieve_hash, /* SX_HASH -- for pre-0.6 binaries */
904 retrieve_ref, /* SX_REF */
905 retrieve_undef, /* SX_UNDEF */
906 retrieve_integer, /* SX_INTEGER */
907 retrieve_double, /* SX_DOUBLE */
908 retrieve_byte, /* SX_BYTE */
909 retrieve_netint, /* SX_NETINT */
910 retrieve_scalar, /* SX_SCALAR */
911 retrieve_tied_array, /* SX_ARRAY */
912 retrieve_tied_hash, /* SX_HASH */
913 retrieve_tied_scalar, /* SX_SCALAR */
914 retrieve_other, /* SX_SV_UNDEF not supported */
915 retrieve_other, /* SX_SV_YES not supported */
916 retrieve_other, /* SX_SV_NO not supported */
917 retrieve_other, /* SX_BLESS not supported */
918 retrieve_other, /* SX_IX_BLESS not supported */
919 retrieve_other, /* SX_HOOK not supported */
920 retrieve_other, /* SX_OVERLOADED not supported */
921 retrieve_other, /* SX_TIED_KEY not supported */
922 retrieve_other, /* SX_TIED_IDX not supported */
923 retrieve_other, /* SX_UTF8STR not supported */
924 retrieve_other, /* SX_LUTF8STR not supported */
925 retrieve_other, /* SX_FLAG_HASH not supported */
926 retrieve_other, /* SX_ERROR */
929 static SV *retrieve_array(stcxt_t *cxt, char *cname);
930 static SV *retrieve_hash(stcxt_t *cxt, char *cname);
931 static SV *retrieve_sv_undef(stcxt_t *cxt, char *cname);
932 static SV *retrieve_sv_yes(stcxt_t *cxt, char *cname);
933 static SV *retrieve_sv_no(stcxt_t *cxt, char *cname);
934 static SV *retrieve_blessed(stcxt_t *cxt, char *cname);
935 static SV *retrieve_idx_blessed(stcxt_t *cxt, char *cname);
936 static SV *retrieve_hook(stcxt_t *cxt, char *cname);
937 static SV *retrieve_overloaded(stcxt_t *cxt, char *cname);
938 static SV *retrieve_tied_key(stcxt_t *cxt, char *cname);
939 static SV *retrieve_tied_idx(stcxt_t *cxt, char *cname);
940 static SV *retrieve_flag_hash(stcxt_t *cxt, char *cname);
942 static SV *(*sv_retrieve[])(stcxt_t *cxt, char *cname) = {
943 0, /* SX_OBJECT -- entry unused dynamically */
944 retrieve_lscalar, /* SX_LSCALAR */
945 retrieve_array, /* SX_ARRAY */
946 retrieve_hash, /* SX_HASH */
947 retrieve_ref, /* SX_REF */
948 retrieve_undef, /* SX_UNDEF */
949 retrieve_integer, /* SX_INTEGER */
950 retrieve_double, /* SX_DOUBLE */
951 retrieve_byte, /* SX_BYTE */
952 retrieve_netint, /* SX_NETINT */
953 retrieve_scalar, /* SX_SCALAR */
954 retrieve_tied_array, /* SX_ARRAY */
955 retrieve_tied_hash, /* SX_HASH */
956 retrieve_tied_scalar, /* SX_SCALAR */
957 retrieve_sv_undef, /* SX_SV_UNDEF */
958 retrieve_sv_yes, /* SX_SV_YES */
959 retrieve_sv_no, /* SX_SV_NO */
960 retrieve_blessed, /* SX_BLESS */
961 retrieve_idx_blessed, /* SX_IX_BLESS */
962 retrieve_hook, /* SX_HOOK */
963 retrieve_overloaded, /* SX_OVERLOAD */
964 retrieve_tied_key, /* SX_TIED_KEY */
965 retrieve_tied_idx, /* SX_TIED_IDX */
966 retrieve_utf8str, /* SX_UTF8STR */
967 retrieve_lutf8str, /* SX_LUTF8STR */
968 retrieve_flag_hash, /* SX_HASH */
969 retrieve_other, /* SX_ERROR */
972 #define RETRIEVE(c,x) (*(c)->retrieve_vtbl[(x) >= SX_ERROR ? SX_ERROR : (x)])
974 static SV *mbuf2sv(void);
977 *** Context management.
983 * Called once per "thread" (interpreter) to initialize some global context.
985 static void init_perinterp(void)
989 cxt->netorder = 0; /* true if network order used */
990 cxt->forgive_me = -1; /* whether to be forgiving... */
996 * Called at the end of every context cleaning, to perform common reset
999 static void reset_context(stcxt_t *cxt)
1003 cxt->optype &= ~(ST_STORE|ST_RETRIEVE); /* Leave ST_CLONE alone */
1007 * init_store_context
1009 * Initialize a new store context for real recursion.
1011 static void init_store_context(
1017 TRACEME(("init_store_context"));
1019 cxt->netorder = network_order;
1020 cxt->forgive_me = -1; /* Fetched from perl if needed */
1021 cxt->canonical = -1; /* Idem */
1022 cxt->tagnum = -1; /* Reset tag numbers */
1023 cxt->classnum = -1; /* Reset class numbers */
1024 cxt->fio = f; /* Where I/O are performed */
1025 cxt->optype = optype; /* A store, or a deep clone */
1026 cxt->entry = 1; /* No recursion yet */
1029 * The `hseen' table is used to keep track of each SV stored and their
1030 * associated tag numbers is special. It is "abused" because the
1031 * values stored are not real SV, just integers cast to (SV *),
1032 * which explains the freeing below.
1034 * It is also one possible bottlneck to achieve good storing speed,
1035 * so the "shared keys" optimization is turned off (unlikely to be
1036 * of any use here), and the hash table is "pre-extended". Together,
1037 * those optimizations increase the throughput by 12%.
1040 cxt->hseen = newHV(); /* Table where seen objects are stored */
1041 HvSHAREKEYS_off(cxt->hseen);
1044 * The following does not work well with perl5.004_04, and causes
1045 * a core dump later on, in a completely unrelated spot, which
1046 * makes me think there is a memory corruption going on.
1048 * Calling hv_ksplit(hseen, HBUCKETS) instead of manually hacking
1049 * it below does not make any difference. It seems to work fine
1050 * with perl5.004_68 but given the probable nature of the bug,
1051 * that does not prove anything.
1053 * It's a shame because increasing the amount of buckets raises
1054 * store() throughput by 5%, but until I figure this out, I can't
1055 * allow for this to go into production.
1057 * It is reported fixed in 5.005, hence the #if.
1059 #if PERL_VERSION >= 5
1060 #define HBUCKETS 4096 /* Buckets for %hseen */
1061 HvMAX(cxt->hseen) = HBUCKETS - 1; /* keys %hseen = $HBUCKETS; */
1065 * The `hclass' hash uses the same settings as `hseen' above, but it is
1066 * used to assign sequential tags (numbers) to class names for blessed
1069 * We turn the shared key optimization on.
1072 cxt->hclass = newHV(); /* Where seen classnames are stored */
1074 #if PERL_VERSION >= 5
1075 HvMAX(cxt->hclass) = HBUCKETS - 1; /* keys %hclass = $HBUCKETS; */
1079 * The `hook' hash table is used to keep track of the references on
1080 * the STORABLE_freeze hook routines, when found in some class name.
1082 * It is assumed that the inheritance tree will not be changed during
1083 * storing, and that no new method will be dynamically created by the
1087 cxt->hook = newHV(); /* Table where hooks are cached */
1090 * The `hook_seen' array keeps track of all the SVs returned by
1091 * STORABLE_freeze hooks for us to serialize, so that they are not
1092 * reclaimed until the end of the serialization process. Each SV is
1093 * only stored once, the first time it is seen.
1096 cxt->hook_seen = newAV(); /* Lists SVs returned by STORABLE_freeze */
1100 * clean_store_context
1102 * Clean store context by
1104 static void clean_store_context(stcxt_t *cxt)
1108 TRACEME(("clean_store_context"));
1110 ASSERT(cxt->optype & ST_STORE, ("was performing a store()"));
1113 * Insert real values into hashes where we stored faked pointers.
1117 hv_iterinit(cxt->hseen);
1118 while ((he = hv_iternext(cxt->hseen))) /* Extra () for -Wall, grr.. */
1119 HeVAL(he) = &PL_sv_undef;
1123 hv_iterinit(cxt->hclass);
1124 while ((he = hv_iternext(cxt->hclass))) /* Extra () for -Wall, grr.. */
1125 HeVAL(he) = &PL_sv_undef;
1129 * And now dispose of them...
1131 * The surrounding if() protection has been added because there might be
1132 * some cases where this routine is called more than once, during
1133 * exceptionnal events. This was reported by Marc Lehmann when Storable
1134 * is executed from mod_perl, and the fix was suggested by him.
1135 * -- RAM, 20/12/2000
1139 HV *hseen = cxt->hseen;
1142 sv_free((SV *) hseen);
1146 HV *hclass = cxt->hclass;
1149 sv_free((SV *) hclass);
1153 HV *hook = cxt->hook;
1156 sv_free((SV *) hook);
1159 if (cxt->hook_seen) {
1160 AV *hook_seen = cxt->hook_seen;
1162 av_undef(hook_seen);
1163 sv_free((SV *) hook_seen);
1170 * init_retrieve_context
1172 * Initialize a new retrieve context for real recursion.
1174 static void init_retrieve_context(stcxt_t *cxt, int optype, int is_tainted)
1176 TRACEME(("init_retrieve_context"));
1179 * The hook hash table is used to keep track of the references on
1180 * the STORABLE_thaw hook routines, when found in some class name.
1182 * It is assumed that the inheritance tree will not be changed during
1183 * storing, and that no new method will be dynamically created by the
1187 cxt->hook = newHV(); /* Caches STORABLE_thaw */
1190 * If retrieving an old binary version, the cxt->retrieve_vtbl variable
1191 * was set to sv_old_retrieve. We'll need a hash table to keep track of
1192 * the correspondance between the tags and the tag number used by the
1193 * new retrieve routines.
1196 cxt->hseen = ((cxt->retrieve_vtbl == sv_old_retrieve) ? newHV() : 0);
1198 cxt->aseen = newAV(); /* Where retrieved objects are kept */
1199 cxt->aclass = newAV(); /* Where seen classnames are kept */
1200 cxt->tagnum = 0; /* Have to count objects... */
1201 cxt->classnum = 0; /* ...and class names as well */
1202 cxt->optype = optype;
1203 cxt->s_tainted = is_tainted;
1204 cxt->entry = 1; /* No recursion yet */
1208 * clean_retrieve_context
1210 * Clean retrieve context by
1212 static void clean_retrieve_context(stcxt_t *cxt)
1214 TRACEME(("clean_retrieve_context"));
1216 ASSERT(cxt->optype & ST_RETRIEVE, ("was performing a retrieve()"));
1219 AV *aseen = cxt->aseen;
1222 sv_free((SV *) aseen);
1226 AV *aclass = cxt->aclass;
1229 sv_free((SV *) aclass);
1233 HV *hook = cxt->hook;
1236 sv_free((SV *) hook);
1240 HV *hseen = cxt->hseen;
1243 sv_free((SV *) hseen); /* optional HV, for backward compat. */
1252 * A workaround for the CROAK bug: cleanup the last context.
1254 static void clean_context(stcxt_t *cxt)
1256 TRACEME(("clean_context"));
1258 ASSERT(cxt->s_dirty, ("dirty context"));
1263 ASSERT(!cxt->membuf_ro, ("mbase is not read-only"));
1265 if (cxt->optype & ST_RETRIEVE)
1266 clean_retrieve_context(cxt);
1267 else if (cxt->optype & ST_STORE)
1268 clean_store_context(cxt);
1272 ASSERT(!cxt->s_dirty, ("context is clean"));
1273 ASSERT(cxt->entry == 0, ("context is reset"));
1279 * Allocate a new context and push it on top of the parent one.
1280 * This new context is made globally visible via SET_STCXT().
1282 static stcxt_t *allocate_context(parent_cxt)
1283 stcxt_t *parent_cxt;
1287 TRACEME(("allocate_context"));
1289 ASSERT(!parent_cxt->s_dirty, ("parent context clean"));
1291 Newz(0, cxt, 1, stcxt_t);
1292 cxt->prev = parent_cxt;
1295 ASSERT(!cxt->s_dirty, ("clean context"));
1303 * Free current context, which cannot be the "root" one.
1304 * Make the context underneath globally visible via SET_STCXT().
1306 static void free_context(cxt)
1309 stcxt_t *prev = cxt->prev;
1311 TRACEME(("free_context"));
1313 ASSERT(!cxt->s_dirty, ("clean context"));
1314 ASSERT(prev, ("not freeing root context"));
1324 ASSERT(cxt, ("context not void"));
1334 * Tells whether we're in the middle of a store operation.
1336 int is_storing(void)
1340 return cxt->entry && (cxt->optype & ST_STORE);
1346 * Tells whether we're in the middle of a retrieve operation.
1348 int is_retrieving(void)
1352 return cxt->entry && (cxt->optype & ST_RETRIEVE);
1356 * last_op_in_netorder
1358 * Returns whether last operation was made using network order.
1360 * This is typically out-of-band information that might prove useful
1361 * to people wishing to convert native to network order data when used.
1363 int last_op_in_netorder(void)
1367 return cxt->netorder;
1371 *** Hook lookup and calling routines.
1377 * A wrapper on gv_fetchmethod_autoload() which caches results.
1379 * Returns the routine reference as an SV*, or null if neither the package
1380 * nor its ancestors know about the method.
1382 static SV *pkg_fetchmeth(
1391 * The following code is the same as the one performed by UNIVERSAL::can
1395 gv = gv_fetchmethod_autoload(pkg, method, FALSE);
1396 if (gv && isGV(gv)) {
1397 sv = newRV((SV*) GvCV(gv));
1398 TRACEME(("%s->%s: 0x%"UVxf, HvNAME(pkg), method, PTR2UV(sv)));
1400 sv = newSVsv(&PL_sv_undef);
1401 TRACEME(("%s->%s: not found", HvNAME(pkg), method));
1405 * Cache the result, ignoring failure: if we can't store the value,
1406 * it just won't be cached.
1409 (void) hv_store(cache, HvNAME(pkg), strlen(HvNAME(pkg)), sv, 0);
1411 return SvOK(sv) ? sv : (SV *) 0;
1417 * Force cached value to be undef: hook ignored even if present.
1419 static void pkg_hide(
1424 (void) hv_store(cache,
1425 HvNAME(pkg), strlen(HvNAME(pkg)), newSVsv(&PL_sv_undef), 0);
1431 * Discard cached value: a whole fetch loop will be retried at next lookup.
1433 static void pkg_uncache(
1438 (void) hv_delete(cache, HvNAME(pkg), strlen(HvNAME(pkg)), G_DISCARD);
1444 * Our own "UNIVERSAL::can", which caches results.
1446 * Returns the routine reference as an SV*, or null if the object does not
1447 * know about the method.
1457 TRACEME(("pkg_can for %s->%s", HvNAME(pkg), method));
1460 * Look into the cache to see whether we already have determined
1461 * where the routine was, if any.
1463 * NOTA BENE: we don't use `method' at all in our lookup, since we know
1464 * that only one hook (i.e. always the same) is cached in a given cache.
1467 svh = hv_fetch(cache, HvNAME(pkg), strlen(HvNAME(pkg)), FALSE);
1471 TRACEME(("cached %s->%s: not found", HvNAME(pkg), method));
1474 TRACEME(("cached %s->%s: 0x%"UVxf,
1475 HvNAME(pkg), method, PTR2UV(sv)));
1480 TRACEME(("not cached yet"));
1481 return pkg_fetchmeth(cache, pkg, method); /* Fetch and cache */
1487 * Call routine as obj->hook(av) in scalar context.
1488 * Propagates the single returned value if not called in void context.
1490 static SV *scalar_call(
1501 TRACEME(("scalar_call (cloning=%d)", cloning));
1508 XPUSHs(sv_2mortal(newSViv(cloning))); /* Cloning flag */
1510 SV **ary = AvARRAY(av);
1511 int cnt = AvFILLp(av) + 1;
1513 XPUSHs(ary[0]); /* Frozen string */
1514 for (i = 1; i < cnt; i++) {
1515 TRACEME(("pushing arg #%d (0x%"UVxf")...",
1516 i, PTR2UV(ary[i])));
1517 XPUSHs(sv_2mortal(newRV(ary[i])));
1522 TRACEME(("calling..."));
1523 count = perl_call_sv(hook, flags); /* Go back to Perl code */
1524 TRACEME(("count = %d", count));
1530 SvREFCNT_inc(sv); /* We're returning it, must stay alive! */
1543 * Call routine obj->hook(cloning) in list context.
1544 * Returns the list of returned values in an array.
1546 static AV *array_call(
1556 TRACEME(("array_call (cloning=%d)", cloning));
1562 XPUSHs(obj); /* Target object */
1563 XPUSHs(sv_2mortal(newSViv(cloning))); /* Cloning flag */
1566 count = perl_call_sv(hook, G_ARRAY); /* Go back to Perl code */
1571 for (i = count - 1; i >= 0; i--) {
1573 av_store(av, i, SvREFCNT_inc(sv));
1586 * Lookup the class name in the `hclass' table and either assign it a new ID
1587 * or return the existing one, by filling in `classnum'.
1589 * Return true if the class was known, false if the ID was just generated.
1591 static int known_class(
1593 char *name, /* Class name */
1594 int len, /* Name length */
1598 HV *hclass = cxt->hclass;
1600 TRACEME(("known_class (%s)", name));
1603 * Recall that we don't store pointers in this hash table, but tags.
1604 * Therefore, we need LOW_32BITS() to extract the relevant parts.
1607 svh = hv_fetch(hclass, name, len, FALSE);
1609 *classnum = LOW_32BITS(*svh);
1614 * Unknown classname, we need to record it.
1618 if (!hv_store(hclass, name, len, INT2PTR(SV*, cxt->classnum), 0))
1619 CROAK(("Unable to record new classname"));
1621 *classnum = cxt->classnum;
1626 *** Sepcific store routines.
1632 * Store a reference.
1633 * Layout is SX_REF <object> or SX_OVERLOAD <object>.
1635 static int store_ref(stcxt_t *cxt, SV *sv)
1637 TRACEME(("store_ref (0x%"UVxf")", PTR2UV(sv)));
1640 * Follow reference, and check if target is overloaded.
1646 HV *stash = (HV *) SvSTASH(sv);
1647 if (stash && Gv_AMG(stash)) {
1648 TRACEME(("ref (0x%"UVxf") is overloaded", PTR2UV(sv)));
1649 PUTMARK(SX_OVERLOAD);
1655 return store(cxt, sv);
1663 * Layout is SX_LSCALAR <length> <data>, SX_SCALAR <length> <data> or SX_UNDEF.
1664 * The <data> section is omitted if <length> is 0.
1666 * If integer or double, the layout is SX_INTEGER <data> or SX_DOUBLE <data>.
1667 * Small integers (within [-127, +127]) are stored as SX_BYTE <byte>.
1669 static int store_scalar(stcxt_t *cxt, SV *sv)
1674 U32 flags = SvFLAGS(sv); /* "cc -O" may put it in register */
1676 TRACEME(("store_scalar (0x%"UVxf")", PTR2UV(sv)));
1679 * For efficiency, break the SV encapsulation by peaking at the flags
1680 * directly without using the Perl macros to avoid dereferencing
1681 * sv->sv_flags each time we wish to check the flags.
1684 if (!(flags & SVf_OK)) { /* !SvOK(sv) */
1685 if (sv == &PL_sv_undef) {
1686 TRACEME(("immortal undef"));
1687 PUTMARK(SX_SV_UNDEF);
1689 TRACEME(("undef at 0x%"UVxf, PTR2UV(sv)));
1696 * Always store the string representation of a scalar if it exists.
1697 * Gisle Aas provided me with this test case, better than a long speach:
1699 * perl -MDevel::Peek -le '$a="abc"; $a+0; Dump($a)'
1700 * SV = PVNV(0x80c8520)
1702 * FLAGS = (NOK,POK,pNOK,pPOK)
1705 * PV = 0x80c83d0 "abc"\0
1709 * Write SX_SCALAR, length, followed by the actual data.
1711 * Otherwise, write an SX_BYTE, SX_INTEGER or an SX_DOUBLE as
1712 * appropriate, followed by the actual (binary) data. A double
1713 * is written as a string if network order, for portability.
1715 * NOTE: instead of using SvNOK(sv), we test for SvNOKp(sv).
1716 * The reason is that when the scalar value is tainted, the SvNOK(sv)
1719 * The test for a read-only scalar with both POK and NOK set is meant
1720 * to quickly detect &PL_sv_yes and &PL_sv_no without having to pay the
1721 * address comparison for each scalar we store.
1724 #define SV_MAYBE_IMMORTAL (SVf_READONLY|SVf_POK|SVf_NOK)
1726 if ((flags & SV_MAYBE_IMMORTAL) == SV_MAYBE_IMMORTAL) {
1727 if (sv == &PL_sv_yes) {
1728 TRACEME(("immortal yes"));
1730 } else if (sv == &PL_sv_no) {
1731 TRACEME(("immortal no"));
1734 pv = SvPV(sv, len); /* We know it's SvPOK */
1735 goto string; /* Share code below */
1737 } else if (flags & SVp_POK) { /* SvPOKp(sv) => string */
1738 I32 wlen; /* For 64-bit machines */
1742 * Will come here from below with pv and len set if double & netorder,
1743 * or from above if it was readonly, POK and NOK but neither &PL_sv_yes
1748 wlen = (I32) len; /* WLEN via STORE_SCALAR expects I32 */
1750 STORE_UTF8STR(pv, wlen);
1752 STORE_SCALAR(pv, wlen);
1753 TRACEME(("ok (scalar 0x%"UVxf" '%s', length = %"IVdf")",
1754 PTR2UV(sv), SvPVX(sv), (IV)len));
1756 } else if (flags & SVp_NOK) { /* SvNOKp(sv) => double */
1760 * Watch for number being an integer in disguise.
1762 if (nv == (NV) (iv = I_V(nv))) {
1763 TRACEME(("double %"NVff" is actually integer %"IVdf, nv, iv));
1764 goto integer; /* Share code below */
1767 if (cxt->netorder) {
1768 TRACEME(("double %"NVff" stored as string", nv));
1770 goto string; /* Share code above */
1774 WRITE(&nv, sizeof(nv));
1776 TRACEME(("ok (double 0x%"UVxf", value = %"NVff")", PTR2UV(sv), nv));
1778 } else if (flags & SVp_IOK) { /* SvIOKp(sv) => integer */
1782 * Will come here from above with iv set if double is an integer.
1787 * Optimize small integers into a single byte, otherwise store as
1788 * a real integer (converted into network order if they asked).
1791 if (iv >= -128 && iv <= 127) {
1792 unsigned char siv = (unsigned char) (iv + 128); /* [0,255] */
1795 TRACEME(("small integer stored as %d", siv));
1796 } else if (cxt->netorder) {
1799 niv = (I32) htonl(iv);
1800 TRACEME(("using network order"));
1803 TRACEME(("as-is for network order"));
1808 PUTMARK(SX_INTEGER);
1809 WRITE(&iv, sizeof(iv));
1812 TRACEME(("ok (integer 0x%"UVxf", value = %"IVdf")", PTR2UV(sv), iv));
1815 CROAK(("Can't determine type of %s(0x%"UVxf")",
1816 sv_reftype(sv, FALSE),
1819 return 0; /* Ok, no recursion on scalars */
1827 * Layout is SX_ARRAY <size> followed by each item, in increading index order.
1828 * Each item is stored as <object>.
1830 static int store_array(stcxt_t *cxt, AV *av)
1833 I32 len = av_len(av) + 1;
1837 TRACEME(("store_array (0x%"UVxf")", PTR2UV(av)));
1840 * Signal array by emitting SX_ARRAY, followed by the array length.
1845 TRACEME(("size = %d", len));
1848 * Now store each item recursively.
1851 for (i = 0; i < len; i++) {
1852 sav = av_fetch(av, i, 0);
1854 TRACEME(("(#%d) undef item", i));
1858 TRACEME(("(#%d) item", i));
1859 if ((ret = store(cxt, *sav))) /* Extra () for -Wall, grr... */
1863 TRACEME(("ok (array)"));
1872 * Borrowed from perl source file pp_ctl.c, where it is used by pp_sort.
1875 sortcmp(const void *a, const void *b)
1877 return sv_cmp(*(SV * const *) a, *(SV * const *) b);
1884 * Store a hash table.
1886 * For a "normal" hash (not restricted, no utf8 keys):
1888 * Layout is SX_HASH <size> followed by each key/value pair, in random order.
1889 * Values are stored as <object>.
1890 * Keys are stored as <length> <data>, the <data> section being omitted
1893 * For a "fancy" hash (restricted or utf8 keys):
1895 * Layout is SX_FLAG_HASH <size> <hash flags> followed by each key/value pair,
1897 * Values are stored as <object>.
1898 * Keys are stored as <flags> <length> <data>, the <data> section being omitted
1900 * Currently the only hash flag is "restriced"
1901 * Key flags are as for hv.h
1903 static int store_hash(stcxt_t *cxt, HV *hv)
1905 I32 len = HvTOTALKEYS(hv);
1910 int flagged_hash = ((SvREADONLY(hv) || HvHASKFLAGS(hv)) ? 1 : 0);
1911 unsigned char hash_flags = (SvREADONLY(hv) ? SHV_RESTRICTED : 0);
1914 /* needs int cast for C++ compilers, doesn't it? */
1915 TRACEME(("store_hash (0x%"UVxf") (flags %x)", PTR2UV(hv),
1918 TRACEME(("store_hash (0x%"UVxf")", PTR2UV(hv)));
1922 * Signal hash by emitting SX_HASH, followed by the table length.
1926 PUTMARK(SX_FLAG_HASH);
1927 PUTMARK(hash_flags);
1932 TRACEME(("size = %d", len));
1935 * Save possible iteration state via each() on that table.
1938 riter = HvRITER(hv);
1939 eiter = HvEITER(hv);
1943 * Now store each item recursively.
1945 * If canonical is defined to some true value then store each
1946 * key/value pair in sorted order otherwise the order is random.
1947 * Canonical order is irrelevant when a deep clone operation is performed.
1949 * Fetch the value from perl only once per store() operation, and only
1954 !(cxt->optype & ST_CLONE) && (cxt->canonical == 1 ||
1955 (cxt->canonical < 0 && (cxt->canonical =
1956 (SvTRUE(perl_get_sv("Storable::canonical", TRUE)) ? 1 : 0))))
1959 * Storing in order, sorted by key.
1960 * Run through the hash, building up an array of keys in a
1961 * mortal array, sort the array and then run through the
1967 /*av_extend (av, len);*/
1969 TRACEME(("using canonical order"));
1971 for (i = 0; i < len; i++) {
1972 HE *he = hv_iternext_flags(hv, HV_ITERNEXT_WANTPLACEHOLDERS);
1973 SV *key = hv_iterkeysv(he);
1974 av_store(av, AvFILLp(av)+1, key); /* av_push(), really */
1977 qsort((char *) AvARRAY(av), len, sizeof(SV *), sortcmp);
1979 for (i = 0; i < len; i++) {
1980 unsigned char flags;
1984 SV *key = av_shift(av);
1985 HE *he = hv_fetch_ent(hv, key, 0, 0);
1986 SV *val = HeVAL(he);
1988 return 1; /* Internal error, not I/O error */
1991 * Store value first.
1994 TRACEME(("(#%d) value 0x%"UVxf, i, PTR2UV(val)));
1996 if ((ret = store(cxt, val))) /* Extra () for -Wall, grr... */
2001 * Keys are written after values to make sure retrieval
2002 * can be optimal in terms of memory usage, where keys are
2003 * read into a fixed unique buffer called kbuf.
2004 * See retrieve_hash() for details.
2007 /* Implementation of restricted hashes isn't nicely
2010 = (((hash_flags & SHV_RESTRICTED)
2012 ? SHV_K_LOCKED : 0);
2013 if (val == &PL_sv_undef)
2014 flags |= SHV_K_PLACEHOLDER;
2016 keyval = SvPV(key, keylen_tmp);
2017 keylen = keylen_tmp;
2019 const char *keysave = keyval;
2020 bool is_utf8 = TRUE;
2022 /* Just casting the &klen to (STRLEN) won't work
2023 well if STRLEN and I32 are of different widths.
2025 keyval = (char*)bytes_from_utf8((U8*)keyval,
2029 /* If we were able to downgrade here, then than
2030 means that we have a key which only had chars
2031 0-255, but was utf8 encoded. */
2033 if (keyval != keysave) {
2034 keylen = keylen_tmp;
2035 flags |= SHV_K_WASUTF8;
2037 /* keylen_tmp can't have changed, so no need
2038 to assign back to keylen. */
2039 flags |= SHV_K_UTF8;
2045 TRACEME(("(#%d) key '%s' flags %x %u", i, keyval, flags, *keyval));
2047 assert (flags == 0);
2048 TRACEME(("(#%d) key '%s'", i, keyval));
2052 WRITE(keyval, keylen);
2053 if (flags & SHV_K_WASUTF8)
2058 * Free up the temporary array
2067 * Storing in "random" order (in the order the keys are stored
2068 * within the the hash). This is the default and will be faster!
2071 for (i = 0; i < len; i++) {
2074 unsigned char flags;
2075 HE *he = hv_iternext_flags(hv, HV_ITERNEXT_WANTPLACEHOLDERS);
2076 SV *val = (he ? hv_iterval(hv, he) : 0);
2081 return 1; /* Internal error, not I/O error */
2084 * Store value first.
2087 TRACEME(("(#%d) value 0x%"UVxf, i, PTR2UV(val)));
2089 if ((ret = store(cxt, val))) /* Extra () for -Wall, grr... */
2092 /* Implementation of restricted hashes isn't nicely
2095 = (((hash_flags & SHV_RESTRICTED)
2097 ? SHV_K_LOCKED : 0);
2098 if (val == &PL_sv_undef)
2099 flags |= SHV_K_PLACEHOLDER;
2101 hek = HeKEY_hek(he);
2103 if (len == HEf_SVKEY) {
2104 /* This is somewhat sick, but the internal APIs are
2105 * such that XS code could put one of these in in
2107 * Maybe we should be capable of storing one if
2110 key_sv = HeKEY_sv(he);
2111 flags |= SHV_K_ISSV;
2113 /* Regular string key. */
2115 flags |= SHV_K_UTF8;
2116 if (HEK_WASUTF8(hek))
2117 flags |= SHV_K_WASUTF8;
2122 * Keys are written after values to make sure retrieval
2123 * can be optimal in terms of memory usage, where keys are
2124 * read into a fixed unique buffer called kbuf.
2125 * See retrieve_hash() for details.
2130 TRACEME(("(#%d) key '%s' flags %x", i, key, flags));
2132 assert (flags == 0);
2133 TRACEME(("(#%d) key '%s'", i, key));
2135 if (flags & SHV_K_ISSV) {
2145 TRACEME(("ok (hash 0x%"UVxf")", PTR2UV(hv)));
2148 HvRITER(hv) = riter; /* Restore hash iterator state */
2149 HvEITER(hv) = eiter;
2157 * When storing a tied object (be it a tied scalar, array or hash), we lay out
2158 * a special mark, followed by the underlying tied object. For instance, when
2159 * dealing with a tied hash, we store SX_TIED_HASH <hash object>, where
2160 * <hash object> stands for the serialization of the tied hash.
2162 static int store_tied(stcxt_t *cxt, SV *sv)
2166 int svt = SvTYPE(sv);
2169 TRACEME(("store_tied (0x%"UVxf")", PTR2UV(sv)));
2172 * We have a small run-time penalty here because we chose to factorise
2173 * all tieds objects into the same routine, and not have a store_tied_hash,
2174 * a store_tied_array, etc...
2176 * Don't use a switch() statement, as most compilers don't optimize that
2177 * well for 2/3 values. An if() else if() cascade is just fine. We put
2178 * tied hashes first, as they are the most likely beasts.
2181 if (svt == SVt_PVHV) {
2182 TRACEME(("tied hash"));
2183 PUTMARK(SX_TIED_HASH); /* Introduces tied hash */
2184 } else if (svt == SVt_PVAV) {
2185 TRACEME(("tied array"));
2186 PUTMARK(SX_TIED_ARRAY); /* Introduces tied array */
2188 TRACEME(("tied scalar"));
2189 PUTMARK(SX_TIED_SCALAR); /* Introduces tied scalar */
2193 if (!(mg = mg_find(sv, mtype)))
2194 CROAK(("No magic '%c' found while storing tied %s", mtype,
2195 (svt == SVt_PVHV) ? "hash" :
2196 (svt == SVt_PVAV) ? "array" : "scalar"));
2199 * The mg->mg_obj found by mg_find() above actually points to the
2200 * underlying tied Perl object implementation. For instance, if the
2201 * original SV was that of a tied array, then mg->mg_obj is an AV.
2203 * Note that we store the Perl object as-is. We don't call its FETCH
2204 * method along the way. At retrieval time, we won't call its STORE
2205 * method either, but the tieing magic will be re-installed. In itself,
2206 * that ensures that the tieing semantics are preserved since futher
2207 * accesses on the retrieved object will indeed call the magic methods...
2210 if ((ret = store(cxt, mg->mg_obj))) /* Extra () for -Wall, grr... */
2213 TRACEME(("ok (tied)"));
2221 * Stores a reference to an item within a tied structure:
2223 * . \$h{key}, stores both the (tied %h) object and 'key'.
2224 * . \$a[idx], stores both the (tied @a) object and 'idx'.
2226 * Layout is therefore either:
2227 * SX_TIED_KEY <object> <key>
2228 * SX_TIED_IDX <object> <index>
2230 static int store_tied_item(stcxt_t *cxt, SV *sv)
2235 TRACEME(("store_tied_item (0x%"UVxf")", PTR2UV(sv)));
2237 if (!(mg = mg_find(sv, 'p')))
2238 CROAK(("No magic 'p' found while storing reference to tied item"));
2241 * We discriminate between \$h{key} and \$a[idx] via mg_ptr.
2245 TRACEME(("store_tied_item: storing a ref to a tied hash item"));
2246 PUTMARK(SX_TIED_KEY);
2247 TRACEME(("store_tied_item: storing OBJ 0x%"UVxf, PTR2UV(mg->mg_obj)));
2249 if ((ret = store(cxt, mg->mg_obj))) /* Extra () for -Wall, grr... */
2252 TRACEME(("store_tied_item: storing PTR 0x%"UVxf, PTR2UV(mg->mg_ptr)));
2254 if ((ret = store(cxt, (SV *) mg->mg_ptr))) /* Idem, for -Wall */
2257 I32 idx = mg->mg_len;
2259 TRACEME(("store_tied_item: storing a ref to a tied array item "));
2260 PUTMARK(SX_TIED_IDX);
2261 TRACEME(("store_tied_item: storing OBJ 0x%"UVxf, PTR2UV(mg->mg_obj)));
2263 if ((ret = store(cxt, mg->mg_obj))) /* Idem, for -Wall */
2266 TRACEME(("store_tied_item: storing IDX %d", idx));
2271 TRACEME(("ok (tied item)"));
2277 * store_hook -- dispatched manually, not via sv_store[]
2279 * The blessed SV is serialized by a hook.
2283 * SX_HOOK <flags> <len> <classname> <len2> <str> [<len3> <object-IDs>]
2285 * where <flags> indicates how long <len>, <len2> and <len3> are, whether
2286 * the trailing part [] is present, the type of object (scalar, array or hash).
2287 * There is also a bit which says how the classname is stored between:
2292 * and when the <index> form is used (classname already seen), the "large
2293 * classname" bit in <flags> indicates how large the <index> is.
2295 * The serialized string returned by the hook is of length <len2> and comes
2296 * next. It is an opaque string for us.
2298 * Those <len3> object IDs which are listed last represent the extra references
2299 * not directly serialized by the hook, but which are linked to the object.
2301 * When recursion is mandated to resolve object-IDs not yet seen, we have
2302 * instead, with <header> being flags with bits set to indicate the object type
2303 * and that recursion was indeed needed:
2305 * SX_HOOK <header> <object> <header> <object> <flags>
2307 * that same header being repeated between serialized objects obtained through
2308 * recursion, until we reach flags indicating no recursion, at which point
2309 * we know we've resynchronized with a single layout, after <flags>.
2311 * When storing a blessed ref to a tied variable, the following format is
2314 * SX_HOOK <flags> <extra> ... [<len3> <object-IDs>] <magic object>
2316 * The first <flags> indication carries an object of type SHT_EXTRA, and the
2317 * real object type is held in the <extra> flag. At the very end of the
2318 * serialization stream, the underlying magic object is serialized, just like
2319 * any other tied variable.
2321 static int store_hook(
2334 int count; /* really len3 + 1 */
2335 unsigned char flags;
2338 int recursed = 0; /* counts recursion */
2339 int obj_type; /* object type, on 2 bits */
2342 int clone = cxt->optype & ST_CLONE;
2343 char mtype = '\0'; /* for blessed ref to tied structures */
2344 unsigned char eflags = '\0'; /* used when object type is SHT_EXTRA */
2346 TRACEME(("store_hook, class \"%s\", tagged #%d", HvNAME(pkg), cxt->tagnum));
2349 * Determine object type on 2 bits.
2354 obj_type = SHT_SCALAR;
2357 obj_type = SHT_ARRAY;
2360 obj_type = SHT_HASH;
2364 * Produced by a blessed ref to a tied data structure, $o in the
2365 * following Perl code.
2369 * my $o = bless \%h, 'BAR';
2371 * Signal the tie-ing magic by setting the object type as SHT_EXTRA
2372 * (since we have only 2 bits in <flags> to store the type), and an
2373 * <extra> byte flag will be emitted after the FIRST <flags> in the
2374 * stream, carrying what we put in `eflags'.
2376 obj_type = SHT_EXTRA;
2377 switch (SvTYPE(sv)) {
2379 eflags = (unsigned char) SHT_THASH;
2383 eflags = (unsigned char) SHT_TARRAY;
2387 eflags = (unsigned char) SHT_TSCALAR;
2393 CROAK(("Unexpected object type (%d) in store_hook()", type));
2395 flags = SHF_NEED_RECURSE | obj_type;
2397 class = HvNAME(pkg);
2398 len = strlen(class);
2401 * To call the hook, we need to fake a call like:
2403 * $object->STORABLE_freeze($cloning);
2405 * but we don't have the $object here. For instance, if $object is
2406 * a blessed array, what we have in `sv' is the array, and we can't
2407 * call a method on those.
2409 * Therefore, we need to create a temporary reference to the object and
2410 * make the call on that reference.
2413 TRACEME(("about to call STORABLE_freeze on class %s", class));
2415 ref = newRV_noinc(sv); /* Temporary reference */
2416 av = array_call(ref, hook, clone); /* @a = $object->STORABLE_freeze($c) */
2418 SvREFCNT_dec(ref); /* Reclaim temporary reference */
2420 count = AvFILLp(av) + 1;
2421 TRACEME(("store_hook, array holds %d items", count));
2424 * If they return an empty list, it means they wish to ignore the
2425 * hook for this class (and not just this instance -- that's for them
2426 * to handle if they so wish).
2428 * Simply disable the cached entry for the hook (it won't be recomputed
2429 * since it's present in the cache) and recurse to store_blessed().
2434 * They must not change their mind in the middle of a serialization.
2437 if (hv_fetch(cxt->hclass, class, len, FALSE))
2438 CROAK(("Too late to ignore hooks for %s class \"%s\"",
2439 (cxt->optype & ST_CLONE) ? "cloning" : "storing", class));
2441 pkg_hide(cxt->hook, pkg, "STORABLE_freeze");
2443 ASSERT(!pkg_can(cxt->hook, pkg, "STORABLE_freeze"), ("hook invisible"));
2444 TRACEME(("ignoring STORABLE_freeze in class \"%s\"", class));
2446 return store_blessed(cxt, sv, type, pkg);
2450 * Get frozen string.
2454 pv = SvPV(ary[0], len2);
2457 * If they returned more than one item, we need to serialize some
2458 * extra references if not already done.
2460 * Loop over the array, starting at postion #1, and for each item,
2461 * ensure it is a reference, serialize it if not already done, and
2462 * replace the entry with the tag ID of the corresponding serialized
2465 * We CHEAT by not calling av_fetch() and read directly within the
2469 for (i = 1; i < count; i++) {
2473 AV *av_hook = cxt->hook_seen;
2476 CROAK(("Item #%d returned by STORABLE_freeze "
2477 "for %s is not a reference", i, class));
2478 xsv = SvRV(rsv); /* Follow ref to know what to look for */
2481 * Look in hseen and see if we have a tag already.
2482 * Serialize entry if not done already, and get its tag.
2485 if ((svh = hv_fetch(cxt->hseen, (char *) &xsv, sizeof(xsv), FALSE)))
2486 goto sv_seen; /* Avoid moving code too far to the right */
2488 TRACEME(("listed object %d at 0x%"UVxf" is unknown", i-1, PTR2UV(xsv)));
2491 * We need to recurse to store that object and get it to be known
2492 * so that we can resolve the list of object-IDs at retrieve time.
2494 * The first time we do this, we need to emit the proper header
2495 * indicating that we recursed, and what the type of object is (the
2496 * object we're storing via a user-hook). Indeed, during retrieval,
2497 * we'll have to create the object before recursing to retrieve the
2498 * others, in case those would point back at that object.
2501 /* [SX_HOOK] <flags> [<extra>] <object>*/
2505 if (obj_type == SHT_EXTRA)
2510 if ((ret = store(cxt, xsv))) /* Given by hook for us to store */
2513 svh = hv_fetch(cxt->hseen, (char *) &xsv, sizeof(xsv), FALSE);
2515 CROAK(("Could not serialize item #%d from hook in %s", i, class));
2518 * It was the first time we serialized `xsv'.
2520 * Keep this SV alive until the end of the serialization: if we
2521 * disposed of it right now by decrementing its refcount, and it was
2522 * a temporary value, some next temporary value allocated during
2523 * another STORABLE_freeze might take its place, and we'd wrongly
2524 * assume that new SV was already serialized, based on its presence
2527 * Therefore, push it away in cxt->hook_seen.
2530 av_store(av_hook, AvFILLp(av_hook)+1, SvREFCNT_inc(xsv));
2534 * Dispose of the REF they returned. If we saved the `xsv' away
2535 * in the array of returned SVs, that will not cause the underlying
2536 * referenced SV to be reclaimed.
2539 ASSERT(SvREFCNT(xsv) > 1, ("SV will survive disposal of its REF"));
2540 SvREFCNT_dec(rsv); /* Dispose of reference */
2543 * Replace entry with its tag (not a real SV, so no refcnt increment)
2547 TRACEME(("listed object %d at 0x%"UVxf" is tag #%"UVuf,
2548 i-1, PTR2UV(xsv), PTR2UV(*svh)));
2552 * Allocate a class ID if not already done.
2554 * This needs to be done after the recursion above, since at retrieval
2555 * time, we'll see the inner objects first. Many thanks to
2556 * Salvador Ortiz Garcia <sog@msg.com.mx> who spot that bug and
2557 * proposed the right fix. -- RAM, 15/09/2000
2560 if (!known_class(cxt, class, len, &classnum)) {
2561 TRACEME(("first time we see class %s, ID = %d", class, classnum));
2562 classnum = -1; /* Mark: we must store classname */
2564 TRACEME(("already seen class %s, ID = %d", class, classnum));
2568 * Compute leading flags.
2572 if (((classnum == -1) ? len : classnum) > LG_SCALAR)
2573 flags |= SHF_LARGE_CLASSLEN;
2575 flags |= SHF_IDX_CLASSNAME;
2576 if (len2 > LG_SCALAR)
2577 flags |= SHF_LARGE_STRLEN;
2579 flags |= SHF_HAS_LIST;
2580 if (count > (LG_SCALAR + 1))
2581 flags |= SHF_LARGE_LISTLEN;
2584 * We're ready to emit either serialized form:
2586 * SX_HOOK <flags> <len> <classname> <len2> <str> [<len3> <object-IDs>]
2587 * SX_HOOK <flags> <index> <len2> <str> [<len3> <object-IDs>]
2589 * If we recursed, the SX_HOOK has already been emitted.
2592 TRACEME(("SX_HOOK (recursed=%d) flags=0x%x "
2593 "class=%"IVdf" len=%"IVdf" len2=%"IVdf" len3=%d",
2594 recursed, flags, (IV)classnum, (IV)len, (IV)len2, count-1));
2596 /* SX_HOOK <flags> [<extra>] */
2600 if (obj_type == SHT_EXTRA)
2605 /* <len> <classname> or <index> */
2606 if (flags & SHF_IDX_CLASSNAME) {
2607 if (flags & SHF_LARGE_CLASSLEN)
2610 unsigned char cnum = (unsigned char) classnum;
2614 if (flags & SHF_LARGE_CLASSLEN)
2617 unsigned char clen = (unsigned char) len;
2620 WRITE(class, len); /* Final \0 is omitted */
2623 /* <len2> <frozen-str> */
2624 if (flags & SHF_LARGE_STRLEN) {
2625 I32 wlen2 = len2; /* STRLEN might be 8 bytes */
2626 WLEN(wlen2); /* Must write an I32 for 64-bit machines */
2628 unsigned char clen = (unsigned char) len2;
2632 WRITE(pv, len2); /* Final \0 is omitted */
2634 /* [<len3> <object-IDs>] */
2635 if (flags & SHF_HAS_LIST) {
2636 int len3 = count - 1;
2637 if (flags & SHF_LARGE_LISTLEN)
2640 unsigned char clen = (unsigned char) len3;
2645 * NOTA BENE, for 64-bit machines: the ary[i] below does not yield a
2646 * real pointer, rather a tag number, well under the 32-bit limit.
2649 for (i = 1; i < count; i++) {
2650 I32 tagval = htonl(LOW_32BITS(ary[i]));
2652 TRACEME(("object %d, tag #%d", i-1, ntohl(tagval)));
2657 * Free the array. We need extra care for indices after 0, since they
2658 * don't hold real SVs but integers cast.
2662 AvFILLp(av) = 0; /* Cheat, nothing after 0 interests us */
2667 * If object was tied, need to insert serialization of the magic object.
2670 if (obj_type == SHT_EXTRA) {
2673 if (!(mg = mg_find(sv, mtype))) {
2674 int svt = SvTYPE(sv);
2675 CROAK(("No magic '%c' found while storing ref to tied %s with hook",
2676 mtype, (svt == SVt_PVHV) ? "hash" :
2677 (svt == SVt_PVAV) ? "array" : "scalar"));
2680 TRACEME(("handling the magic object 0x%"UVxf" part of 0x%"UVxf,
2681 PTR2UV(mg->mg_obj), PTR2UV(sv)));
2687 if ((ret = store(cxt, mg->mg_obj))) /* Extra () for -Wall, grr... */
2695 * store_blessed -- dispatched manually, not via sv_store[]
2697 * Check whether there is a STORABLE_xxx hook defined in the class or in one
2698 * of its ancestors. If there is, then redispatch to store_hook();
2700 * Otherwise, the blessed SV is stored using the following layout:
2702 * SX_BLESS <flag> <len> <classname> <object>
2704 * where <flag> indicates whether <len> is stored on 0 or 4 bytes, depending
2705 * on the high-order bit in flag: if 1, then length follows on 4 bytes.
2706 * Otherwise, the low order bits give the length, thereby giving a compact
2707 * representation for class names less than 127 chars long.
2709 * Each <classname> seen is remembered and indexed, so that the next time
2710 * an object in the blessed in the same <classname> is stored, the following
2713 * SX_IX_BLESS <flag> <index> <object>
2715 * where <index> is the classname index, stored on 0 or 4 bytes depending
2716 * on the high-order bit in flag (same encoding as above for <len>).
2718 static int store_blessed(
2729 TRACEME(("store_blessed, type %d, class \"%s\"", type, HvNAME(pkg)));
2732 * Look for a hook for this blessed SV and redirect to store_hook()
2736 hook = pkg_can(cxt->hook, pkg, "STORABLE_freeze");
2738 return store_hook(cxt, sv, type, pkg, hook);
2741 * This is a blessed SV without any serialization hook.
2744 class = HvNAME(pkg);
2745 len = strlen(class);
2747 TRACEME(("blessed 0x%"UVxf" in %s, no hook: tagged #%d",
2748 PTR2UV(sv), class, cxt->tagnum));
2751 * Determine whether it is the first time we see that class name (in which
2752 * case it will be stored in the SX_BLESS form), or whether we already
2753 * saw that class name before (in which case the SX_IX_BLESS form will be
2757 if (known_class(cxt, class, len, &classnum)) {
2758 TRACEME(("already seen class %s, ID = %d", class, classnum));
2759 PUTMARK(SX_IX_BLESS);
2760 if (classnum <= LG_BLESS) {
2761 unsigned char cnum = (unsigned char) classnum;
2764 unsigned char flag = (unsigned char) 0x80;
2769 TRACEME(("first time we see class %s, ID = %d", class, classnum));
2771 if (len <= LG_BLESS) {
2772 unsigned char clen = (unsigned char) len;
2775 unsigned char flag = (unsigned char) 0x80;
2777 WLEN(len); /* Don't BER-encode, this should be rare */
2779 WRITE(class, len); /* Final \0 is omitted */
2783 * Now emit the <object> part.
2786 return SV_STORE(type)(cxt, sv);
2792 * We don't know how to store the item we reached, so return an error condition.
2793 * (it's probably a GLOB, some CODE reference, etc...)
2795 * If they defined the `forgive_me' variable at the Perl level to some
2796 * true value, then don't croak, just warn, and store a placeholder string
2799 static int store_other(stcxt_t *cxt, SV *sv)
2802 static char buf[80];
2804 TRACEME(("store_other"));
2807 * Fetch the value from perl only once per store() operation.
2811 cxt->forgive_me == 0 ||
2812 (cxt->forgive_me < 0 && !(cxt->forgive_me =
2813 SvTRUE(perl_get_sv("Storable::forgive_me", TRUE)) ? 1 : 0))
2815 CROAK(("Can't store %s items", sv_reftype(sv, FALSE)));
2817 warn("Can't store item %s(0x%"UVxf")",
2818 sv_reftype(sv, FALSE), PTR2UV(sv));
2821 * Store placeholder string as a scalar instead...
2824 (void) sprintf(buf, "You lost %s(0x%"UVxf")%c", sv_reftype(sv, FALSE),
2825 PTR2UV(sv), (char) 0);
2828 STORE_SCALAR(buf, len);
2829 TRACEME(("ok (dummy \"%s\", length = %"IVdf")", buf, len));
2835 *** Store driving routines
2841 * WARNING: partially duplicates Perl's sv_reftype for speed.
2843 * Returns the type of the SV, identified by an integer. That integer
2844 * may then be used to index the dynamic routine dispatch table.
2846 static int sv_type(SV *sv)
2848 switch (SvTYPE(sv)) {
2853 * No need to check for ROK, that can't be set here since there
2854 * is no field capable of hodling the xrv_rv reference.
2862 * Starting from SVt_PV, it is possible to have the ROK flag
2863 * set, the pointer to the other SV being either stored in
2864 * the xrv_rv (in the case of a pure SVt_RV), or as the
2865 * xpv_pv field of an SVt_PV and its heirs.
2867 * However, those SV cannot be magical or they would be an
2868 * SVt_PVMG at least.
2870 return SvROK(sv) ? svis_REF : svis_SCALAR;
2872 case SVt_PVLV: /* Workaround for perl5.004_04 "LVALUE" bug */
2873 if (SvRMAGICAL(sv) && (mg_find(sv, 'p')))
2874 return svis_TIED_ITEM;
2877 if (SvRMAGICAL(sv) && (mg_find(sv, 'q')))
2879 return SvROK(sv) ? svis_REF : svis_SCALAR;
2881 if (SvRMAGICAL(sv) && (mg_find(sv, 'P')))
2885 if (SvRMAGICAL(sv) && (mg_find(sv, 'P')))
2898 * Recursively store objects pointed to by the sv to the specified file.
2900 * Layout is <content> or SX_OBJECT <tagnum> if we reach an already stored
2901 * object (one for which storage has started -- it may not be over if we have
2902 * a self-referenced structure). This data set forms a stored <object>.
2904 static int store(stcxt_t *cxt, SV *sv)
2909 HV *hseen = cxt->hseen;
2911 TRACEME(("store (0x%"UVxf")", PTR2UV(sv)));
2914 * If object has already been stored, do not duplicate data.
2915 * Simply emit the SX_OBJECT marker followed by its tag data.
2916 * The tag is always written in network order.
2918 * NOTA BENE, for 64-bit machines: the "*svh" below does not yield a
2919 * real pointer, rather a tag number (watch the insertion code below).
2920 * That means it pobably safe to assume it is well under the 32-bit limit,
2921 * and makes the truncation safe.
2922 * -- RAM, 14/09/1999
2925 svh = hv_fetch(hseen, (char *) &sv, sizeof(sv), FALSE);
2927 I32 tagval = htonl(LOW_32BITS(*svh));
2929 TRACEME(("object 0x%"UVxf" seen as #%d", PTR2UV(sv), ntohl(tagval)));
2937 * Allocate a new tag and associate it with the address of the sv being
2938 * stored, before recursing...
2940 * In order to avoid creating new SvIVs to hold the tagnum we just
2941 * cast the tagnum to an SV pointer and store that in the hash. This
2942 * means that we must clean up the hash manually afterwards, but gives
2943 * us a 15% throughput increase.
2948 if (!hv_store(hseen,
2949 (char *) &sv, sizeof(sv), INT2PTR(SV*, cxt->tagnum), 0))
2953 * Store `sv' and everything beneath it, using appropriate routine.
2954 * Abort immediately if we get a non-zero status back.
2959 TRACEME(("storing 0x%"UVxf" tag #%d, type %d...",
2960 PTR2UV(sv), cxt->tagnum, type));
2963 HV *pkg = SvSTASH(sv);
2964 ret = store_blessed(cxt, sv, type, pkg);
2966 ret = SV_STORE(type)(cxt, sv);
2968 TRACEME(("%s (stored 0x%"UVxf", refcnt=%d, %s)",
2969 ret ? "FAILED" : "ok", PTR2UV(sv),
2970 SvREFCNT(sv), sv_reftype(sv, FALSE)));
2978 * Write magic number and system information into the file.
2979 * Layout is <magic> <network> [<len> <byteorder> <sizeof int> <sizeof long>
2980 * <sizeof ptr>] where <len> is the length of the byteorder hexa string.
2981 * All size and lenghts are written as single characters here.
2983 * Note that no byte ordering info is emitted when <network> is true, since
2984 * integers will be emitted in network order in that case.
2986 static int magic_write(stcxt_t *cxt)
2988 char buf[256]; /* Enough room for 256 hexa digits */
2990 int use_network_order = cxt->netorder;
2992 TRACEME(("magic_write on fd=%d", cxt->fio ? PerlIO_fileno(cxt->fio)
2996 WRITE(magicstr, strlen(magicstr)); /* Don't write final \0 */
2999 * Starting with 0.6, the "use_network_order" byte flag is also used to
3000 * indicate the version number of the binary image, encoded in the upper
3001 * bits. The bit 0 is always used to indicate network order.
3005 ((use_network_order ? 0x1 : 0x0) | (STORABLE_BIN_MAJOR << 1));
3009 * Starting with 0.7, a full byte is dedicated to the minor version of
3010 * the binary format, which is incremented only when new markers are
3011 * introduced, for instance, but when backward compatibility is preserved.
3014 PUTMARK((unsigned char) STORABLE_BIN_MINOR);
3016 if (use_network_order)
3017 return 0; /* Don't bother with byte ordering */
3019 sprintf(buf, "%lx", (unsigned long) BYTEORDER);
3020 c = (unsigned char) strlen(buf);
3022 WRITE(buf, (unsigned int) c); /* Don't write final \0 */
3023 PUTMARK((unsigned char) sizeof(int));
3024 PUTMARK((unsigned char) sizeof(long));
3025 PUTMARK((unsigned char) sizeof(char *));
3026 PUTMARK((unsigned char) sizeof(NV));
3028 TRACEME(("ok (magic_write byteorder = 0x%lx [%d], I%d L%d P%d D%d)",
3029 (unsigned long) BYTEORDER, (int) c,
3030 (int) sizeof(int), (int) sizeof(long),
3031 (int) sizeof(char *), (int) sizeof(NV)));
3039 * Common code for store operations.
3041 * When memory store is requested (f = NULL) and a non null SV* is given in
3042 * `res', it is filled with a new SV created out of the memory buffer.
3044 * It is required to provide a non-null `res' when the operation type is not
3045 * dclone() and store() is performed to memory.
3047 static int do_store(
3057 ASSERT(!(f == 0 && !(optype & ST_CLONE)) || res,
3058 ("must supply result SV pointer for real recursion to memory"));
3060 TRACEME(("do_store (optype=%d, netorder=%d)",
3061 optype, network_order));
3066 * Workaround for CROAK leak: if they enter with a "dirty" context,
3067 * free up memory for them now.
3074 * Now that STORABLE_xxx hooks exist, it is possible that they try to
3075 * re-enter store() via the hooks. We need to stack contexts.
3079 cxt = allocate_context(cxt);
3083 ASSERT(cxt->entry == 1, ("starting new recursion"));
3084 ASSERT(!cxt->s_dirty, ("clean context"));
3087 * Ensure sv is actually a reference. From perl, we called something
3089 * pstore(FILE, \@array);
3090 * so we must get the scalar value behing that reference.
3094 CROAK(("Not a reference"));
3095 sv = SvRV(sv); /* So follow it to know what to store */
3098 * If we're going to store to memory, reset the buffer.
3105 * Prepare context and emit headers.
3108 init_store_context(cxt, f, optype, network_order);
3110 if (-1 == magic_write(cxt)) /* Emit magic and ILP info */
3111 return 0; /* Error */
3114 * Recursively store object...
3117 ASSERT(is_storing(), ("within store operation"));
3119 status = store(cxt, sv); /* Just do it! */
3122 * If they asked for a memory store and they provided an SV pointer,
3123 * make an SV string out of the buffer and fill their pointer.
3125 * When asking for ST_REAL, it's MANDATORY for the caller to provide
3126 * an SV, since context cleanup might free the buffer if we did recurse.
3127 * (unless caller is dclone(), which is aware of that).
3130 if (!cxt->fio && res)
3136 * The "root" context is never freed, since it is meant to be always
3137 * handy for the common case where no recursion occurs at all (i.e.
3138 * we enter store() outside of any Storable code and leave it, period).
3139 * We know it's the "root" context because there's nothing stacked
3144 * When deep cloning, we don't free the context: doing so would force
3145 * us to copy the data in the memory buffer. Sicne we know we're
3146 * about to enter do_retrieve...
3149 clean_store_context(cxt);
3150 if (cxt->prev && !(cxt->optype & ST_CLONE))
3153 TRACEME(("do_store returns %d", status));
3161 * Store the transitive data closure of given object to disk.
3162 * Returns 0 on error, a true value otherwise.
3164 int pstore(PerlIO *f, SV *sv)
3166 TRACEME(("pstore"));
3167 return do_store(f, sv, 0, FALSE, (SV**) 0);
3174 * Same as pstore(), but network order is used for integers and doubles are
3175 * emitted as strings.
3177 int net_pstore(PerlIO *f, SV *sv)
3179 TRACEME(("net_pstore"));
3180 return do_store(f, sv, 0, TRUE, (SV**) 0);
3190 * Build a new SV out of the content of the internal memory buffer.
3192 static SV *mbuf2sv(void)
3196 return newSVpv(mbase, MBUF_SIZE());
3202 * Store the transitive data closure of given object to memory.
3203 * Returns undef on error, a scalar value containing the data otherwise.
3209 TRACEME(("mstore"));
3211 if (!do_store((PerlIO*) 0, sv, 0, FALSE, &out))
3212 return &PL_sv_undef;
3220 * Same as mstore(), but network order is used for integers and doubles are
3221 * emitted as strings.
3223 SV *net_mstore(SV *sv)
3227 TRACEME(("net_mstore"));
3229 if (!do_store((PerlIO*) 0, sv, 0, TRUE, &out))
3230 return &PL_sv_undef;
3236 *** Specific retrieve callbacks.
3242 * Return an error via croak, since it is not possible that we get here
3243 * under normal conditions, when facing a file produced via pstore().
3245 static SV *retrieve_other(stcxt_t *cxt, char *cname)
3248 cxt->ver_major != STORABLE_BIN_MAJOR &&
3249 cxt->ver_minor != STORABLE_BIN_MINOR
3251 CROAK(("Corrupted storable %s (binary v%d.%d), current is v%d.%d",
3252 cxt->fio ? "file" : "string",
3253 cxt->ver_major, cxt->ver_minor,
3254 STORABLE_BIN_MAJOR, STORABLE_BIN_MINOR));
3256 CROAK(("Corrupted storable %s (binary v%d.%d)",
3257 cxt->fio ? "file" : "string",
3258 cxt->ver_major, cxt->ver_minor));
3261 return (SV *) 0; /* Just in case */
3265 * retrieve_idx_blessed
3267 * Layout is SX_IX_BLESS <index> <object> with SX_IX_BLESS already read.
3268 * <index> can be coded on either 1 or 5 bytes.
3270 static SV *retrieve_idx_blessed(stcxt_t *cxt, char *cname)
3277 TRACEME(("retrieve_idx_blessed (#%d)", cxt->tagnum));
3278 ASSERT(!cname, ("no bless-into class given here, got %s", cname));
3280 GETMARK(idx); /* Index coded on a single char? */
3285 * Fetch classname in `aclass'
3288 sva = av_fetch(cxt->aclass, idx, FALSE);
3290 CROAK(("Class name #%"IVdf" should have been seen already", (IV) idx));
3292 class = SvPVX(*sva); /* We know it's a PV, by construction */
3294 TRACEME(("class ID %d => %s", idx, class));
3297 * Retrieve object and bless it.
3300 sv = retrieve(cxt, class); /* First SV which is SEEN will be blessed */
3308 * Layout is SX_BLESS <len> <classname> <object> with SX_BLESS already read.
3309 * <len> can be coded on either 1 or 5 bytes.
3311 static SV *retrieve_blessed(stcxt_t *cxt, char *cname)
3315 char buf[LG_BLESS + 1]; /* Avoid malloc() if possible */
3318 TRACEME(("retrieve_blessed (#%d)", cxt->tagnum));
3319 ASSERT(!cname, ("no bless-into class given here, got %s", cname));
3322 * Decode class name length and read that name.
3324 * Short classnames have two advantages: their length is stored on one
3325 * single byte, and the string can be read on the stack.
3328 GETMARK(len); /* Length coded on a single char? */
3331 TRACEME(("** allocating %d bytes for class name", len+1));
3332 New(10003, class, len+1, char);
3335 class[len] = '\0'; /* Mark string end */
3338 * It's a new classname, otherwise it would have been an SX_IX_BLESS.
3341 TRACEME(("new class name \"%s\" will bear ID = %d", class, cxt->classnum));
3343 if (!av_store(cxt->aclass, cxt->classnum++, newSVpvn(class, len)))
3347 * Retrieve object and bless it.
3350 sv = retrieve(cxt, class); /* First SV which is SEEN will be blessed */
3360 * Layout: SX_HOOK <flags> <len> <classname> <len2> <str> [<len3> <object-IDs>]
3361 * with leading mark already read, as usual.
3363 * When recursion was involved during serialization of the object, there
3364 * is an unknown amount of serialized objects after the SX_HOOK mark. Until
3365 * we reach a <flags> marker with the recursion bit cleared.
3367 * If the first <flags> byte contains a type of SHT_EXTRA, then the real type
3368 * is held in the <extra> byte, and if the object is tied, the serialized
3369 * magic object comes at the very end:
3371 * SX_HOOK <flags> <extra> ... [<len3> <object-IDs>] <magic object>
3373 * This means the STORABLE_thaw hook will NOT get a tied variable during its
3374 * processing (since we won't have seen the magic object by the time the hook
3375 * is called). See comments below for why it was done that way.
3377 static SV *retrieve_hook(stcxt_t *cxt, char *cname)
3380 char buf[LG_BLESS + 1]; /* Avoid malloc() if possible */
3391 int clone = cxt->optype & ST_CLONE;
3393 unsigned int extra_type = 0;
3395 TRACEME(("retrieve_hook (#%d)", cxt->tagnum));
3396 ASSERT(!cname, ("no bless-into class given here, got %s", cname));
3399 * Read flags, which tell us about the type, and whether we need to recurse.
3405 * Create the (empty) object, and mark it as seen.
3407 * This must be done now, because tags are incremented, and during
3408 * serialization, the object tag was affected before recursion could
3412 obj_type = flags & SHF_TYPE_MASK;
3418 sv = (SV *) newAV();
3421 sv = (SV *) newHV();
3425 * Read <extra> flag to know the type of the object.
3426 * Record associated magic type for later.
3428 GETMARK(extra_type);
3429 switch (extra_type) {
3435 sv = (SV *) newAV();
3439 sv = (SV *) newHV();
3443 return retrieve_other(cxt, 0); /* Let it croak */
3447 return retrieve_other(cxt, 0); /* Let it croak */
3449 SEEN(sv, 0); /* Don't bless yet */
3452 * Whilst flags tell us to recurse, do so.
3454 * We don't need to remember the addresses returned by retrieval, because
3455 * all the references will be obtained through indirection via the object
3456 * tags in the object-ID list.
3459 while (flags & SHF_NEED_RECURSE) {
3460 TRACEME(("retrieve_hook recursing..."));
3461 rv = retrieve(cxt, 0);
3464 TRACEME(("retrieve_hook back with rv=0x%"UVxf,
3469 if (flags & SHF_IDX_CLASSNAME) {
3474 * Fetch index from `aclass'
3477 if (flags & SHF_LARGE_CLASSLEN)
3482 sva = av_fetch(cxt->aclass, idx, FALSE);
3484 CROAK(("Class name #%"IVdf" should have been seen already",
3487 class = SvPVX(*sva); /* We know it's a PV, by construction */
3488 TRACEME(("class ID %d => %s", idx, class));
3492 * Decode class name length and read that name.
3494 * NOTA BENE: even if the length is stored on one byte, we don't read
3495 * on the stack. Just like retrieve_blessed(), we limit the name to
3496 * LG_BLESS bytes. This is an arbitrary decision.
3499 if (flags & SHF_LARGE_CLASSLEN)
3504 if (len > LG_BLESS) {
3505 TRACEME(("** allocating %d bytes for class name", len+1));
3506 New(10003, class, len+1, char);
3510 class[len] = '\0'; /* Mark string end */
3513 * Record new classname.
3516 if (!av_store(cxt->aclass, cxt->classnum++, newSVpvn(class, len)))
3520 TRACEME(("class name: %s", class));
3523 * Decode user-frozen string length and read it in an SV.
3525 * For efficiency reasons, we read data directly into the SV buffer.
3526 * To understand that code, read retrieve_scalar()
3529 if (flags & SHF_LARGE_STRLEN)
3534 frozen = NEWSV(10002, len2);
3536 SAFEREAD(SvPVX(frozen), len2, frozen);
3537 SvCUR_set(frozen, len2);
3538 *SvEND(frozen) = '\0';
3540 (void) SvPOK_only(frozen); /* Validates string pointer */
3541 if (cxt->s_tainted) /* Is input source tainted? */
3544 TRACEME(("frozen string: %d bytes", len2));
3547 * Decode object-ID list length, if present.
3550 if (flags & SHF_HAS_LIST) {
3551 if (flags & SHF_LARGE_LISTLEN)
3557 av_extend(av, len3 + 1); /* Leave room for [0] */
3558 AvFILLp(av) = len3; /* About to be filled anyway */
3562 TRACEME(("has %d object IDs to link", len3));
3565 * Read object-ID list into array.
3566 * Because we pre-extended it, we can cheat and fill it manually.
3568 * We read object tags and we can convert them into SV* on the fly
3569 * because we know all the references listed in there (as tags)
3570 * have been already serialized, hence we have a valid correspondance
3571 * between each of those tags and the recreated SV.
3575 SV **ary = AvARRAY(av);
3577 for (i = 1; i <= len3; i++) { /* We leave [0] alone */
3584 svh = av_fetch(cxt->aseen, tag, FALSE);
3586 CROAK(("Object #%"IVdf" should have been retrieved already",
3589 ary[i] = SvREFCNT_inc(xsv);
3594 * Bless the object and look up the STORABLE_thaw hook.
3598 hook = pkg_can(cxt->hook, SvSTASH(sv), "STORABLE_thaw");
3601 * Hook not found. Maybe they did not require the module where this
3602 * hook is defined yet?
3604 * If the require below succeeds, we'll be able to find the hook.
3605 * Still, it only works reliably when each class is defined in a
3609 SV *psv = newSVpvn("require ", 8);
3610 sv_catpv(psv, class);
3612 TRACEME(("No STORABLE_thaw defined for objects of class %s", class));
3613 TRACEME(("Going to require module '%s' with '%s'", class, SvPVX(psv)));
3615 perl_eval_sv(psv, G_DISCARD);
3619 * We cache results of pkg_can, so we need to uncache before attempting
3623 pkg_uncache(cxt->hook, SvSTASH(sv), "STORABLE_thaw");
3624 hook = pkg_can(cxt->hook, SvSTASH(sv), "STORABLE_thaw");
3627 CROAK(("No STORABLE_thaw defined for objects of class %s "
3628 "(even after a \"require %s;\")", class, class));
3632 * If we don't have an `av' yet, prepare one.
3633 * Then insert the frozen string as item [0].
3641 AvARRAY(av)[0] = SvREFCNT_inc(frozen);
3646 * $object->STORABLE_thaw($cloning, $frozen, @refs);
3648 * where $object is our blessed (empty) object, $cloning is a boolean
3649 * telling whether we're running a deep clone, $frozen is the frozen
3650 * string the user gave us in his serializing hook, and @refs, which may
3651 * be empty, is the list of extra references he returned along for us
3654 * In effect, the hook is an alternate creation routine for the class,
3655 * the object itself being already created by the runtime.
3658 TRACEME(("calling STORABLE_thaw on %s at 0x%"UVxf" (%"IVdf" args)",
3659 class, PTR2UV(sv), AvFILLp(av) + 1));
3662 (void) scalar_call(rv, hook, clone, av, G_SCALAR|G_DISCARD);
3669 SvREFCNT_dec(frozen);
3672 if (!(flags & SHF_IDX_CLASSNAME) && class != buf)
3676 * If we had an <extra> type, then the object was not as simple, and
3677 * we need to restore extra magic now.
3683 TRACEME(("retrieving magic object for 0x%"UVxf"...", PTR2UV(sv)));
3685 rv = retrieve(cxt, 0); /* Retrieve <magic object> */
3687 TRACEME(("restoring the magic object 0x%"UVxf" part of 0x%"UVxf,
3688 PTR2UV(rv), PTR2UV(sv)));
3690 switch (extra_type) {
3692 sv_upgrade(sv, SVt_PVMG);
3695 sv_upgrade(sv, SVt_PVAV);
3696 AvREAL_off((AV *)sv);
3699 sv_upgrade(sv, SVt_PVHV);
3702 CROAK(("Forgot to deal with extra type %d", extra_type));
3707 * Adding the magic only now, well after the STORABLE_thaw hook was called
3708 * means the hook cannot know it deals with an object whose variable is
3709 * tied. But this is happening when retrieving $o in the following case:
3713 * my $o = bless \%h, 'BAR';
3715 * The 'BAR' class is NOT the one where %h is tied into. Therefore, as
3716 * far as the 'BAR' class is concerned, the fact that %h is not a REAL
3717 * hash but a tied one should not matter at all, and remain transparent.
3718 * This means the magic must be restored by Storable AFTER the hook is
3721 * That looks very reasonable to me, but then I've come up with this
3722 * after a bug report from David Nesting, who was trying to store such
3723 * an object and caused Storable to fail. And unfortunately, it was
3724 * also the easiest way to retrofit support for blessed ref to tied objects
3725 * into the existing design. -- RAM, 17/02/2001
3728 sv_magic(sv, rv, mtype, Nullch, 0);
3729 SvREFCNT_dec(rv); /* Undo refcnt inc from sv_magic() */
3737 * Retrieve reference to some other scalar.
3738 * Layout is SX_REF <object>, with SX_REF already read.
3740 static SV *retrieve_ref(stcxt_t *cxt, char *cname)
3745 TRACEME(("retrieve_ref (#%d)", cxt->tagnum));
3748 * We need to create the SV that holds the reference to the yet-to-retrieve
3749 * object now, so that we may record the address in the seen table.
3750 * Otherwise, if the object to retrieve references us, we won't be able
3751 * to resolve the SX_OBJECT we'll see at that point! Hence we cannot
3752 * do the retrieve first and use rv = newRV(sv) since it will be too late
3753 * for SEEN() recording.
3756 rv = NEWSV(10002, 0);
3757 SEEN(rv, cname); /* Will return if rv is null */
3758 sv = retrieve(cxt, 0); /* Retrieve <object> */
3760 return (SV *) 0; /* Failed */
3763 * WARNING: breaks RV encapsulation.
3765 * Now for the tricky part. We have to upgrade our existing SV, so that
3766 * it is now an RV on sv... Again, we cheat by duplicating the code
3767 * held in newSVrv(), since we already got our SV from retrieve().
3771 * SvRV(rv) = SvREFCNT_inc(sv);
3773 * here because the reference count we got from retrieve() above is
3774 * already correct: if the object was retrieved from the file, then
3775 * its reference count is one. Otherwise, if it was retrieved via
3776 * an SX_OBJECT indication, a ref count increment was done.
3779 sv_upgrade(rv, SVt_RV);
3780 SvRV(rv) = sv; /* $rv = \$sv */
3783 TRACEME(("ok (retrieve_ref at 0x%"UVxf")", PTR2UV(rv)));
3789 * retrieve_overloaded
3791 * Retrieve reference to some other scalar with overloading.
3792 * Layout is SX_OVERLOAD <object>, with SX_OVERLOAD already read.
3794 static SV *retrieve_overloaded(stcxt_t *cxt, char *cname)
3800 TRACEME(("retrieve_overloaded (#%d)", cxt->tagnum));
3803 * Same code as retrieve_ref(), duplicated to avoid extra call.
3806 rv = NEWSV(10002, 0);
3807 SEEN(rv, cname); /* Will return if rv is null */
3808 sv = retrieve(cxt, 0); /* Retrieve <object> */
3810 return (SV *) 0; /* Failed */
3813 * WARNING: breaks RV encapsulation.
3816 sv_upgrade(rv, SVt_RV);
3817 SvRV(rv) = sv; /* $rv = \$sv */
3821 * Restore overloading magic.
3824 stash = (HV *) SvSTASH (sv);
3825 if (!stash || !Gv_AMG(stash))
3826 CROAK(("Cannot restore overloading on %s(0x%"UVxf") (package %s)",
3827 sv_reftype(sv, FALSE),
3829 stash ? HvNAME(stash) : "<unknown>"));
3833 TRACEME(("ok (retrieve_overloaded at 0x%"UVxf")", PTR2UV(rv)));
3839 * retrieve_tied_array
3841 * Retrieve tied array
3842 * Layout is SX_TIED_ARRAY <object>, with SX_TIED_ARRAY already read.
3844 static SV *retrieve_tied_array(stcxt_t *cxt, char *cname)
3849 TRACEME(("retrieve_tied_array (#%d)", cxt->tagnum));
3851 tv = NEWSV(10002, 0);
3852 SEEN(tv, cname); /* Will return if tv is null */
3853 sv = retrieve(cxt, 0); /* Retrieve <object> */
3855 return (SV *) 0; /* Failed */
3857 sv_upgrade(tv, SVt_PVAV);
3858 AvREAL_off((AV *)tv);
3859 sv_magic(tv, sv, 'P', Nullch, 0);
3860 SvREFCNT_dec(sv); /* Undo refcnt inc from sv_magic() */
3862 TRACEME(("ok (retrieve_tied_array at 0x%"UVxf")", PTR2UV(tv)));
3868 * retrieve_tied_hash
3870 * Retrieve tied hash
3871 * Layout is SX_TIED_HASH <object>, with SX_TIED_HASH already read.
3873 static SV *retrieve_tied_hash(stcxt_t *cxt, char *cname)
3878 TRACEME(("retrieve_tied_hash (#%d)", cxt->tagnum));
3880 tv = NEWSV(10002, 0);
3881 SEEN(tv, cname); /* Will return if tv is null */
3882 sv = retrieve(cxt, 0); /* Retrieve <object> */
3884 return (SV *) 0; /* Failed */
3886 sv_upgrade(tv, SVt_PVHV);
3887 sv_magic(tv, sv, 'P', Nullch, 0);
3888 SvREFCNT_dec(sv); /* Undo refcnt inc from sv_magic() */
3890 TRACEME(("ok (retrieve_tied_hash at 0x%"UVxf")", PTR2UV(tv)));
3896 * retrieve_tied_scalar
3898 * Retrieve tied scalar
3899 * Layout is SX_TIED_SCALAR <object>, with SX_TIED_SCALAR already read.
3901 static SV *retrieve_tied_scalar(stcxt_t *cxt, char *cname)
3906 TRACEME(("retrieve_tied_scalar (#%d)", cxt->tagnum));
3908 tv = NEWSV(10002, 0);
3909 SEEN(tv, cname); /* Will return if rv is null */
3910 sv = retrieve(cxt, 0); /* Retrieve <object> */
3912 return (SV *) 0; /* Failed */
3914 sv_upgrade(tv, SVt_PVMG);
3915 sv_magic(tv, sv, 'q', Nullch, 0);
3916 SvREFCNT_dec(sv); /* Undo refcnt inc from sv_magic() */
3918 TRACEME(("ok (retrieve_tied_scalar at 0x%"UVxf")", PTR2UV(tv)));
3926 * Retrieve reference to value in a tied hash.
3927 * Layout is SX_TIED_KEY <object> <key>, with SX_TIED_KEY already read.
3929 static SV *retrieve_tied_key(stcxt_t *cxt, char *cname)
3935 TRACEME(("retrieve_tied_key (#%d)", cxt->tagnum));
3937 tv = NEWSV(10002, 0);
3938 SEEN(tv, cname); /* Will return if tv is null */
3939 sv = retrieve(cxt, 0); /* Retrieve <object> */
3941 return (SV *) 0; /* Failed */
3943 key = retrieve(cxt, 0); /* Retrieve <key> */
3945 return (SV *) 0; /* Failed */
3947 sv_upgrade(tv, SVt_PVMG);
3948 sv_magic(tv, sv, 'p', (char *)key, HEf_SVKEY);
3949 SvREFCNT_dec(key); /* Undo refcnt inc from sv_magic() */
3950 SvREFCNT_dec(sv); /* Undo refcnt inc from sv_magic() */
3958 * Retrieve reference to value in a tied array.
3959 * Layout is SX_TIED_IDX <object> <idx>, with SX_TIED_IDX already read.
3961 static SV *retrieve_tied_idx(stcxt_t *cxt, char *cname)
3967 TRACEME(("retrieve_tied_idx (#%d)", cxt->tagnum));
3969 tv = NEWSV(10002, 0);
3970 SEEN(tv, cname); /* Will return if tv is null */
3971 sv = retrieve(cxt, 0); /* Retrieve <object> */
3973 return (SV *) 0; /* Failed */
3975 RLEN(idx); /* Retrieve <idx> */
3977 sv_upgrade(tv, SVt_PVMG);
3978 sv_magic(tv, sv, 'p', Nullch, idx);
3979 SvREFCNT_dec(sv); /* Undo refcnt inc from sv_magic() */
3988 * Retrieve defined long (string) scalar.
3990 * Layout is SX_LSCALAR <length> <data>, with SX_LSCALAR already read.
3991 * The scalar is "long" in that <length> is larger than LG_SCALAR so it
3992 * was not stored on a single byte.
3994 static SV *retrieve_lscalar(stcxt_t *cxt, char *cname)
4000 TRACEME(("retrieve_lscalar (#%d), len = %"IVdf, cxt->tagnum, len));
4003 * Allocate an empty scalar of the suitable length.
4006 sv = NEWSV(10002, len);
4007 SEEN(sv, cname); /* Associate this new scalar with tag "tagnum" */
4010 * WARNING: duplicates parts of sv_setpv and breaks SV data encapsulation.
4012 * Now, for efficiency reasons, read data directly inside the SV buffer,
4013 * and perform the SV final settings directly by duplicating the final
4014 * work done by sv_setpv. Since we're going to allocate lots of scalars
4015 * this way, it's worth the hassle and risk.
4018 SAFEREAD(SvPVX(sv), len, sv);
4019 SvCUR_set(sv, len); /* Record C string length */
4020 *SvEND(sv) = '\0'; /* Ensure it's null terminated anyway */
4021 (void) SvPOK_only(sv); /* Validate string pointer */
4022 if (cxt->s_tainted) /* Is input source tainted? */
4023 SvTAINT(sv); /* External data cannot be trusted */
4025 TRACEME(("large scalar len %"IVdf" '%s'", len, SvPVX(sv)));
4026 TRACEME(("ok (retrieve_lscalar at 0x%"UVxf")", PTR2UV(sv)));
4034 * Retrieve defined short (string) scalar.
4036 * Layout is SX_SCALAR <length> <data>, with SX_SCALAR already read.
4037 * The scalar is "short" so <length> is single byte. If it is 0, there
4038 * is no <data> section.
4040 static SV *retrieve_scalar(stcxt_t *cxt, char *cname)
4046 TRACEME(("retrieve_scalar (#%d), len = %d", cxt->tagnum, len));
4049 * Allocate an empty scalar of the suitable length.
4052 sv = NEWSV(10002, len);
4053 SEEN(sv, cname); /* Associate this new scalar with tag "tagnum" */
4056 * WARNING: duplicates parts of sv_setpv and breaks SV data encapsulation.
4061 * newSV did not upgrade to SVt_PV so the scalar is undefined.
4062 * To make it defined with an empty length, upgrade it now...
4063 * Don't upgrade to a PV if the original type contains more
4064 * information than a scalar.
4066 if (SvTYPE(sv) <= SVt_PV) {
4067 sv_upgrade(sv, SVt_PV);
4070 *SvEND(sv) = '\0'; /* Ensure it's null terminated anyway */
4071 TRACEME(("ok (retrieve_scalar empty at 0x%"UVxf")", PTR2UV(sv)));
4074 * Now, for efficiency reasons, read data directly inside the SV buffer,
4075 * and perform the SV final settings directly by duplicating the final
4076 * work done by sv_setpv. Since we're going to allocate lots of scalars
4077 * this way, it's worth the hassle and risk.
4079 SAFEREAD(SvPVX(sv), len, sv);
4080 SvCUR_set(sv, len); /* Record C string length */
4081 *SvEND(sv) = '\0'; /* Ensure it's null terminated anyway */
4082 TRACEME(("small scalar len %d '%s'", len, SvPVX(sv)));
4085 (void) SvPOK_only(sv); /* Validate string pointer */
4086 if (cxt->s_tainted) /* Is input source tainted? */
4087 SvTAINT(sv); /* External data cannot be trusted */
4089 TRACEME(("ok (retrieve_scalar at 0x%"UVxf")", PTR2UV(sv)));
4096 * Like retrieve_scalar(), but tag result as utf8.
4097 * If we're retrieving UTF8 data in a non-UTF8 perl, croaks.
4099 static SV *retrieve_utf8str(stcxt_t *cxt, char *cname)
4103 TRACEME(("retrieve_utf8str"));
4105 sv = retrieve_scalar(cxt, cname);
4115 * Like retrieve_lscalar(), but tag result as utf8.
4116 * If we're retrieving UTF8 data in a non-UTF8 perl, croaks.
4118 static SV *retrieve_lutf8str(stcxt_t *cxt, char *cname)
4122 TRACEME(("retrieve_lutf8str"));
4124 sv = retrieve_lscalar(cxt, cname);
4134 * Retrieve defined integer.
4135 * Layout is SX_INTEGER <data>, whith SX_INTEGER already read.
4137 static SV *retrieve_integer(stcxt_t *cxt, char *cname)
4142 TRACEME(("retrieve_integer (#%d)", cxt->tagnum));
4144 READ(&iv, sizeof(iv));
4146 SEEN(sv, cname); /* Associate this new scalar with tag "tagnum" */
4148 TRACEME(("integer %"IVdf, iv));
4149 TRACEME(("ok (retrieve_integer at 0x%"UVxf")", PTR2UV(sv)));
4157 * Retrieve defined integer in network order.
4158 * Layout is SX_NETINT <data>, whith SX_NETINT already read.
4160 static SV *retrieve_netint(stcxt_t *cxt, char *cname)
4165 TRACEME(("retrieve_netint (#%d)", cxt->tagnum));
4169 sv = newSViv((int) ntohl(iv));
4170 TRACEME(("network integer %d", (int) ntohl(iv)));
4173 TRACEME(("network integer (as-is) %d", iv));
4175 SEEN(sv, cname); /* Associate this new scalar with tag "tagnum" */
4177 TRACEME(("ok (retrieve_netint at 0x%"UVxf")", PTR2UV(sv)));
4185 * Retrieve defined double.
4186 * Layout is SX_DOUBLE <data>, whith SX_DOUBLE already read.
4188 static SV *retrieve_double(stcxt_t *cxt, char *cname)
4193 TRACEME(("retrieve_double (#%d)", cxt->tagnum));
4195 READ(&nv, sizeof(nv));
4197 SEEN(sv, cname); /* Associate this new scalar with tag "tagnum" */
4199 TRACEME(("double %"NVff, nv));
4200 TRACEME(("ok (retrieve_double at 0x%"UVxf")", PTR2UV(sv)));
4208 * Retrieve defined byte (small integer within the [-128, +127] range).
4209 * Layout is SX_BYTE <data>, whith SX_BYTE already read.
4211 static SV *retrieve_byte(stcxt_t *cxt, char *cname)
4215 signed char tmp; /* Workaround for AIX cc bug --H.Merijn Brand */
4217 TRACEME(("retrieve_byte (#%d)", cxt->tagnum));
4220 TRACEME(("small integer read as %d", (unsigned char) siv));
4221 tmp = (unsigned char) siv - 128;
4223 SEEN(sv, cname); /* Associate this new scalar with tag "tagnum" */
4225 TRACEME(("byte %d", tmp));
4226 TRACEME(("ok (retrieve_byte at 0x%"UVxf")", PTR2UV(sv)));
4234 * Return the undefined value.
4236 static SV *retrieve_undef(stcxt_t *cxt, char *cname)
4240 TRACEME(("retrieve_undef"));
4251 * Return the immortal undefined value.
4253 static SV *retrieve_sv_undef(stcxt_t *cxt, char *cname)
4255 SV *sv = &PL_sv_undef;
4257 TRACEME(("retrieve_sv_undef"));
4266 * Return the immortal yes value.
4268 static SV *retrieve_sv_yes(stcxt_t *cxt, char *cname)
4270 SV *sv = &PL_sv_yes;
4272 TRACEME(("retrieve_sv_yes"));
4281 * Return the immortal no value.
4283 static SV *retrieve_sv_no(stcxt_t *cxt, char *cname)
4287 TRACEME(("retrieve_sv_no"));
4296 * Retrieve a whole array.
4297 * Layout is SX_ARRAY <size> followed by each item, in increading index order.
4298 * Each item is stored as <object>.
4300 * When we come here, SX_ARRAY has been read already.
4302 static SV *retrieve_array(stcxt_t *cxt, char *cname)
4309 TRACEME(("retrieve_array (#%d)", cxt->tagnum));
4312 * Read length, and allocate array, then pre-extend it.
4316 TRACEME(("size = %d", len));
4318 SEEN(av, cname); /* Will return if array not allocated nicely */
4322 return (SV *) av; /* No data follow if array is empty */
4325 * Now get each item in turn...
4328 for (i = 0; i < len; i++) {
4329 TRACEME(("(#%d) item", i));
4330 sv = retrieve(cxt, 0); /* Retrieve item */
4333 if (av_store(av, i, sv) == 0)
4337 TRACEME(("ok (retrieve_array at 0x%"UVxf")", PTR2UV(av)));
4345 * Retrieve a whole hash table.
4346 * Layout is SX_HASH <size> followed by each key/value pair, in random order.
4347 * Keys are stored as <length> <data>, the <data> section being omitted
4349 * Values are stored as <object>.
4351 * When we come here, SX_HASH has been read already.
4353 static SV *retrieve_hash(stcxt_t *cxt, char *cname)
4361 TRACEME(("retrieve_hash (#%d)", cxt->tagnum));
4364 * Read length, allocate table.
4368 TRACEME(("size = %d", len));
4370 SEEN(hv, cname); /* Will return if table not allocated properly */
4372 return (SV *) hv; /* No data follow if table empty */
4373 hv_ksplit(hv, len); /* pre-extend hash to save multiple splits */
4376 * Now get each key/value pair in turn...
4379 for (i = 0; i < len; i++) {
4384 TRACEME(("(#%d) value", i));
4385 sv = retrieve(cxt, 0);
4391 * Since we're reading into kbuf, we must ensure we're not
4392 * recursing between the read and the hv_store() where it's used.
4393 * Hence the key comes after the value.
4396 RLEN(size); /* Get key size */
4397 KBUFCHK(size); /* Grow hash key read pool if needed */
4400 kbuf[size] = '\0'; /* Mark string end, just in case */
4401 TRACEME(("(#%d) key '%s'", i, kbuf));
4404 * Enter key/value pair into hash table.
4407 if (hv_store(hv, kbuf, (U32) size, sv, 0) == 0)
4411 TRACEME(("ok (retrieve_hash at 0x%"UVxf")", PTR2UV(hv)));
4419 * Retrieve a whole hash table.
4420 * Layout is SX_HASH <size> followed by each key/value pair, in random order.
4421 * Keys are stored as <length> <data>, the <data> section being omitted
4423 * Values are stored as <object>.
4425 * When we come here, SX_HASH has been read already.
4427 static SV *retrieve_flag_hash(stcxt_t *cxt, char *cname)
4436 GETMARK(hash_flags);
4437 TRACEME(("retrieve_flag_hash (#%d)", cxt->tagnum));
4439 * Read length, allocate table.
4443 TRACEME(("size = %d, flags = %d", len, hash_flags));
4445 SEEN(hv, cname); /* Will return if table not allocated properly */
4447 return (SV *) hv; /* No data follow if table empty */
4448 hv_ksplit(hv, len); /* pre-extend hash to save multiple splits */
4451 * Now get each key/value pair in turn...
4454 for (i = 0; i < len; i++) {
4456 int store_flags = 0;
4461 TRACEME(("(#%d) value", i));
4462 sv = retrieve(cxt, 0);
4467 if ((hash_flags & SHV_RESTRICTED) && (flags & SHV_K_LOCKED))
4470 if (flags & SHV_K_ISSV) {
4471 /* XXX you can't set a placeholder with an SV key.
4472 Then again, you can't get an SV key.
4473 Without messing around beyond what the API is supposed to do.
4476 TRACEME(("(#%d) keysv, flags=%d", i, flags));
4477 keysv = retrieve(cxt, 0);
4481 if (!hv_store_ent(hv, keysv, sv, 0))
4486 * Since we're reading into kbuf, we must ensure we're not
4487 * recursing between the read and the hv_store() where it's used.
4488 * Hence the key comes after the value.
4491 if (flags & SHV_K_PLACEHOLDER) {
4494 store_flags |= HVhek_PLACEHOLD;
4496 if (flags & SHV_K_UTF8)
4497 store_flags |= HVhek_UTF8;
4498 if (flags & SHV_K_WASUTF8)
4499 store_flags |= HVhek_WASUTF8;
4501 RLEN(size); /* Get key size */
4502 KBUFCHK(size); /* Grow hash key read pool if needed */
4505 kbuf[size] = '\0'; /* Mark string end, just in case */
4506 TRACEME(("(#%d) key '%s' flags %X store_flags %X", i, kbuf,
4507 flags, store_flags));
4510 * Enter key/value pair into hash table.
4513 if (hv_store_flags(hv, kbuf, size, sv, 0, flags) == 0)
4517 if (hash_flags & SHV_RESTRICTED)
4520 TRACEME(("ok (retrieve_hash at 0x%"UVxf")", PTR2UV(hv)));
4526 * old_retrieve_array
4528 * Retrieve a whole array in pre-0.6 binary format.
4530 * Layout is SX_ARRAY <size> followed by each item, in increading index order.
4531 * Each item is stored as SX_ITEM <object> or SX_IT_UNDEF for "holes".
4533 * When we come here, SX_ARRAY has been read already.
4535 static SV *old_retrieve_array(stcxt_t *cxt, char *cname)
4543 TRACEME(("old_retrieve_array (#%d)", cxt->tagnum));
4546 * Read length, and allocate array, then pre-extend it.
4550 TRACEME(("size = %d", len));
4552 SEEN(av, 0); /* Will return if array not allocated nicely */
4556 return (SV *) av; /* No data follow if array is empty */
4559 * Now get each item in turn...
4562 for (i = 0; i < len; i++) {
4564 if (c == SX_IT_UNDEF) {
4565 TRACEME(("(#%d) undef item", i));
4566 continue; /* av_extend() already filled us with undef */
4569 (void) retrieve_other((stcxt_t *) 0, 0); /* Will croak out */
4570 TRACEME(("(#%d) item", i));
4571 sv = retrieve(cxt, 0); /* Retrieve item */
4574 if (av_store(av, i, sv) == 0)
4578 TRACEME(("ok (old_retrieve_array at 0x%"UVxf")", PTR2UV(av)));
4586 * Retrieve a whole hash table in pre-0.6 binary format.
4588 * Layout is SX_HASH <size> followed by each key/value pair, in random order.
4589 * Keys are stored as SX_KEY <length> <data>, the <data> section being omitted
4591 * Values are stored as SX_VALUE <object> or SX_VL_UNDEF for "holes".
4593 * When we come here, SX_HASH has been read already.
4595 static SV *old_retrieve_hash(stcxt_t *cxt, char *cname)
4603 static SV *sv_h_undef = (SV *) 0; /* hv_store() bug */
4605 TRACEME(("old_retrieve_hash (#%d)", cxt->tagnum));
4608 * Read length, allocate table.
4612 TRACEME(("size = %d", len));
4614 SEEN(hv, 0); /* Will return if table not allocated properly */
4616 return (SV *) hv; /* No data follow if table empty */
4617 hv_ksplit(hv, len); /* pre-extend hash to save multiple splits */
4620 * Now get each key/value pair in turn...
4623 for (i = 0; i < len; i++) {
4629 if (c == SX_VL_UNDEF) {
4630 TRACEME(("(#%d) undef value", i));
4632 * Due to a bug in hv_store(), it's not possible to pass
4633 * &PL_sv_undef to hv_store() as a value, otherwise the
4634 * associated key will not be creatable any more. -- RAM, 14/01/97
4637 sv_h_undef = newSVsv(&PL_sv_undef);
4638 sv = SvREFCNT_inc(sv_h_undef);
4639 } else if (c == SX_VALUE) {
4640 TRACEME(("(#%d) value", i));
4641 sv = retrieve(cxt, 0);
4645 (void) retrieve_other((stcxt_t *) 0, 0); /* Will croak out */
4649 * Since we're reading into kbuf, we must ensure we're not
4650 * recursing between the read and the hv_store() where it's used.
4651 * Hence the key comes after the value.
4656 (void) retrieve_other((stcxt_t *) 0, 0); /* Will croak out */
4657 RLEN(size); /* Get key size */
4658 KBUFCHK(size); /* Grow hash key read pool if needed */
4661 kbuf[size] = '\0'; /* Mark string end, just in case */
4662 TRACEME(("(#%d) key '%s'", i, kbuf));
4665 * Enter key/value pair into hash table.
4668 if (hv_store(hv, kbuf, (U32) size, sv, 0) == 0)
4672 TRACEME(("ok (retrieve_hash at 0x%"UVxf")", PTR2UV(hv)));
4678 *** Retrieval engine.
4684 * Make sure the stored data we're trying to retrieve has been produced
4685 * on an ILP compatible system with the same byteorder. It croaks out in
4686 * case an error is detected. [ILP = integer-long-pointer sizes]
4687 * Returns null if error is detected, &PL_sv_undef otherwise.
4689 * Note that there's no byte ordering info emitted when network order was
4690 * used at store time.
4692 static SV *magic_check(stcxt_t *cxt)
4695 char byteorder[256];
4697 int use_network_order;
4699 int version_minor = 0;
4701 TRACEME(("magic_check"));
4704 * The "magic number" is only for files, not when freezing in memory.
4708 STRLEN len = sizeof(magicstr) - 1;
4711 READ(buf, len); /* Not null-terminated */
4712 buf[len] = '\0'; /* Is now */
4714 if (0 == strcmp(buf, magicstr))
4718 * Try to read more bytes to check for the old magic number, which
4722 old_len = sizeof(old_magicstr) - 1;
4723 READ(&buf[len], old_len - len);
4724 buf[old_len] = '\0'; /* Is now null-terminated */
4726 if (strcmp(buf, old_magicstr))
4727 CROAK(("File is not a perl storable"));
4732 * Starting with 0.6, the "use_network_order" byte flag is also used to
4733 * indicate the version number of the binary, and therefore governs the
4734 * setting of sv_retrieve_vtbl. See magic_write().
4737 GETMARK(use_network_order);
4738 version_major = use_network_order >> 1;
4739 cxt->retrieve_vtbl = version_major ? sv_retrieve : sv_old_retrieve;
4741 TRACEME(("magic_check: netorder = 0x%x", use_network_order));
4745 * Starting with 0.7 (binary major 2), a full byte is dedicated to the
4746 * minor version of the protocol. See magic_write().
4749 if (version_major > 1)
4750 GETMARK(version_minor);
4752 cxt->ver_major = version_major;
4753 cxt->ver_minor = version_minor;
4755 TRACEME(("binary image version is %d.%d", version_major, version_minor));
4758 * Inter-operability sanity check: we can't retrieve something stored
4759 * using a format more recent than ours, because we have no way to
4760 * know what has changed, and letting retrieval go would mean a probable
4761 * failure reporting a "corrupted" storable file.
4765 version_major > STORABLE_BIN_MAJOR ||
4766 (version_major == STORABLE_BIN_MAJOR &&
4767 version_minor > STORABLE_BIN_MINOR)
4769 CROAK(("Storable binary image v%d.%d more recent than I am (v%d.%d)",
4770 version_major, version_minor,
4771 STORABLE_BIN_MAJOR, STORABLE_BIN_MINOR));
4774 * If they stored using network order, there's no byte ordering
4775 * information to check.
4778 if ((cxt->netorder = (use_network_order & 0x1))) /* Extra () for -Wall */
4779 return &PL_sv_undef; /* No byte ordering info */
4781 sprintf(byteorder, "%lx", (unsigned long) BYTEORDER);
4783 READ(buf, c); /* Not null-terminated */
4784 buf[c] = '\0'; /* Is now */
4786 if (strcmp(buf, byteorder))
4787 CROAK(("Byte order is not compatible"));
4789 GETMARK(c); /* sizeof(int) */
4790 if ((int) c != sizeof(int))
4791 CROAK(("Integer size is not compatible"));
4793 GETMARK(c); /* sizeof(long) */
4794 if ((int) c != sizeof(long))
4795 CROAK(("Long integer size is not compatible"));
4797 GETMARK(c); /* sizeof(char *) */
4798 if ((int) c != sizeof(char *))
4799 CROAK(("Pointer integer size is not compatible"));
4801 if (version_major >= 2 && version_minor >= 2) {
4802 GETMARK(c); /* sizeof(NV) */
4803 if ((int) c != sizeof(NV))
4804 CROAK(("Double size is not compatible"));
4807 return &PL_sv_undef; /* OK */
4813 * Recursively retrieve objects from the specified file and return their
4814 * root SV (which may be an AV or an HV for what we care).
4815 * Returns null if there is a problem.
4817 static SV *retrieve(stcxt_t *cxt, char *cname)
4823 TRACEME(("retrieve"));
4826 * Grab address tag which identifies the object if we are retrieving
4827 * an older format. Since the new binary format counts objects and no
4828 * longer explicitely tags them, we must keep track of the correspondance
4831 * The following section will disappear one day when the old format is
4832 * no longer supported, hence the final "goto" in the "if" block.
4835 if (cxt->hseen) { /* Retrieving old binary */
4837 if (cxt->netorder) {
4839 READ(&nettag, sizeof(I32)); /* Ordered sequence of I32 */
4840 tag = (stag_t) nettag;
4842 READ(&tag, sizeof(stag_t)); /* Original address of the SV */
4845 if (type == SX_OBJECT) {
4847 svh = hv_fetch(cxt->hseen, (char *) &tag, sizeof(tag), FALSE);
4849 CROAK(("Old tag 0x%"UVxf" should have been mapped already",
4851 tagn = SvIV(*svh); /* Mapped tag number computed earlier below */
4854 * The following code is common with the SX_OBJECT case below.
4857 svh = av_fetch(cxt->aseen, tagn, FALSE);
4859 CROAK(("Object #%"IVdf" should have been retrieved already",
4862 TRACEME(("has retrieved #%d at 0x%"UVxf, tagn, PTR2UV(sv)));
4863 SvREFCNT_inc(sv); /* One more reference to this same sv */
4864 return sv; /* The SV pointer where object was retrieved */
4868 * Map new object, but don't increase tagnum. This will be done
4869 * by each of the retrieve_* functions when they call SEEN().
4871 * The mapping associates the "tag" initially present with a unique
4872 * tag number. See test for SX_OBJECT above to see how this is perused.
4875 if (!hv_store(cxt->hseen, (char *) &tag, sizeof(tag),
4876 newSViv(cxt->tagnum), 0))
4883 * Regular post-0.6 binary format.
4888 TRACEME(("retrieve type = %d", type));
4891 * Are we dealing with an object we should have already retrieved?
4894 if (type == SX_OBJECT) {
4898 svh = av_fetch(cxt->aseen, tag, FALSE);
4900 CROAK(("Object #%"IVdf" should have been retrieved already",
4903 TRACEME(("had retrieved #%d at 0x%"UVxf, tag, PTR2UV(sv)));
4904 SvREFCNT_inc(sv); /* One more reference to this same sv */
4905 return sv; /* The SV pointer where object was retrieved */
4908 first_time: /* Will disappear when support for old format is dropped */
4911 * Okay, first time through for this one.
4914 sv = RETRIEVE(cxt, type)(cxt, cname);
4916 return (SV *) 0; /* Failed */
4919 * Old binary formats (pre-0.7).
4921 * Final notifications, ended by SX_STORED may now follow.
4922 * Currently, the only pertinent notification to apply on the
4923 * freshly retrieved object is either:
4924 * SX_CLASS <char-len> <classname> for short classnames.
4925 * SX_LG_CLASS <int-len> <classname> for larger one (rare!).
4926 * Class name is then read into the key buffer pool used by
4927 * hash table key retrieval.
4930 if (cxt->ver_major < 2) {
4931 while ((type = GETCHAR()) != SX_STORED) {
4935 GETMARK(len); /* Length coded on a single char */
4937 case SX_LG_CLASS: /* Length coded on a regular integer */
4942 return (SV *) 0; /* Failed */
4944 KBUFCHK(len); /* Grow buffer as necessary */
4947 kbuf[len] = '\0'; /* Mark string end */
4952 TRACEME(("ok (retrieved 0x%"UVxf", refcnt=%d, %s)", PTR2UV(sv),
4953 SvREFCNT(sv) - 1, sv_reftype(sv, FALSE)));
4961 * Retrieve data held in file and return the root object.
4962 * Common routine for pretrieve and mretrieve.
4964 static SV *do_retrieve(
4971 int is_tainted; /* Is input source tainted? */
4972 int pre_06_fmt = 0; /* True with pre Storable 0.6 formats */
4974 TRACEME(("do_retrieve (optype = 0x%x)", optype));
4976 optype |= ST_RETRIEVE;
4979 * Sanity assertions for retrieve dispatch tables.
4982 ASSERT(sizeof(sv_old_retrieve) == sizeof(sv_retrieve),
4983 ("old and new retrieve dispatch table have same size"));
4984 ASSERT(sv_old_retrieve[SX_ERROR] == retrieve_other,
4985 ("SX_ERROR entry correctly initialized in old dispatch table"));
4986 ASSERT(sv_retrieve[SX_ERROR] == retrieve_other,
4987 ("SX_ERROR entry correctly initialized in new dispatch table"));
4990 * Workaround for CROAK leak: if they enter with a "dirty" context,
4991 * free up memory for them now.
4998 * Now that STORABLE_xxx hooks exist, it is possible that they try to
4999 * re-enter retrieve() via the hooks.
5003 cxt = allocate_context(cxt);
5007 ASSERT(cxt->entry == 1, ("starting new recursion"));
5008 ASSERT(!cxt->s_dirty, ("clean context"));
5013 * Data is loaded into the memory buffer when f is NULL, unless `in' is
5014 * also NULL, in which case we're expecting the data to already lie
5015 * in the buffer (dclone case).
5018 KBUFINIT(); /* Allocate hash key reading pool once */
5021 MBUF_SAVE_AND_LOAD(in);
5024 * Magic number verifications.
5026 * This needs to be done before calling init_retrieve_context()
5027 * since the format indication in the file are necessary to conduct
5028 * some of the initializations.
5031 cxt->fio = f; /* Where I/O are performed */
5033 if (!magic_check(cxt))
5034 CROAK(("Magic number checking on storable %s failed",
5035 cxt->fio ? "file" : "string"));
5037 TRACEME(("data stored in %s format",
5038 cxt->netorder ? "net order" : "native"));
5041 * Check whether input source is tainted, so that we don't wrongly
5042 * taint perfectly good values...
5044 * We assume file input is always tainted. If both `f' and `in' are
5045 * NULL, then we come from dclone, and tainted is already filled in
5046 * the context. That's a kludge, but the whole dclone() thing is
5047 * already quite a kludge anyway! -- RAM, 15/09/2000.
5050 is_tainted = f ? 1 : (in ? SvTAINTED(in) : cxt->s_tainted);
5051 TRACEME(("input source is %s", is_tainted ? "tainted" : "trusted"));
5052 init_retrieve_context(cxt, optype, is_tainted);
5054 ASSERT(is_retrieving(), ("within retrieve operation"));
5056 sv = retrieve(cxt, 0); /* Recursively retrieve object, get root SV */
5065 pre_06_fmt = cxt->hseen != NULL; /* Before we clean context */
5068 * The "root" context is never freed.
5071 clean_retrieve_context(cxt);
5072 if (cxt->prev) /* This context was stacked */
5073 free_context(cxt); /* It was not the "root" context */
5076 * Prepare returned value.
5080 TRACEME(("retrieve ERROR"));
5081 return &PL_sv_undef; /* Something went wrong, return undef */
5084 TRACEME(("retrieve got %s(0x%"UVxf")",
5085 sv_reftype(sv, FALSE), PTR2UV(sv)));
5088 * Backward compatibility with Storable-0.5@9 (which we know we
5089 * are retrieving if hseen is non-null): don't create an extra RV
5090 * for objects since we special-cased it at store time.
5092 * Build a reference to the SV returned by pretrieve even if it is
5093 * already one and not a scalar, for consistency reasons.
5096 if (pre_06_fmt) { /* Was not handling overloading by then */
5098 TRACEME(("fixing for old formats -- pre 0.6"));
5099 if (sv_type(sv) == svis_REF && (rv = SvRV(sv)) && SvOBJECT(rv)) {
5100 TRACEME(("ended do_retrieve() with an object -- pre 0.6"));
5106 * If reference is overloaded, restore behaviour.
5108 * NB: minor glitch here: normally, overloaded refs are stored specially
5109 * so that we can croak when behaviour cannot be re-installed, and also
5110 * avoid testing for overloading magic at each reference retrieval.
5112 * Unfortunately, the root reference is implicitely stored, so we must
5113 * check for possible overloading now. Furthermore, if we don't restore
5114 * overloading, we cannot croak as if the original ref was, because we
5115 * have no way to determine whether it was an overloaded ref or not in
5118 * It's a pity that overloading magic is attached to the rv, and not to
5119 * the underlying sv as blessing is.
5123 HV *stash = (HV *) SvSTASH(sv);
5124 SV *rv = newRV_noinc(sv);
5125 if (stash && Gv_AMG(stash)) {
5127 TRACEME(("restored overloading on root reference"));
5129 TRACEME(("ended do_retrieve() with an object"));
5133 TRACEME(("regular do_retrieve() end"));
5135 return newRV_noinc(sv);
5141 * Retrieve data held in file and return the root object, undef on error.
5143 SV *pretrieve(PerlIO *f)
5145 TRACEME(("pretrieve"));
5146 return do_retrieve(f, Nullsv, 0);
5152 * Retrieve data held in scalar and return the root object, undef on error.
5154 SV *mretrieve(SV *sv)
5156 TRACEME(("mretrieve"));
5157 return do_retrieve((PerlIO*) 0, sv, 0);
5167 * Deep clone: returns a fresh copy of the original referenced SV tree.
5169 * This is achieved by storing the object in memory and restoring from
5170 * there. Not that efficient, but it should be faster than doing it from
5177 stcxt_t *real_context;
5180 TRACEME(("dclone"));
5183 * Workaround for CROAK leak: if they enter with a "dirty" context,
5184 * free up memory for them now.
5191 * do_store() optimizes for dclone by not freeing its context, should
5192 * we need to allocate one because we're deep cloning from a hook.
5195 if (!do_store((PerlIO*) 0, sv, ST_CLONE, FALSE, (SV**) 0))
5196 return &PL_sv_undef; /* Error during store */
5199 * Because of the above optimization, we have to refresh the context,
5200 * since a new one could have been allocated and stacked by do_store().
5203 { dSTCXT; real_context = cxt; } /* Sub-block needed for macro */
5204 cxt = real_context; /* And we need this temporary... */
5207 * Now, `cxt' may refer to a new context.
5210 ASSERT(!cxt->s_dirty, ("clean context"));
5211 ASSERT(!cxt->entry, ("entry will not cause new context allocation"));
5214 TRACEME(("dclone stored %d bytes", size));
5218 * Since we're passing do_retrieve() both a NULL file and sv, we need
5219 * to pre-compute the taintedness of the input by setting cxt->tainted
5220 * to whatever state our own input string was. -- RAM, 15/09/2000
5222 * do_retrieve() will free non-root context.
5225 cxt->s_tainted = SvTAINTED(sv);
5226 out = do_retrieve((PerlIO*) 0, Nullsv, ST_CLONE);
5228 TRACEME(("dclone returns 0x%"UVxf, PTR2UV(out)));
5238 * The Perl IO GV object distinguishes between input and output for sockets
5239 * but not for plain files. To allow Storable to transparently work on
5240 * plain files and sockets transparently, we have to ask xsubpp to fetch the
5241 * right object for us. Hence the OutputStream and InputStream declarations.
5243 * Before perl 5.004_05, those entries in the standard typemap are not
5244 * defined in perl include files, so we do that here.
5247 #ifndef OutputStream
5248 #define OutputStream PerlIO *
5249 #define InputStream PerlIO *
5250 #endif /* !OutputStream */
5252 MODULE = Storable PACKAGE = Storable
5290 last_op_in_netorder()