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