3 #define PERL_NO_GET_CONTEXT
10 #ifndef PERL_COMBI_VERSION
11 #define PERL_COMBI_VERSION (PERL_REVISION * 1000000 + PERL_VERSION * 1000 + \
15 /* Not yet in ppport.h */
17 # define CvISXSUB(cv) (CvXSUB(cv) ? TRUE : FALSE)
20 # define SvRV_const(rv) SvRV(rv)
23 # define SvOOK_offset(sv, len) STMT_START { len = SvIVX(sv); } STMT_END
26 # define SvIsCOW(sv) ((SvFLAGS(sv) & (SVf_FAKE | SVf_READONLY)) == \
27 (SVf_FAKE | SVf_READONLY))
29 #ifndef SvIsCOW_shared_hash
30 # define SvIsCOW_shared_hash(sv) (SvIsCOW(sv) && SvLEN(sv) == 0)
32 #ifndef SvSHARED_HEK_FROM_PV
33 # define SvSHARED_HEK_FROM_PV(pvx) \
34 ((struct hek*)(pvx - STRUCT_OFFSET(struct hek, hek_key)))
38 # define PL_opargs opargs
39 # define PL_op_name op_name
43 /* "structured exception" handling is a Microsoft extension to C and C++.
44 It's *not* C++ exception handling - C++ exception handling can't capture
45 SEGVs and suchlike, whereas this can. There's no known analagous
46 functionality on other platforms. */
48 # define TRY_TO_CATCH_SEGV __try
49 # define CAUGHT_EXCEPTION __except(EXCEPTION_EXECUTE_HANDLER)
51 # define TRY_TO_CATCH_SEGV if(1)
52 # define CAUGHT_EXCEPTION else
56 # define __attribute__(x)
59 #if 0 && defined(DEBUGGING)
60 #define dbg_printf(x) printf x
65 #define TAG /* printf( "# %s(%d)\n", __FILE__, __LINE__ ) */
68 /* The idea is to have a tree structure to store 1 bit per possible pointer
69 address. The lowest 16 bits are stored in a block of 8092 bytes.
70 The blocks are in a 256-way tree, indexed by the reset of the pointer.
71 This can cope with 32 and 64 bit pointers, and any address space layout,
72 without excessive memory needs. The assumption is that your CPU cache
73 works :-) (And that we're not going to bust it) */
76 #define LEAF_BITS (16 - BYTE_BITS)
77 #define LEAF_MASK 0x1FFF
85 /* My hunch (not measured) is that for most architectures pointers will
86 start with 0 bits, hence the start of this array will be hot, and the
87 end unused. So put the flags next to the hot end. */
92 Checks to see if thing is in the bitstring.
93 Returns true or false, and
94 notes thing in the segmented bitstring.
97 check_new(struct state *st, const void *const p) {
98 unsigned int bits = 8 * sizeof(void*);
99 const size_t raw_p = PTR2nat(p);
100 /* This effectively rotates the value right by the number of low always-0
101 bits in an aligned pointer. The assmption is that most (if not all)
102 pointers are aligned, and these will be in the same chain of nodes
103 (and hence hot in the cache) but we can still deal with any unaligned
105 const size_t cooked_p
106 = (raw_p >> ALIGN_BITS) | (raw_p << (bits - ALIGN_BITS));
107 const U8 this_bit = 1 << (cooked_p & 0x7);
111 void **tv_p = (void **) (st->tracking);
113 if (NULL == p) return FALSE;
115 const char c = *(const char *)p;
118 if (st->dangle_whine)
119 warn( "Devel::Size: Encountered invalid pointer: %p\n", p );
125 /* bits now 24 (32 bit pointers) or 56 (64 bit pointers) */
127 /* First level is always present. */
129 i = (unsigned int)((cooked_p >> bits) & 0xFF);
131 Newxz(tv_p[i], 256, void *);
132 tv_p = (void **)(tv_p[i]);
134 } while (bits > LEAF_BITS + BYTE_BITS);
135 /* bits now 16 always */
136 #if !defined(MULTIPLICITY) || PERL_VERSION > 8 || (PERL_VERSION == 8 && PERL_SUBVERSION > 8)
137 /* 5.8.8 and early have an assert() macro that uses Perl_croak, hence needs
138 a my_perl under multiplicity */
141 leaf_p = (U8 **)tv_p;
142 i = (unsigned int)((cooked_p >> bits) & 0xFF);
144 Newxz(leaf_p[i], 1 << LEAF_BITS, U8);
149 i = (unsigned int)((cooked_p >> BYTE_BITS) & LEAF_MASK);
151 if(leaf[i] & this_bit)
159 free_tracking_at(void **tv, int level)
167 free_tracking_at((void **) tv[i], level);
181 free_state(struct state *st)
183 const int top_level = (sizeof(void *) * 8 - LEAF_BITS - BYTE_BITS) / 8;
184 free_tracking_at((void **)st->tracking, top_level);
188 /* For now, this is somewhat a compatibility bodge until the plan comes
189 together for fine grained recursion control. total_size() would recurse into
190 hash and array members, whereas sv_size() would not. However, sv_size() is
191 called with CvSTASH() of a CV, which means that if it (also) starts to
192 recurse fully, then the size of any CV now becomes the size of the entire
193 symbol table reachable from it, and potentially the entire symbol table, if
194 any subroutine makes a reference to a global (such as %SIG). The historical
195 implementation of total_size() didn't report "everything", and changing the
196 only available size to "everything" doesn't feel at all useful. */
198 #define NO_RECURSION 0
199 #define SOME_RECURSION 1
200 #define TOTAL_SIZE_RECURSION 2
202 static void sv_size(pTHX_ struct state *, const SV *const, const int recurse);
218 , OPc_CONDOP /* 12 */
233 cc_opclass(const OP * const o)
239 return (o->op_flags & OPf_KIDS) ? OPc_UNOP : OPc_BASEOP;
241 if (o->op_type == OP_SASSIGN)
242 return ((o->op_private & OPpASSIGN_BACKWARDS) ? OPc_UNOP : OPc_BINOP);
245 if (o->op_type == OP_GV || o->op_type == OP_GVSV || o->op_type == OP_AELEMFAST)
249 if ((o->op_type == OP_TRANS)) {
253 switch (PL_opargs[o->op_type] & OA_CLASS_MASK) {
285 #ifdef OA_PVOP_OR_SVOP
286 case OA_PVOP_OR_SVOP: TAG;
288 * Character translations (tr///) are usually a PVOP, keeping a
289 * pointer to a table of shorts used to look up translations.
290 * Under utf8, however, a simple table isn't practical; instead,
291 * the OP is an SVOP, and the SV is a reference to a swash
292 * (i.e., an RV pointing to an HV).
294 return (o->op_private & (OPpTRANS_TO_UTF|OPpTRANS_FROM_UTF))
295 ? OPc_SVOP : OPc_PVOP;
304 case OA_BASEOP_OR_UNOP: TAG;
306 * UNI(OP_foo) in toke.c returns token UNI or FUNC1 depending on
307 * whether parens were seen. perly.y uses OPf_SPECIAL to
308 * signal whether a BASEOP had empty parens or none.
309 * Some other UNOPs are created later, though, so the best
310 * test is OPf_KIDS, which is set in newUNOP.
312 return (o->op_flags & OPf_KIDS) ? OPc_UNOP : OPc_BASEOP;
314 case OA_FILESTATOP: TAG;
316 * The file stat OPs are created via UNI(OP_foo) in toke.c but use
317 * the OPf_REF flag to distinguish between OP types instead of the
318 * usual OPf_SPECIAL flag. As usual, if OPf_KIDS is set, then we
319 * return OPc_UNOP so that walkoptree can find our children. If
320 * OPf_KIDS is not set then we check OPf_REF. Without OPf_REF set
321 * (no argument to the operator) it's an OP; with OPf_REF set it's
322 * an SVOP (and op_sv is the GV for the filehandle argument).
324 return ((o->op_flags & OPf_KIDS) ? OPc_UNOP :
326 (o->op_flags & OPf_REF) ? OPc_PADOP : OPc_BASEOP);
328 (o->op_flags & OPf_REF) ? OPc_SVOP : OPc_BASEOP);
330 case OA_LOOPEXOP: TAG;
332 * next, last, redo, dump and goto use OPf_SPECIAL to indicate that a
333 * label was omitted (in which case it's a BASEOP) or else a term was
334 * seen. In this last case, all except goto are definitely PVOP but
335 * goto is either a PVOP (with an ordinary constant label), an UNOP
336 * with OPf_STACKED (with a non-constant non-sub) or an UNOP for
337 * OP_REFGEN (with goto &sub) in which case OPf_STACKED also seems to
340 if (o->op_flags & OPf_STACKED)
342 else if (o->op_flags & OPf_SPECIAL)
357 case OA_UNOP_AUX: TAG;
361 warn("Devel::Size: Can't determine class of operator %s, assuming BASEOP\n",
362 PL_op_name[o->op_type]);
368 /* Figure out how much magic is attached to the SV and return the
371 magic_size(pTHX_ const SV * const thing, struct state *st) {
372 MAGIC *magic_pointer = SvMAGIC(thing);
374 /* Have we seen the magic pointer? (NULL has always been seen before) */
375 while (check_new(st, magic_pointer)) {
376 st->total_size += sizeof(MAGIC);
377 /* magic vtables aren't freed when magic is freed, so don't count them.
378 (They are static structures. Anything that assumes otherwise is buggy.)
383 sv_size(aTHX_ st, magic_pointer->mg_obj, TOTAL_SIZE_RECURSION);
384 if (magic_pointer->mg_len == HEf_SVKEY) {
385 sv_size(aTHX_ st, (SV *)magic_pointer->mg_ptr, TOTAL_SIZE_RECURSION);
387 #if defined(PERL_MAGIC_utf8) && defined (PERL_MAGIC_UTF8_CACHESIZE)
388 else if (magic_pointer->mg_type == PERL_MAGIC_utf8) {
389 if (check_new(st, magic_pointer->mg_ptr)) {
390 st->total_size += PERL_MAGIC_UTF8_CACHESIZE * 2 * sizeof(STRLEN);
394 else if (magic_pointer->mg_len > 0) {
395 if (check_new(st, magic_pointer->mg_ptr)) {
396 st->total_size += magic_pointer->mg_len;
400 /* Get the next in the chain */
401 magic_pointer = magic_pointer->mg_moremagic;
404 if (st->dangle_whine)
405 warn( "Devel::Size: Encountered bad magic at: %p\n", magic_pointer );
411 check_new_and_strlen(struct state *st, const char *const p) {
413 st->total_size += 1 + strlen(p);
417 regex_size(const REGEXP * const baseregex, struct state *st) {
418 if(!check_new(st, baseregex))
420 st->total_size += sizeof(REGEXP);
421 #if (PERL_VERSION < 11)
422 /* Note the size of the paren offset thing */
423 st->total_size += sizeof(I32) * baseregex->nparens * 2;
424 st->total_size += strlen(baseregex->precomp);
426 st->total_size += sizeof(struct regexp);
427 st->total_size += sizeof(I32) * SvANY(baseregex)->nparens * 2;
428 /*st->total_size += strlen(SvANY(baseregex)->subbeg);*/
430 if (st->go_yell && !st->regex_whine) {
431 carp("Devel::Size: Calculated sizes for compiled regexes are incompatible, and probably always will be");
437 op_size(pTHX_ const OP * const baseop, struct state *st)
441 if(!check_new(st, baseop))
444 op_size(aTHX_ baseop->op_next, st);
446 switch (cc_opclass(baseop)) {
447 case OPc_BASEOP: TAG;
448 st->total_size += sizeof(struct op);
451 st->total_size += sizeof(struct unop);
452 op_size(aTHX_ ((UNOP *)baseop)->op_first, st);
455 st->total_size += sizeof(struct binop);
456 op_size(aTHX_ ((BINOP *)baseop)->op_first, st);
457 op_size(aTHX_ ((BINOP *)baseop)->op_last, st);
460 st->total_size += sizeof(struct logop);
461 op_size(aTHX_ ((BINOP *)baseop)->op_first, st);
462 op_size(aTHX_ ((LOGOP *)baseop)->op_other, st);
465 case OPc_CONDOP: TAG;
466 st->total_size += sizeof(struct condop);
467 op_size(aTHX_ ((BINOP *)baseop)->op_first, st);
468 op_size(aTHX_ ((CONDOP *)baseop)->op_true, st);
469 op_size(aTHX_ ((CONDOP *)baseop)->op_false, st);
472 case OPc_LISTOP: TAG;
473 st->total_size += sizeof(struct listop);
474 op_size(aTHX_ ((LISTOP *)baseop)->op_first, st);
475 op_size(aTHX_ ((LISTOP *)baseop)->op_last, st);
478 st->total_size += sizeof(struct pmop);
479 op_size(aTHX_ ((PMOP *)baseop)->op_first, st);
480 op_size(aTHX_ ((PMOP *)baseop)->op_last, st);
481 #if PERL_VERSION < 9 || (PERL_VERSION == 9 && PERL_SUBVERSION < 5)
482 op_size(aTHX_ ((PMOP *)baseop)->op_pmreplroot, st);
483 op_size(aTHX_ ((PMOP *)baseop)->op_pmreplstart, st);
485 /* This is defined away in perl 5.8.x, but it is in there for
488 regex_size(PM_GETRE((PMOP *)baseop), st);
490 regex_size(((PMOP *)baseop)->op_pmregexp, st);
494 st->total_size += sizeof(struct pmop);
495 if (!(baseop->op_type == OP_AELEMFAST
496 && baseop->op_flags & OPf_SPECIAL)) {
497 /* not an OP_PADAV replacement */
498 sv_size(aTHX_ st, ((SVOP *)baseop)->op_sv, SOME_RECURSION);
503 st->total_size += sizeof(struct padop);
508 st->total_size += sizeof(struct gvop);
509 sv_size(aTHX_ st, ((GVOP *)baseop)->op_gv, SOME_RECURSION);
513 check_new_and_strlen(st, ((PVOP *)baseop)->op_pv);
516 st->total_size += sizeof(struct loop);
517 op_size(aTHX_ ((LOOP *)baseop)->op_first, st);
518 op_size(aTHX_ ((LOOP *)baseop)->op_last, st);
519 op_size(aTHX_ ((LOOP *)baseop)->op_redoop, st);
520 op_size(aTHX_ ((LOOP *)baseop)->op_nextop, st);
521 op_size(aTHX_ ((LOOP *)baseop)->op_lastop, st);
526 basecop = (COP *)baseop;
527 st->total_size += sizeof(struct cop);
529 /* Change 33656 by nicholas@mouse-mill on 2008/04/07 11:29:51
530 Eliminate cop_label from struct cop by storing a label as the first
531 entry in the hints hash. Most statements don't have labels, so this
532 will save memory. Not sure how much.
533 The check below will be incorrect fail on bleadperls
534 before 5.11 @33656, but later than 5.10, producing slightly too
535 small memory sizes on these Perls. */
536 #if (PERL_VERSION < 11)
537 check_new_and_strlen(st, basecop->cop_label);
540 check_new_and_strlen(st, basecop->cop_file);
541 #if PERL_VERSION < 17 || (PERL_VERSION == 17 && PERL_SUBVERSION == 0)
542 /* This pointer is owned by the COP, and freed with it. */
543 check_new_and_strlen(st, basecop->cop_stashpv);
545 /* A per-interpreter pointer for this stash is allocated in
547 if (check_new(st, PL_stashpad + basecop->cop_stashoff))
548 st->total_size += sizeof(PL_stashpad[basecop->cop_stashoff]);
551 sv_size(aTHX_ st, (SV *)basecop->cop_filegv, SOME_RECURSION);
557 case OPc_METHOP: TAG;
558 st->total_size += sizeof(struct methop);
559 if (baseop->op_type == OP_METHOD)
560 op_size(aTHX_ ((UNOP *)baseop)->op_first, st);
562 sv_size(aTHX_ st, cMETHOPx_meth(baseop), SOME_RECURSION);
563 #if PERL_VERSION*1000+PERL_SUBVERSION >= 21007
564 if (baseop->op_type == OP_METHOD_REDIR || baseop->op_type == OP_METHOD_REDIR_SUPER) {
565 SV *rclass = cMETHOPx_rclass(baseop);
566 if(SvTYPE(rclass) != SVt_PVHV)
567 sv_size(aTHX_ st, rclass, SOME_RECURSION);
573 case OPc_UNAUXOP: TAG;
574 st->total_size += sizeof(struct unop_aux) + sizeof(UNOP_AUX_item) * (cUNOP_AUXx(baseop)->op_aux[-1].uv+1);
575 op_size(aTHX_ ((UNOP *)baseop)->op_first, st);
576 if (baseop->op_type == OP_MULTIDEREF) {
577 UNOP_AUX_item *items = cUNOP_AUXx(baseop)->op_aux;
578 UV actions = items->uv;
582 switch (actions & MDEREF_ACTION_MASK) {
584 actions = (++items)->uv;
586 case MDEREF_HV_padhv_helem:
587 case MDEREF_HV_gvhv_helem:
588 case MDEREF_HV_gvsv_vivify_rv2hv_helem:
589 case MDEREF_HV_padsv_vivify_rv2hv_helem:
591 case MDEREF_AV_padav_aelem:
592 case MDEREF_AV_gvav_aelem:
593 case MDEREF_AV_gvsv_vivify_rv2av_aelem:
594 case MDEREF_AV_padsv_vivify_rv2av_aelem:
597 case MDEREF_HV_pop_rv2hv_helem:
598 case MDEREF_HV_vivify_rv2hv_helem:
600 case MDEREF_AV_pop_rv2av_aelem:
601 case MDEREF_AV_vivify_rv2av_aelem:
603 switch (actions & MDEREF_INDEX_MASK) {
604 case MDEREF_INDEX_none:
607 case MDEREF_INDEX_const:
611 SV *key = PAD_SVl(items->pad_offset);
615 sv_size(aTHX_ st, key, SOME_RECURSION);
618 case MDEREF_INDEX_padsv:
619 case MDEREF_INDEX_gvsv:
623 if (actions & MDEREF_FLAG_last)
631 actions >>= MDEREF_SHIFT;
641 if (st->dangle_whine)
642 warn( "Devel::Size: Encountered dangling pointer in opcode at: %p\n", baseop );
647 hek_size(pTHX_ struct state *st, HEK *hek, U32 shared)
649 /* Hash keys can be shared. Have we seen this before? */
650 if (!check_new(st, hek))
652 st->total_size += HEK_BASESIZE + hek->hek_len
654 + 1 /* No hash key flags prior to 5.8.0 */
660 #if PERL_VERSION < 10
661 st->total_size += sizeof(struct he);
663 st->total_size += STRUCT_OFFSET(struct shared_he, shared_he_hek);
669 #if PERL_VERSION < 8 || PERL_SUBVERSION < 9
674 # define MAYBE_PURIFY(normal, pure) (pure)
675 # define MAYBE_OFFSET(struct_name, member) 0
677 # define MAYBE_PURIFY(normal, pure) (normal)
678 # define MAYBE_OFFSET(struct_name, member) STRUCT_OFFSET(struct_name, member)
681 const U8 body_sizes[SVt_LAST] = {
684 MAYBE_PURIFY(sizeof(IV), sizeof(XPVIV)), /* SVt_IV */
685 MAYBE_PURIFY(sizeof(NV), sizeof(XPVNV)), /* SVt_NV */
686 sizeof(XRV), /* SVt_RV */
687 sizeof(XPV), /* SVt_PV */
688 sizeof(XPVIV), /* SVt_PVIV */
689 sizeof(XPVNV), /* SVt_PVNV */
690 sizeof(XPVMG), /* SVt_PVMG */
691 sizeof(XPVBM), /* SVt_PVBM */
692 sizeof(XPVLV), /* SVt_PVLV */
693 sizeof(XPVAV), /* SVt_PVAV */
694 sizeof(XPVHV), /* SVt_PVHV */
695 sizeof(XPVCV), /* SVt_PVCV */
696 sizeof(XPVGV), /* SVt_PVGV */
697 sizeof(XPVFM), /* SVt_PVFM */
698 sizeof(XPVIO) /* SVt_PVIO */
699 #elif PERL_VERSION == 10 && PERL_SUBVERSION == 0
703 MAYBE_PURIFY(sizeof(NV), sizeof(XPVNV)), /* SVt_NV */
705 MAYBE_PURIFY(sizeof(xpv_allocated), sizeof(XPV)), /* SVt_PV */
706 MAYBE_PURIFY(sizeof(xpviv_allocated), sizeof(XPVIV)),/* SVt_PVIV */
707 sizeof(XPVNV), /* SVt_PVNV */
708 sizeof(XPVMG), /* SVt_PVMG */
709 sizeof(XPVGV), /* SVt_PVGV */
710 sizeof(XPVLV), /* SVt_PVLV */
711 MAYBE_PURIFY(sizeof(xpvav_allocated), sizeof(XPVAV)),/* SVt_PVAV */
712 MAYBE_PURIFY(sizeof(xpvhv_allocated), sizeof(XPVHV)),/* SVt_PVHV */
713 MAYBE_PURIFY(sizeof(xpvcv_allocated), sizeof(XPVCV)),/* SVt_PVCV */
714 MAYBE_PURIFY(sizeof(xpvfm_allocated), sizeof(XPVFM)),/* SVt_PVFM */
715 sizeof(XPVIO), /* SVt_PVIO */
716 #elif PERL_VERSION == 10 && PERL_SUBVERSION == 1
720 MAYBE_PURIFY(sizeof(NV), sizeof(XPVNV)), /* SVt_NV */
722 sizeof(XPV) - MAYBE_OFFSET(XPV, xpv_cur), /* SVt_PV */
723 sizeof(XPVIV) - MAYBE_OFFSET(XPV, xpv_cur), /* SVt_PVIV */
724 sizeof(XPVNV), /* SVt_PVNV */
725 sizeof(XPVMG), /* SVt_PVMG */
726 sizeof(XPVGV), /* SVt_PVGV */
727 sizeof(XPVLV), /* SVt_PVLV */
728 sizeof(XPVAV) - MAYBE_OFFSET(XPVAV, xav_fill), /* SVt_PVAV */
729 sizeof(XPVHV) - MAYBE_OFFSET(XPVHV, xhv_fill), /* SVt_PVHV */
730 sizeof(XPVCV) - MAYBE_OFFSET(XPVCV, xpv_cur), /* SVt_PVCV */
731 sizeof(XPVFM) - MAYBE_OFFSET(XPVFM, xpv_cur), /* SVt_PVFM */
732 sizeof(XPVIO) /* SVt_PVIO */
733 #elif PERL_VERSION < 13
737 MAYBE_PURIFY(sizeof(NV), sizeof(XPVNV)), /* SVt_NV */
738 sizeof(XPV) - MAYBE_OFFSET(XPV, xpv_cur), /* SVt_PV */
739 sizeof(XPVIV) - MAYBE_OFFSET(XPV, xpv_cur), /* SVt_PVIV */
740 sizeof(XPVNV), /* SVt_PVNV */
741 sizeof(XPVMG), /* SVt_PVMG */
742 sizeof(regexp) - MAYBE_OFFSET(regexp, xpv_cur), /* SVt_REGEXP */
743 sizeof(XPVGV), /* SVt_PVGV */
744 sizeof(XPVLV), /* SVt_PVLV */
745 sizeof(XPVAV) - MAYBE_OFFSET(XPVAV, xav_fill), /* SVt_PVAV */
746 sizeof(XPVHV) - MAYBE_OFFSET(XPVHV, xhv_fill), /* SVt_PVHV */
747 sizeof(XPVCV) - MAYBE_OFFSET(XPVCV, xpv_cur), /* SVt_PVCV */
748 sizeof(XPVFM) - MAYBE_OFFSET(XPVFM, xpv_cur), /* SVt_PVFM */
749 sizeof(XPVIO) /* SVt_PVIO */
754 MAYBE_PURIFY(sizeof(NV), sizeof(XPVNV)), /* SVt_NV */
755 sizeof(XPV) - MAYBE_OFFSET(XPV, xpv_cur), /* SVt_PV */
756 sizeof(XPVIV) - MAYBE_OFFSET(XPV, xpv_cur), /* SVt_PVIV */
757 sizeof(XPVNV) - MAYBE_OFFSET(XPV, xpv_cur), /* SVt_PVNV */
758 sizeof(XPVMG), /* SVt_PVMG */
759 sizeof(regexp), /* SVt_REGEXP */
760 sizeof(XPVGV), /* SVt_PVGV */
761 sizeof(XPVLV), /* SVt_PVLV */
762 sizeof(XPVAV), /* SVt_PVAV */
763 sizeof(XPVHV), /* SVt_PVHV */
764 sizeof(XPVCV), /* SVt_PVCV */
765 sizeof(XPVFM), /* SVt_PVFM */
766 sizeof(XPVIO) /* SVt_PVIO */
770 #if PERL_COMBI_VERSION < 5008001
775 padlist_size(pTHX_ struct state *const st, const PADLIST * const padl,
778 #if PERL_VERSION*1000+PERL_SUBVERSION >= 21007
779 /* This is, as ever, excessively nosey with the implementation, and hence
782 const PADNAMELIST *pnl;
784 if (!check_new(st, padl))
786 st->total_size += sizeof(PADLIST);
788 st->total_size += sizeof(PADNAMELIST);
789 pnl = PadlistNAMES(padl);
790 st->total_size += pnl->xpadnl_max * sizeof(PADNAME *);
791 i = PadnamelistMAX(pnl) + 1;
793 const PADNAME *const pn =
794 PadnamelistARRAY(pnl)[i];
795 if (!pn || pn == &PL_padname_undef || pn == &PL_padname_const)
797 if (!check_new(st, pn))
799 st->total_size += STRUCT_OFFSET(struct padname_with_str, xpadn_str[0])
800 + PadnameLEN(pn) + 1;
803 i = PadlistMAX(padl) + 1;
804 st->total_size += sizeof(PAD*) * i;
806 sv_size(aTHX_ st, (SV*)PadlistARRAY(padl)[i], recurse);
808 #elif defined PadlistNAMES
811 if (!check_new(st, padl))
813 st->total_size += sizeof(PADLIST);
814 sv_size(aTHX_ st, (SV*)PadlistNAMES(padl), TOTAL_SIZE_RECURSION);
815 i = PadlistMAX(padl) + 1;
816 st->total_size += sizeof(PAD*) * i;
818 sv_size(aTHX_ st, (SV*)PadlistARRAY(padl)[i], recurse);
822 sv_size(aTHX_ st, (SV*)padl, recurse);
828 sv_size(pTHX_ struct state *const st, const SV * const orig_thing,
830 const SV *thing = orig_thing;
833 if(!check_new(st, thing))
836 type = SvTYPE(thing);
837 if (type > SVt_LAST) {
838 warn("Devel::Size: Unknown variable type: %d encountered\n", type);
841 st->total_size += sizeof(SV) + body_sizes[type];
843 if (SvMAGICAL(thing)) {
844 magic_size(aTHX_ thing, st);
848 #if (PERL_VERSION < 11)
849 /* Is it a reference? */
854 if(recurse && SvROK(thing))
855 sv_size(aTHX_ st, SvRV_const(thing), recurse);
859 /* Is there anything in the array? */
860 if (AvMAX(thing) != -1) {
861 /* an array with 10 slots has AvMax() set to 9 - te 2007-04-22 */
862 st->total_size += sizeof(SV *) * (AvMAX(thing) + 1);
863 dbg_printf(("total_size: %li AvMAX: %li av_len: $i\n", st->total_size, AvMAX(thing), av_len((AV*)thing)));
865 if (recurse >= TOTAL_SIZE_RECURSION) {
866 SSize_t i = AvFILLp(thing) + 1;
869 sv_size(aTHX_ st, AvARRAY(thing)[i], recurse);
872 /* Add in the bits on the other side of the beginning */
874 dbg_printf(("total_size %li, sizeof(SV *) %li, AvARRAY(thing) %li, AvALLOC(thing)%li , sizeof(ptr) %li \n",
875 st->total_size, sizeof(SV*), AvARRAY(thing), AvALLOC(thing), sizeof( thing )));
877 /* under Perl 5.8.8 64bit threading, AvARRAY(thing) was a pointer while AvALLOC was 0,
878 resulting in grossly overstated sized for arrays. Technically, this shouldn't happen... */
879 if (AvALLOC(thing) != 0) {
880 st->total_size += (sizeof(SV *) * (AvARRAY(thing) - AvALLOC(thing)));
882 #if (PERL_VERSION < 9)
883 /* Is there something hanging off the arylen element?
884 Post 5.9.something this is stored in magic, so will be found there,
885 and Perl_av_arylen_p() takes a non-const AV*, hence compilers rightly
886 complain about AvARYLEN() passing thing to it. */
887 sv_size(aTHX_ st, AvARYLEN(thing), recurse);
891 /* Now the array of buckets */
892 st->total_size += (sizeof(HE *) * (HvMAX(thing) + 1));
893 /* Now walk the bucket chain */
894 if (HvARRAY(thing)) {
897 for (cur_bucket = 0; cur_bucket <= HvMAX(thing); cur_bucket++) {
898 cur_entry = *(HvARRAY(thing) + cur_bucket);
900 st->total_size += sizeof(HE);
901 hek_size(aTHX_ st, cur_entry->hent_hek, HvSHAREKEYS(thing));
902 if (recurse >= TOTAL_SIZE_RECURSION)
903 sv_size(aTHX_ st, HeVAL(cur_entry), recurse);
904 cur_entry = cur_entry->hent_next;
910 /* This direct access is arguably "naughty": */
911 struct mro_meta *meta = HvAUX(thing)->xhv_mro_meta;
912 #if PERL_VERSION > 13 || PERL_SUBVERSION > 8
914 I32 count = HvAUX(thing)->xhv_name_count;
917 HEK **names = HvAUX(thing)->xhv_name_u.xhvnameu_names;
921 hek_size(aTHX_ st, names[count], 1);
926 hek_size(aTHX_ st, HvNAME_HEK(thing), 1);
929 st->total_size += sizeof(struct xpvhv_aux);
931 st->total_size += sizeof(struct mro_meta);
932 sv_size(aTHX_ st, (SV *)meta->mro_nextmethod, TOTAL_SIZE_RECURSION);
933 #if PERL_VERSION > 10 || (PERL_VERSION == 10 && PERL_SUBVERSION > 0)
934 sv_size(aTHX_ st, (SV *)meta->isa, TOTAL_SIZE_RECURSION);
936 #if PERL_VERSION > 10
937 sv_size(aTHX_ st, (SV *)meta->mro_linear_all, TOTAL_SIZE_RECURSION);
938 sv_size(aTHX_ st, meta->mro_linear_current, TOTAL_SIZE_RECURSION);
940 sv_size(aTHX_ st, (SV *)meta->mro_linear_dfs, TOTAL_SIZE_RECURSION);
941 sv_size(aTHX_ st, (SV *)meta->mro_linear_c3, TOTAL_SIZE_RECURSION);
946 check_new_and_strlen(st, HvNAME_get(thing));
952 if (PERL_VERSION*1000+PERL_SUBVERSION < 21006 || !CvISXSUB(thing))
953 padlist_size(aTHX_ st, CvPADLIST(thing), SOME_RECURSION);
954 sv_size(aTHX_ st, (SV *)CvOUTSIDE(thing), recurse);
956 if (st->go_yell && !st->fm_whine) {
957 carp("Devel::Size: Calculated sizes for FMs are incomplete");
963 sv_size(aTHX_ st, (SV *)CvSTASH(thing), SOME_RECURSION);
964 sv_size(aTHX_ st, (SV *)SvSTASH(thing), SOME_RECURSION);
965 sv_size(aTHX_ st, (SV *)CvGV(thing), SOME_RECURSION);
966 if (PERL_VERSION*1000+PERL_SUBVERSION < 21006 || !CvISXSUB(thing))
967 padlist_size(aTHX_ st, CvPADLIST(thing), SOME_RECURSION);
968 sv_size(aTHX_ st, (SV *)CvOUTSIDE(thing), recurse);
969 if (CvISXSUB(thing)) {
970 sv_size(aTHX_ st, cv_const_sv((CV *)thing), recurse);
971 } else if (CvROOT(thing)) {
972 op_size(aTHX_ CvSTART(thing), st);
973 op_size(aTHX_ CvROOT(thing), st);
978 /* Some embedded char pointers */
979 check_new_and_strlen(st, ((XPVIO *) SvANY(thing))->xio_top_name);
980 check_new_and_strlen(st, ((XPVIO *) SvANY(thing))->xio_fmt_name);
981 check_new_and_strlen(st, ((XPVIO *) SvANY(thing))->xio_bottom_name);
982 /* Throw the GVs on the list to be walked if they're not-null */
983 sv_size(aTHX_ st, (SV *)((XPVIO *) SvANY(thing))->xio_top_gv, recurse);
984 sv_size(aTHX_ st, (SV *)((XPVIO *) SvANY(thing))->xio_bottom_gv, recurse);
985 sv_size(aTHX_ st, (SV *)((XPVIO *) SvANY(thing))->xio_fmt_gv, recurse);
987 /* Only go trotting through the IO structures if they're really
988 trottable. If USE_PERLIO is defined we can do this. If
989 not... we can't, so we don't even try */
991 /* Dig into xio_ifp and xio_ofp here */
992 warn("Devel::Size: Can't size up perlio layers yet\n");
997 #if (PERL_VERSION < 9)
1002 if(isGV_with_GP(thing)) {
1004 hek_size(aTHX_ st, GvNAME_HEK(thing), 1);
1006 st->total_size += GvNAMELEN(thing);
1009 hek_size(aTHX_ st, GvFILE_HEK(thing), 1);
1010 #elif defined(GvFILE)
1011 # if !defined(USE_ITHREADS) || (PERL_VERSION > 8 || (PERL_VERSION == 8 && PERL_SUBVERSION > 8))
1012 /* With itreads, before 5.8.9, this can end up pointing to freed memory
1013 if the GV was created in an eval, as GvFILE() points to CopFILE(),
1014 and the relevant COP has been freed on scope cleanup after the eval.
1015 5.8.9 adds a binary compatible fudge that catches the vast majority
1016 of cases. 5.9.something added a proper fix, by converting the GP to
1017 use a shared hash key (porperly reference counted), instead of a
1018 char * (owned by who knows? possibly no-one now) */
1019 check_new_and_strlen(st, GvFILE(thing));
1022 /* Is there something hanging off the glob? */
1023 if (check_new(st, GvGP(thing))) {
1024 st->total_size += sizeof(GP);
1025 sv_size(aTHX_ st, (SV *)(GvGP(thing)->gp_sv), recurse);
1026 sv_size(aTHX_ st, (SV *)(GvGP(thing)->gp_form), recurse);
1027 sv_size(aTHX_ st, (SV *)(GvGP(thing)->gp_av), recurse);
1028 sv_size(aTHX_ st, (SV *)(GvGP(thing)->gp_hv), recurse);
1029 sv_size(aTHX_ st, (SV *)(GvGP(thing)->gp_egv), recurse);
1030 sv_size(aTHX_ st, (SV *)(GvGP(thing)->gp_cv), recurse);
1032 #if (PERL_VERSION >= 9)
1036 #if PERL_VERSION <= 8
1044 if(recurse && SvROK(thing))
1045 sv_size(aTHX_ st, SvRV_const(thing), recurse);
1046 else if (SvIsCOW_shared_hash(thing))
1047 hek_size(aTHX_ st, SvSHARED_HEK_FROM_PV(SvPVX(thing)), 1);
1049 st->total_size += SvLEN(thing);
1053 SvOOK_offset(thing, len);
1054 st->total_size += len;
1062 static struct state *
1068 Newxz(st, 1, struct state);
1070 if (NULL != (warn_flag = perl_get_sv("Devel::Size::warn", FALSE))) {
1071 st->dangle_whine = st->go_yell = SvIV(warn_flag) ? TRUE : FALSE;
1073 if (NULL != (warn_flag = perl_get_sv("Devel::Size::dangle", FALSE))) {
1074 st->dangle_whine = SvIV(warn_flag) ? TRUE : FALSE;
1076 check_new(st, &PL_sv_undef);
1077 check_new(st, &PL_sv_no);
1078 check_new(st, &PL_sv_yes);
1079 #if PERL_VERSION > 8 || (PERL_VERSION == 8 && PERL_SUBVERSION > 0)
1080 check_new(st, &PL_sv_placeholder);
1085 MODULE = Devel::Size PACKAGE = Devel::Size
1093 total_size = TOTAL_SIZE_RECURSION
1096 SV *thing = orig_thing;
1097 struct state *st = new_state(aTHX);
1099 /* If they passed us a reference then dereference it. This is the
1100 only way we can check the sizes of arrays and hashes */
1102 thing = SvRV(thing);
1105 sv_size(aTHX_ st, thing, ix);
1106 RETVAL = st->total_size;