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