X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=perly.c;h=c8ee62ffc62dfcd4f5a7079f97775fa70562b6e8;hb=29469fa673ae2b707c0e65eb6190f2fab11938b1;hp=a9e569d9c9ccd42ad9241f0d6881f30607ac2c57;hpb=00c0e1ee57fe86089ee3a3ed6f81554b21786f43;p=p5sagit%2Fp5-mst-13.2.git diff --git a/perly.c b/perly.c index a9e569d..c8ee62f 100644 --- a/perly.c +++ b/perly.c @@ -258,8 +258,17 @@ S_clear_yystack(pTHX_ const yy_parser *parser) * * a CV * but this would involve reworking all code (core and external) that * manipulate op trees. - */ + * + * XXX DAPM 17/1/07 I've decided its too fragile for now, and so have + * disabled it */ + +#define DISABLE_STACK_FREE + +#ifdef DISABLE_STACK_FREE + ps -= parser->yylen; + PERL_UNUSED_VAR(i); +#else /* clear any reducing ops (1st pass) */ for (i=0; i< parser->yylen; i++) { @@ -275,6 +284,7 @@ S_clear_yystack(pTHX_ const yy_parser *parser) } } } +#endif /* now free whole the stack, including the just-reduced ops */ @@ -286,8 +296,10 @@ S_clear_yystack(pTHX_ const yy_parser *parser) PAD_RESTORE_LOCAL(ps->comppad); } YYDPRINTF ((Perl_debug_log, "(freeing op)\n")); +#ifndef DISABLE_STACK_FREE ps->val.opval->op_latefree = 0; if (!(ps->val.opval->op_attached && !ps->val.opval->op_latefreed)) +#endif op_free(ps->val.opval); } ps--; @@ -362,10 +374,12 @@ Perl_yyparse (pTHX) YYDPRINTF ((Perl_debug_log, "Entering state %d\n", yystate)); +#ifndef DISABLE_STACK_FREE if (yy_type_tab[yystos[yystate]] == toketype_opval && ps->val.opval) { ps->val.opval->op_latefree = 1; ps->val.opval->op_latefreed = 0; } +#endif parser->yylen = 0; @@ -522,6 +536,7 @@ Perl_yyparse (pTHX) } +#ifndef DISABLE_STACK_FREE /* any just-reduced ops with the op_latefreed flag cleared need to be * freed; the rest need the flag resetting */ { @@ -536,6 +551,7 @@ Perl_yyparse (pTHX) } } } +#endif parser->ps = ps -= (parser->yylen-1);