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