This is a live mirror of the Perl 5 development currently hosted at
https://github.com/perl/perl5
https://perl5.git.perl.org
/
perl5.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Bump version of IPC::Cmd
[perl5.git]
/
perly.c
diff --git
a/perly.c
b/perly.c
index
36f78a3
..
5a3d409
100644
(file)
--- a/
perly.c
+++ b/
perly.c
@@
-1,6
+1,6
@@
/* perly.c
*
/* perly.c
*
- * Copyright (c) 2004, 2005, 2006 Larry Wall and others
+ * Copyright (c) 2004, 2005, 2006
, 2007, by
Larry Wall and others
*
* You may distribute under the terms of either the GNU General Public
* License or the Artistic License, as specified in the README file.
*
* You may distribute under the terms of either the GNU General Public
* License or the Artistic License, as specified in the README file.
@@
-111,7
+111,7
@@
yy_stack_print (pTHX_ const yy_parser *parser)
PerlIO_printf(Perl_debug_log, "\nindex:");
for (ps = min; ps <= parser->ps; ps++)
PerlIO_printf(Perl_debug_log, "\nindex:");
for (ps = min; ps <= parser->ps; ps++)
- PerlIO_printf(Perl_debug_log, " %8d",
ps - parser->stack
);
+ PerlIO_printf(Perl_debug_log, " %8d",
(int)(ps - parser->stack)
);
PerlIO_printf(Perl_debug_log, "\nstate:");
for (ps = min; ps <= parser->ps; ps++)
PerlIO_printf(Perl_debug_log, "\nstate:");
for (ps = min; ps <= parser->ps; ps++)
@@
-195,7
+195,7
@@
S_clear_yystack(pTHX_ const yy_parser *parser)
yy_stack_frame *ps = parser->ps;
int i;
yy_stack_frame *ps = parser->ps;
int i;
- if (ps == parser->stack)
+ if (
!parser->stack ||
ps == parser->stack)
return;
YYDPRINTF ((Perl_debug_log, "clearing the parse stack\n"));
return;
YYDPRINTF ((Perl_debug_log, "clearing the parse stack\n"));
@@
-258,11
+258,21
@@
S_clear_yystack(pTHX_ const yy_parser *parser)
* * a CV
* but this would involve reworking all code (core and external) that
* manipulate op trees.
* * 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++) {
/* clear any reducing ops (1st pass) */
for (i=0; i< parser->yylen; i++) {
+ LEAVE_SCOPE(ps[-i].savestack_ix);
if (yy_type_tab[yystos[ps[-i].state]] == toketype_opval
&& ps[-i].val.opval) {
if ( ! (ps[-i].val.opval->op_attached
if (yy_type_tab[yystos[ps[-i].state]] == toketype_opval
&& ps[-i].val.opval) {
if ( ! (ps[-i].val.opval->op_attached
@@
-275,10
+285,12
@@
S_clear_yystack(pTHX_ const yy_parser *parser)
}
}
}
}
}
}
+#endif
/* now free whole the stack, including the just-reduced ops */
while (ps > parser->stack) {
/* now free whole the stack, including the just-reduced ops */
while (ps > parser->stack) {
+ LEAVE_SCOPE(ps->savestack_ix);
if (yy_type_tab[yystos[ps->state]] == toketype_opval
&& ps->val.opval)
{
if (yy_type_tab[yystos[ps->state]] == toketype_opval
&& ps->val.opval)
{
@@
-286,24
+298,16
@@
S_clear_yystack(pTHX_ const yy_parser *parser)
PAD_RESTORE_LOCAL(ps->comppad);
}
YYDPRINTF ((Perl_debug_log, "(freeing op)\n"));
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))
ps->val.opval->op_latefree = 0;
if (!(ps->val.opval->op_attached && !ps->val.opval->op_latefreed))
+#endif
op_free(ps->val.opval);
}
ps--;
}
}
op_free(ps->val.opval);
}
ps--;
}
}
-/* delete a parser object */
-
-void
-Perl_parser_free(pTHX_ const yy_parser *parser)
-{
- S_clear_yystack(aTHX_ parser);
- Safefree(parser->stack);
- PL_parser = parser->old_parser;
-}
-
/*----------.
| yyparse. |
/*----------.
| yyparse. |
@@
-346,8
+350,8
@@
Perl_yyparse (pTHX)
parser = PL_parser;
ps = parser->ps;
parser = PL_parser;
ps = parser->ps;
- ENTER; /* force parser
free
before we return */
- SAVEDESTRUCTOR_X(
Perl_parser_free, (void*)
parser);
+ ENTER; /* force parser
stack cleanup
before we return */
+ SAVEDESTRUCTOR_X(
S_clear_yystack,
parser);
/*------------------------------------------------------------.
| yynewstate -- Push a new state, which is found in yystate. |
/*------------------------------------------------------------.
| yynewstate -- Push a new state, which is found in yystate. |
@@
-358,10
+362,12
@@
Perl_yyparse (pTHX)
YYDPRINTF ((Perl_debug_log, "Entering state %d\n", yystate));
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;
}
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;
parser->yylen = 0;
@@
-371,7
+377,7
@@
Perl_yyparse (pTHX)
/* grow the stack? We always leave 1 spare slot,
* in case of a '' -> 'foo' reduction */
/* grow the stack? We always leave 1 spare slot,
* in case of a '' -> 'foo' reduction */
- if (size >= parser->stack_size - 1) {
+ if (size >=
(size_t)
parser->stack_size - 1) {
/* this will croak on insufficient memory */
parser->stack_size *= 2;
Renew(parser->stack, parser->stack_size, yy_stack_frame);
/* this will croak on insufficient memory */
parser->stack_size *= 2;
Renew(parser->stack, parser->stack_size, yy_stack_frame);
@@
-446,6
+452,7
@@
Perl_yyparse (pTHX)
ps->state = yyn;
ps->val = parser->yylval;
ps->comppad = PL_comppad;
ps->state = yyn;
ps->val = parser->yylval;
ps->comppad = PL_comppad;
+ ps->savestack_ix = PL_savestack_ix;
#ifdef DEBUGGING
ps->name = (const char *)(yytname[yytoken]);
#endif
#ifdef DEBUGGING
ps->name = (const char *)(yytname[yytoken]);
#endif
@@
-518,6
+525,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 */
{
/* any just-reduced ops with the op_latefreed flag cleared need to be
* freed; the rest need the flag resetting */
{
@@
-532,6
+540,7
@@
Perl_yyparse (pTHX)
}
}
}
}
}
}
+#endif
parser->ps = ps -= (parser->yylen-1);
parser->ps = ps -= (parser->yylen-1);
@@
-541,6
+550,7
@@
Perl_yyparse (pTHX)
ps->val = yyval;
ps->comppad = PL_comppad;
ps->val = yyval;
ps->comppad = PL_comppad;
+ ps->savestack_ix = PL_savestack_ix;
#ifdef DEBUGGING
ps->name = (const char *)(yytname [yyr1[yyn]]);
#endif
#ifdef DEBUGGING
ps->name = (const char *)(yytname [yyr1[yyn]]);
#endif
@@
-578,6
+588,7
@@
Perl_yyparse (pTHX)
/* Pop the rest of the stack. */
while (ps > parser->stack) {
YYDSYMPRINTF ("Error: popping", yystos[ps->state], &ps->val);
/* Pop the rest of the stack. */
while (ps > parser->stack) {
YYDSYMPRINTF ("Error: popping", yystos[ps->state], &ps->val);
+ LEAVE_SCOPE(ps->savestack_ix);
if (yy_type_tab[yystos[ps->state]] == toketype_opval
&& ps->val.opval)
{
if (yy_type_tab[yystos[ps->state]] == toketype_opval
&& ps->val.opval)
{
@@
-625,6
+636,7
@@
Perl_yyparse (pTHX)
YYABORT;
YYDSYMPRINTF ("Error: popping", yystos[ps->state], &ps->val);
YYABORT;
YYDSYMPRINTF ("Error: popping", yystos[ps->state], &ps->val);
+ 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) {
if (yy_type_tab[yystos[ps->state]] == toketype_opval && ps->val.opval) {
YYDPRINTF ((Perl_debug_log, "(freeing op)\n"));
if (ps->comppad != PL_comppad) {
@@
-648,6
+660,7
@@
Perl_yyparse (pTHX)
ps->state = yyn;
ps->val = parser->yylval;
ps->comppad = PL_comppad;
ps->state = yyn;
ps->val = parser->yylval;
ps->comppad = PL_comppad;
+ ps->savestack_ix = PL_savestack_ix;
#ifdef DEBUGGING
ps->name ="<err>";
#endif
#ifdef DEBUGGING
ps->name ="<err>";
#endif
@@
-671,7
+684,7
@@
Perl_yyparse (pTHX)
goto yyreturn;
yyreturn:
goto yyreturn;
yyreturn:
- LEAVE;
/* force parser free
before we return */
+ LEAVE;
/* force parser stack cleanup
before we return */
return yyresult;
}
return yyresult;
}