summaryrefslogtreecommitdiff
path: root/perly.c
diff options
context:
space:
mode:
authorGerard Goossen <gerard@ggoossen.net>2009-12-08 20:41:28 +0100
committerRafael Garcia-Suarez <rgs@consttype.org>2009-12-16 10:18:01 +0100
commit8c63ea58497f2deb05596f96547d19395545a0ee (patch)
tree4d7f56a670ce22d0c7c2f4c2ddb75d2d999bf067 /perly.c
parent7e8f1eacdace90501f4e820697697c9c339efa6f (diff)
downloadperl-8c63ea58497f2deb05596f96547d19395545a0ee.tar.gz
Store the PL_compcv instead of the the PL_comppad in parser stack, and make it reference counted. Properly solves [perl #66094]
Diffstat (limited to 'perly.c')
-rw-r--r--perly.c42
1 files changed, 28 insertions, 14 deletions
diff --git a/perly.c b/perly.c
index eff36d1595..ac87b8e02e 100644
--- a/perly.c
+++ b/perly.c
@@ -266,8 +266,10 @@ S_clear_yystack(pTHX_ const yy_parser *parser)
#ifdef DISABLE_STACK_FREE
+ for (i=0; i< parser->yylen; i++) {
+ SvREFCNT_dec(ps[-i].compcv);
+ }
ps -= parser->yylen;
- PERL_UNUSED_VAR(i);
#else
/* clear any reducing ops (1st pass) */
@@ -278,8 +280,9 @@ S_clear_yystack(pTHX_ const yy_parser *parser)
if ( ! (ps[-i].val.opval->op_attached
&& !ps[-i].val.opval->op_latefreed))
{
- if (ps[-i].comppad != PL_comppad) {
- PAD_RESTORE_LOCAL(ps[-i].comppad);
+ if (ps[-i].compcv != PL_compcv) {
+ PL_compcv = ps[-i].compcv;
+ PAD_SET_CUR_NOSAVE(CvPADLIST(PL_compcv), 1);
}
op_free(ps[-i].val.opval);
}
@@ -294,8 +297,9 @@ S_clear_yystack(pTHX_ const yy_parser *parser)
if (yy_type_tab[yystos[ps->state]] == toketype_opval
&& ps->val.opval)
{
- if (ps->comppad != PL_comppad) {
- PAD_RESTORE_LOCAL(ps->comppad);
+ if (ps->compcv != PL_compcv) {
+ PL_compcv = ps->compcv;
+ PAD_SET_CUR_NOSAVE(CvPADLIST(PL_compcv), 1);
}
YYDPRINTF ((Perl_debug_log, "(freeing op)\n"));
#ifndef DISABLE_STACK_FREE
@@ -304,6 +308,7 @@ S_clear_yystack(pTHX_ const yy_parser *parser)
#endif
op_free(ps->val.opval);
}
+ SvREFCNT_dec(ps->compcv);
ps--;
}
}
@@ -451,7 +456,7 @@ Perl_yyparse (pTHX)
YYPUSHSTACK;
ps->state = yyn;
ps->val = parser->yylval;
- ps->comppad = PL_comppad;
+ ps->compcv = SvREFCNT_inc(PL_compcv);
ps->savestack_ix = PL_savestack_ix;
#ifdef DEBUGGING
ps->name = (const char *)(yytname[yytoken]);
@@ -525,12 +530,12 @@ 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 */
{
int i;
for (i=0; i< parser->yylen; i++) {
+#ifndef DISABLE_STACK_FREE
if (yy_type_tab[yystos[ps[-i].state]] == toketype_opval
&& ps[-i].val.opval)
{
@@ -538,9 +543,10 @@ Perl_yyparse (pTHX)
if (ps[-i].val.opval->op_latefreed)
op_free(ps[-i].val.opval);
}
+#endif
+ SvREFCNT_dec(ps[-i].compcv);
}
}
-#endif
parser->ps = ps -= (parser->yylen-1);
@@ -549,7 +555,7 @@ Perl_yyparse (pTHX)
number reduced by. */
ps->val = yyval;
- ps->comppad = PL_comppad;
+ ps->compcv = SvREFCNT_inc(PL_compcv);
ps->savestack_ix = PL_savestack_ix;
#ifdef DEBUGGING
ps->name = (const char *)(yytname [yyr1[yyn]]);
@@ -584,6 +590,7 @@ Perl_yyparse (pTHX)
/* Return failure if at end of input. */
if (parser->yychar == YYEOF) {
/* Pop the error token. */
+ SvREFCNT_dec(ps->compcv);
YYPOPSTACK;
/* Pop the rest of the stack. */
while (ps > parser->stack) {
@@ -593,12 +600,14 @@ Perl_yyparse (pTHX)
&& ps->val.opval)
{
YYDPRINTF ((Perl_debug_log, "(freeing op)\n"));
- if (ps->comppad != PL_comppad) {
- PAD_RESTORE_LOCAL(ps->comppad);
+ if (ps->compcv != PL_compcv) {
+ PL_compcv = ps->compcv;
+ PAD_SET_CUR_NOSAVE(CvPADLIST(PL_compcv), 1);
}
ps->val.opval->op_latefree = 0;
op_free(ps->val.opval);
}
+ SvREFCNT_dec(ps->compcv);
YYPOPSTACK;
}
YYABORT;
@@ -639,12 +648,14 @@ Perl_yyparse (pTHX)
LEAVE_SCOPE(ps->savestack_ix);
if (yy_type_tab[yystos[ps->state]] == toketype_opval && ps->val.opval) {
YYDPRINTF ((Perl_debug_log, "(freeing op)\n"));
- if (ps->comppad != PL_comppad) {
- PAD_RESTORE_LOCAL(ps->comppad);
+ if (ps->compcv != PL_compcv) {
+ PL_compcv = ps->compcv;
+ PAD_SET_CUR_NOSAVE(CvPADLIST(PL_compcv), 1);
}
ps->val.opval->op_latefree = 0;
op_free(ps->val.opval);
}
+ SvREFCNT_dec(ps->compcv);
YYPOPSTACK;
yystate = ps->state;
@@ -659,7 +670,7 @@ Perl_yyparse (pTHX)
YYPUSHSTACK;
ps->state = yyn;
ps->val = parser->yylval;
- ps->comppad = PL_comppad;
+ ps->compcv = SvREFCNT_inc(PL_compcv);
ps->savestack_ix = PL_savestack_ix;
#ifdef DEBUGGING
ps->name ="<err>";
@@ -673,6 +684,9 @@ Perl_yyparse (pTHX)
`-------------------------------------*/
yyacceptlab:
yyresult = 0;
+ for (ps=parser->ps; ps > parser->stack; ps--) {
+ SvREFCNT_dec(ps->compcv);
+ }
parser->ps = parser->stack; /* disable cleanup */
goto yyreturn;