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