U8 **leaf_p;
U8 *leaf;
unsigned int i;
- void **tv_p;
+ void **tv_p = (void **) (st->tracking);
-
- if (NULL == p || NULL == st) return FALSE;
- tv_p = (void **) (st->tracking);
+ if (NULL == p) return FALSE;
TRY_TO_CATCH_SEGV {
const char c = *(const char *)p;
}
magic_pointer = SvMAGIC(thing);
/* Have we seen the magic pointer? */
- while (magic_pointer && check_new(st, magic_pointer)) {
+ while (check_new(st, magic_pointer)) {
st->total_size += sizeof(MAGIC);
TRY_TO_CATCH_SEGV {
/* Have we seen the magic vtable? */
- if (magic_pointer->mg_virtual &&
- check_new(st, magic_pointer->mg_virtual)) {
+ if (check_new(st, magic_pointer->mg_virtual)) {
st->total_size += sizeof(MGVTBL);
}
}
static void
+check_new_and_strlen(struct state *st, const char *const p) {
+ if(check_new(st, p))
+ st->total_size += strlen(p);
+}
+
+static void
regex_size(const REGEXP * const baseregex, struct state *st) {
+ if(!check_new(st, baseregex))
+ return;
st->total_size += sizeof(REGEXP);
#if (PERL_VERSION < 11)
/* Note the size of the paren offset thing */
}
static void
-op_size(pTHX_ const OP * const baseop, struct state *st) {
- TRY_TO_CATCH_SEGV {
- TAG;
- if (check_new(st, baseop->op_next)) {
- op_size(aTHX_ baseop->op_next, st);
- }
- TAG;
- switch (cc_opclass(baseop)) {
- case OPc_BASEOP: TAG;
- st->total_size += sizeof(struct op);
- TAG;break;
- case OPc_UNOP: TAG;
- st->total_size += sizeof(struct unop);
- if (check_new(st, cUNOPx(baseop)->op_first)) {
- op_size(aTHX_ cUNOPx(baseop)->op_first, st);
- }
- TAG;break;
- case OPc_BINOP: TAG;
- st->total_size += sizeof(struct binop);
- if (check_new(st, cBINOPx(baseop)->op_first)) {
- op_size(aTHX_ cBINOPx(baseop)->op_first, st);
- }
- if (check_new(st, cBINOPx(baseop)->op_last)) {
- op_size(aTHX_ cBINOPx(baseop)->op_last, st);
- }
- TAG;break;
- case OPc_LOGOP: TAG;
- st->total_size += sizeof(struct logop);
- if (check_new(st, cLOGOPx(baseop)->op_first)) {
- op_size(aTHX_ cBINOPx(baseop)->op_first, st);
- }
- if (check_new(st, cLOGOPx(baseop)->op_other)) {
- op_size(aTHX_ cLOGOPx(baseop)->op_other, st);
- }
- TAG;break;
- case OPc_LISTOP: TAG;
- st->total_size += sizeof(struct listop);
- if (check_new(st, cLISTOPx(baseop)->op_first)) {
- op_size(aTHX_ cLISTOPx(baseop)->op_first, st);
- }
- if (check_new(st, cLISTOPx(baseop)->op_last)) {
- op_size(aTHX_ cLISTOPx(baseop)->op_last, st);
- }
- TAG;break;
- case OPc_PMOP: TAG;
- st->total_size += sizeof(struct pmop);
- if (check_new(st, cPMOPx(baseop)->op_first)) {
- op_size(aTHX_ cPMOPx(baseop)->op_first, st);
- }
- if (check_new(st, cPMOPx(baseop)->op_last)) {
- op_size(aTHX_ cPMOPx(baseop)->op_last, st);
- }
+op_size(pTHX_ const OP * const baseop, struct state *st)
+{
+ TRY_TO_CATCH_SEGV {
+ TAG;
+ if(!check_new(st, baseop))
+ return;
+ TAG;
+ op_size(aTHX_ baseop->op_next, st);
+ TAG;
+ switch (cc_opclass(baseop)) {
+ case OPc_BASEOP: TAG;
+ st->total_size += sizeof(struct op);
+ TAG;break;
+ case OPc_UNOP: TAG;
+ st->total_size += sizeof(struct unop);
+ op_size(aTHX_ cUNOPx(baseop)->op_first, st);
+ TAG;break;
+ case OPc_BINOP: TAG;
+ st->total_size += sizeof(struct binop);
+ op_size(aTHX_ cBINOPx(baseop)->op_first, st);
+ op_size(aTHX_ cBINOPx(baseop)->op_last, st);
+ TAG;break;
+ case OPc_LOGOP: TAG;
+ st->total_size += sizeof(struct logop);
+ op_size(aTHX_ cBINOPx(baseop)->op_first, st);
+ op_size(aTHX_ cLOGOPx(baseop)->op_other, st);
+ TAG;break;
+ case OPc_LISTOP: TAG;
+ st->total_size += sizeof(struct listop);
+ op_size(aTHX_ cLISTOPx(baseop)->op_first, st);
+ op_size(aTHX_ cLISTOPx(baseop)->op_last, st);
+ TAG;break;
+ case OPc_PMOP: TAG;
+ st->total_size += sizeof(struct pmop);
+ op_size(aTHX_ cPMOPx(baseop)->op_first, st);
+ op_size(aTHX_ cPMOPx(baseop)->op_last, st);
#if PERL_VERSION < 9 || (PERL_VERSION == 9 && PERL_SUBVERSION < 5)
- if (check_new(st, cPMOPx(baseop)->op_pmreplroot)) {
- op_size(aTHX_ cPMOPx(baseop)->op_pmreplroot, st);
- }
- if (check_new(st, cPMOPx(baseop)->op_pmreplstart)) {
- op_size(aTHX_ cPMOPx(baseop)->op_pmreplstart, st);
- }
- if (check_new(st, cPMOPx(baseop)->op_pmnext)) {
- op_size(aTHX_ (OP *)cPMOPx(baseop)->op_pmnext, st);
- }
+ op_size(aTHX_ cPMOPx(baseop)->op_pmreplroot, st);
+ op_size(aTHX_ cPMOPx(baseop)->op_pmreplstart, st);
+ op_size(aTHX_ (OP *)cPMOPx(baseop)->op_pmnext, st);
#endif
- /* This is defined away in perl 5.8.x, but it is in there for
- 5.6.x */
+ /* This is defined away in perl 5.8.x, but it is in there for
+ 5.6.x */
#ifdef PM_GETRE
- if (check_new(st, PM_GETRE((cPMOPx(baseop))))) {
- regex_size(PM_GETRE(cPMOPx(baseop)), st);
- }
+ regex_size(PM_GETRE(cPMOPx(baseop)), st);
#else
- if (check_new(st, cPMOPx(baseop)->op_pmregexp)) {
- regex_size(cPMOPx(baseop)->op_pmregexp, st);
- }
+ regex_size(cPMOPx(baseop)->op_pmregexp, st);
#endif
- TAG;break;
+ TAG;break;
case OPc_SVOP: TAG;
st->total_size += sizeof(struct pmop);
if (check_new(st, cSVOPx(baseop)->op_sv)) {
TAG;break;
case OPc_PADOP: TAG;
st->total_size += sizeof(struct padop);
- TAG;break;
- case OPc_PVOP: TAG;
- if (check_new(st, cPVOPx(baseop)->op_pv)) {
- st->total_size += strlen(cPVOPx(baseop)->op_pv);
- }
- case OPc_LOOP: TAG;
- st->total_size += sizeof(struct loop);
- if (check_new(st, cLOOPx(baseop)->op_first)) {
- op_size(aTHX_ cLOOPx(baseop)->op_first, st);
- }
- if (check_new(st, cLOOPx(baseop)->op_last)) {
- op_size(aTHX_ cLOOPx(baseop)->op_last, st);
- }
- if (check_new(st, cLOOPx(baseop)->op_redoop)) {
- op_size(aTHX_ cLOOPx(baseop)->op_redoop, st);
- }
- if (check_new(st, cLOOPx(baseop)->op_nextop)) {
- op_size(aTHX_ cLOOPx(baseop)->op_nextop, st);
- }
- if (check_new(st, cLOOPx(baseop)->op_lastop)) {
- op_size(aTHX_ cLOOPx(baseop)->op_lastop, st);
- }
-
- TAG;break;
- case OPc_COP: TAG;
+ TAG;break;
+ case OPc_PVOP: TAG;
+ check_new_and_strlen(st, cPVOPx(baseop)->op_pv);
+ case OPc_LOOP: TAG;
+ st->total_size += sizeof(struct loop);
+ op_size(aTHX_ cLOOPx(baseop)->op_first, st);
+ op_size(aTHX_ cLOOPx(baseop)->op_last, st);
+ op_size(aTHX_ cLOOPx(baseop)->op_redoop, st);
+ op_size(aTHX_ cLOOPx(baseop)->op_nextop, st);
+ op_size(aTHX_ cLOOPx(baseop)->op_lastop, st);
+ TAG;break;
+ case OPc_COP: TAG;
{
COP *basecop;
basecop = (COP *)baseop;
before 5.11 @33656, but later than 5.10, producing slightly too
small memory sizes on these Perls. */
#if (PERL_VERSION < 11)
- if (check_new(st, basecop->cop_label)) {
- st->total_size += strlen(basecop->cop_label);
- }
+ check_new_and_strlen(st, basecop->cop_label);
#endif
#ifdef USE_ITHREADS
- if (check_new(st, basecop->cop_file)) {
- st->total_size += strlen(basecop->cop_file);
- }
- if (check_new(st, basecop->cop_stashpv)) {
- st->total_size += strlen(basecop->cop_stashpv);
- }
+ check_new_and_strlen(st, basecop->cop_file);
+ check_new_and_strlen(st, basecop->cop_stashpv);
#else
if (check_new(st, basecop->cop_stash)) {
thing_size(aTHX_ (SV *)basecop->cop_stash, st);
thing_size(aTHX_ sv, st);
}
} else {
- if (check_new(st, CvSTART(thing))) {
- op_size(aTHX_ CvSTART(thing), st);
- }
- if (check_new(st, CvROOT(thing))) {
- op_size(aTHX_ CvROOT(thing), st);
- }
+ op_size(aTHX_ CvSTART(thing), st);
+ op_size(aTHX_ CvROOT(thing), st);
}
TAG;break;
st->total_size += GvNAMELEN(thing);
#ifdef GvFILE
/* Is there a file? */
- if (GvFILE(thing)) {
- if (check_new(st, GvFILE(thing))) {
- st->total_size += strlen(GvFILE(thing));
- }
- }
+ check_new_and_strlen(st, GvFILE(thing));
#endif
/* Is there something hanging off the glob? */
if (GvGP(thing)) {
st->total_size += ((XPVIO *) SvANY(thing))->xpv_cur;
}
/* Some embedded char pointers */
- if (check_new(st, ((XPVIO *) SvANY(thing))->xio_top_name)) {
- st->total_size += strlen(((XPVIO *) SvANY(thing))->xio_top_name);
- }
- if (check_new(st, ((XPVIO *) SvANY(thing))->xio_fmt_name)) {
- st->total_size += strlen(((XPVIO *) SvANY(thing))->xio_fmt_name);
- }
- if (check_new(st, ((XPVIO *) SvANY(thing))->xio_bottom_name)) {
- st->total_size += strlen(((XPVIO *) SvANY(thing))->xio_bottom_name);
- }
+ check_new_and_strlen(st, ((XPVIO *) SvANY(thing))->xio_top_name);
+ check_new_and_strlen(st, ((XPVIO *) SvANY(thing))->xio_fmt_name);
+ check_new_and_strlen(st, ((XPVIO *) SvANY(thing))->xio_bottom_name);
/* Throw the GVs on the list to be walked if they're not-null */
if (((XPVIO *) SvANY(thing))->xio_top_gv) {
thing_size(aTHX_ (SV *)((XPVIO *) SvANY(thing))->xio_top_gv, st);