X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=sv.c;h=846f812db68d7d2e0beabfdad5c331967543a3af;hb=d6ae750195600e01c65b55bcabc0deaf4194d8b9;hp=5f257047d2fbdf1fd1814873eb768d0cd33961db;hpb=7f466ec7af27f9f5d32c98835d50ab88e615a752;p=p5sagit%2Fp5-mst-13.2.git diff --git a/sv.c b/sv.c index 5f25704..846f812 100644 --- a/sv.c +++ b/sv.c @@ -587,18 +587,6 @@ struct arena_set { struct arena_desc set[ARENAS_PER_SET]; }; -#if !ARENASETS - -static void -S_free_arena(pTHX_ void **root) { - while (root) { - void ** const next = *(void **)root; - Safefree(root); - root = next; - } -} -#endif - /* =for apidoc sv_free_arenas @@ -627,7 +615,6 @@ Perl_sv_free_arenas(pTHX) Safefree(sva); } -#if ARENASETS { struct arena_set *next, *aroot = (struct arena_set*) PL_body_arenas; @@ -641,9 +628,6 @@ Perl_sv_free_arenas(pTHX) Safefree(aroot); } } -#else - S_free_arena(aTHX_ (void**) PL_body_arenas); -#endif PL_body_arenas = 0; for (i=0; inext = PL_body_arenas; - PL_body_arenas = arp; - return arp; - -#else struct arena_desc* adesc; struct arena_set *newroot, **aroot = (struct arena_set**) &PL_body_arenas; int curr; @@ -737,7 +709,6 @@ Perl_get_arena(pTHX_ int arena_size) curr, adesc->arena, arena_size)); return adesc->arena; -#endif } @@ -1094,17 +1065,11 @@ S_more_bodies (pTHX_ svtype sv_type) end = start + bdp->arena_size - body_size; -#if !ARENASETS - /* The initial slot is used to link the arenas together, so it isn't to be - linked into the list of ready-to-use bodies. */ - start += body_size; -#else /* computed count doesnt reflect the 1st slot reservation */ DEBUG_m(PerlIO_printf(Perl_debug_log, "arena %p end %p arena-size %d type %d size %d ct %d\n", start, end, bdp->arena_size, sv_type, body_size, bdp->arena_size / body_size)); -#endif *root = (void *)start; @@ -1444,6 +1409,10 @@ Perl_sv_grow(pTHX_ register SV *sv, register STRLEN newlen) { register char *s; + if (PL_madskills && newlen >= 0x100000) { + PerlIO_printf(Perl_debug_log, + "Allocation too large: %"UVxf"\n", (UV)newlen); + } #ifdef HAS_64K_LIMIT if (newlen >= 0x10000) { PerlIO_printf(Perl_debug_log, @@ -3216,8 +3185,7 @@ S_glob_assign_glob(pTHX_ SV *dstr, SV *sstr, const int dtype) GvSTASH(dstr) = GvSTASH(sstr); if (GvSTASH(dstr)) Perl_sv_add_backref(aTHX_ (SV*)GvSTASH(dstr), dstr); - GvNAME(dstr) = savepvn(name, len); - GvNAMELEN(dstr) = len; + gv_name_set((GV *)dstr, name, len, GV_ADD); SvFAKE_on(dstr); /* can coerce to non-glob */ } @@ -5112,7 +5080,9 @@ Perl_sv_clear(pTHX_ register SV *sv) goto freescalar; case SVt_PVGV: gp_free((GV*)sv); - Safefree(GvNAME(sv)); + if (GvNAME_HEK(sv)) { + unshare_hek(GvNAME_HEK(sv)); + } /* If we're in a stash, we don't own a reference to it. However it does have a back reference to us, which needs to be cleared. */ if (GvSTASH(sv)) @@ -7716,7 +7686,9 @@ S_sv_unglob(pTHX_ SV *sv) GvSTASH(sv) = NULL; } GvMULTI_off(sv); - Safefree(GvNAME(sv)); + if (GvNAME_HEK(sv)) { + unshare_hek(GvNAME_HEK(sv)); + } SvSCREAM_off(sv); /* need to keep SvANY(sv) in the right arena */ @@ -9837,7 +9809,9 @@ Perl_sv_dup(pTHX_ const SV *sstr, CLONE_PARAMS* param) LvTARG(dstr) = sv_dup_inc(LvTARG(dstr), param); break; case SVt_PVGV: - GvNAME(dstr) = SAVEPVN(GvNAME(dstr), GvNAMELEN(dstr)); + if (GvNAME_HEK(dstr)) + GvNAME_HEK(dstr) = hek_dup(GvNAME_HEK(dstr), param); + /* Don't call sv_add_backref here as it's going to be created as part of the magic cloning of the symbol table. */ GvSTASH(dstr) = hv_dup(GvSTASH(dstr), param); @@ -10934,9 +10908,14 @@ perl_clone_using(PerlInterpreter *proto_perl, UV flags, i = (PL_lex_casemods < 12 ? 12 : PL_lex_casemods); PL_lex_casestack = SAVEPVN(proto_perl->Ilex_casestack,i); +#ifdef PERL_MAD + Copy(proto_perl->Inexttoke, PL_nexttoke, 5, NEXTTOKE); + PL_lasttoke = proto_perl->Ilasttoke; +#else Copy(proto_perl->Inextval, PL_nextval, 5, YYSTYPE); Copy(proto_perl->Inexttype, PL_nexttype, 5, I32); PL_nexttoke = proto_perl->Inexttoke; +#endif /* XXX This is probably masking the deeper issue of why * SvANY(proto_perl->Ilinestr) can be NULL at this point. For test case: