This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Fixes to threads tests
[perl5.git] / perly.c
CommitLineData
0de566d7
DM
1/* perly.c
2 *
bc641c27 3 * Copyright (c) 2004, 2005, 2006, 2007, by Larry Wall and others
0de566d7
DM
4 *
5 * You may distribute under the terms of either the GNU General Public
6 * License or the Artistic License, as specified in the README file.
7 *
8 * Note that this file was originally generated as an output from
9 * GNU bison version 1.875, but now the code is statically maintained
f05e27e5
DM
10 * and edited; the bits that are dependent on perly.y are now
11 * #included from the files perly.tab and perly.act.
0de566d7
DM
12 *
13 * Here is an important copyright statement from the original, generated
14 * file:
15 *
16 * As a special exception, when this file is copied by Bison into a
17 * Bison output file, you may use that output file without
18 * restriction. This special exception was added by the Free
19 * Software Foundation in version 1.24 of Bison.
bc463c31
DM
20 *
21 * Note that this file is also #included in madly.c, to allow compilation
22 * of a second parser, Perl_madparse, that is identical to Perl_yyparse,
f05e27e5
DM
23 * but which includes extra code for dumping the parse tree.
24 * This is controlled by the PERL_IN_MADLY_C define.
0de566d7
DM
25 */
26
79072805 27#include "EXTERN.h"
864dbfa3 28#define PERL_IN_PERLY_C
79072805 29#include "perl.h"
09bef843 30
3797f23d
DM
31typedef unsigned char yytype_uint8;
32typedef signed char yytype_int8;
33typedef unsigned short int yytype_uint16;
34typedef short int yytype_int16;
0de566d7
DM
35typedef signed char yysigned_char;
36
37#ifdef DEBUGGING
38# define YYDEBUG 1
93a17b20 39#else
0de566d7 40# define YYDEBUG 0
93a17b20 41#endif
09bef843 42
f05e27e5
DM
43/* contains all the parser state tables; auto-generated from perly.y */
44#include "perly.tab"
0de566d7
DM
45
46# define YYSIZE_T size_t
47
0de566d7 48#define YYEOF 0
07a06489 49#define YYTERROR 1
0de566d7
DM
50
51#define YYACCEPT goto yyacceptlab
52#define YYABORT goto yyabortlab
53#define YYERROR goto yyerrlab1
54
0de566d7 55/* Enable debugging if requested. */
9388183f 56#ifdef DEBUGGING
0de566d7
DM
57
58# define yydebug (DEBUG_p_TEST)
59
60# define YYFPRINTF PerlIO_printf
61
62# define YYDPRINTF(Args) \
63do { \
64 if (yydebug) \
65 YYFPRINTF Args; \
66} while (0)
67
9388183f 68# define YYDSYMPRINTF(Title, Token, Value) \
0de566d7
DM
69do { \
70 if (yydebug) { \
71 YYFPRINTF (Perl_debug_log, "%s ", Title); \
356f4fed 72 yysymprint (aTHX_ Perl_debug_log, Token, Value); \
0de566d7
DM
73 YYFPRINTF (Perl_debug_log, "\n"); \
74 } \
75} while (0)
76
77/*--------------------------------.
78| Print this symbol on YYOUTPUT. |
79`--------------------------------*/
80
81static void
356f4fed 82yysymprint(pTHX_ PerlIO * const yyoutput, int yytype, const YYSTYPE * const yyvaluep)
0de566d7 83{
0de566d7
DM
84 if (yytype < YYNTOKENS) {
85 YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
86# ifdef YYPRINT
87 YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
9388183f 88# else
e4584336 89 YYFPRINTF (yyoutput, "0x%"UVxf, (UV)yyvaluep->ival);
0de566d7
DM
90# endif
91 }
92 else
93 YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
94
0de566d7
DM
95 YYFPRINTF (yyoutput, ")");
96}
97
98
9388183f 99/* yy_stack_print()
1654d593
DM
100 * print the top 8 items on the parse stack.
101 */
0de566d7
DM
102
103static void
1654d593 104yy_stack_print (pTHX_ const yy_parser *parser)
0de566d7 105{
1654d593 106 const yy_stack_frame *ps, *min;
9388183f 107
2d29f438 108 min = parser->ps - 8 + 1;
22735491
DM
109 if (min <= parser->stack)
110 min = parser->stack + 1;
9388183f
CB
111
112 PerlIO_printf(Perl_debug_log, "\nindex:");
1654d593 113 for (ps = min; ps <= parser->ps; ps++)
00c0e1ee 114 PerlIO_printf(Perl_debug_log, " %8d", (int)(ps - parser->stack));
1654d593 115
9388183f 116 PerlIO_printf(Perl_debug_log, "\nstate:");
1654d593
DM
117 for (ps = min; ps <= parser->ps; ps++)
118 PerlIO_printf(Perl_debug_log, " %8d", ps->state);
119
9388183f 120 PerlIO_printf(Perl_debug_log, "\ntoken:");
1654d593
DM
121 for (ps = min; ps <= parser->ps; ps++)
122 PerlIO_printf(Perl_debug_log, " %8.8s", ps->name);
123
9388183f 124 PerlIO_printf(Perl_debug_log, "\nvalue:");
1654d593
DM
125 for (ps = min; ps <= parser->ps; ps++) {
126 switch (yy_type_tab[yystos[ps->state]]) {
d5c6462e 127 case toketype_opval:
21612876 128 PerlIO_printf(Perl_debug_log, " %8.8s",
1654d593
DM
129 ps->val.opval
130 ? PL_op_name[ps->val.opval->op_type]
670f3923 131 : "(Nullop)"
21612876 132 );
d5c6462e
DM
133 break;
134#ifndef PERL_IN_MADLY_C
135 case toketype_p_tkval:
136 PerlIO_printf(Perl_debug_log, " %8.8s",
1654d593 137 ps->val.pval ? ps->val.pval : "(NULL)");
d5c6462e
DM
138 break;
139
140 case toketype_i_tkval:
141#endif
142 case toketype_ival:
1654d593 143 PerlIO_printf(Perl_debug_log, " %8"IVdf, (IV)ps->val.ival);
d5c6462e
DM
144 break;
145 default:
1654d593 146 PerlIO_printf(Perl_debug_log, " %8"UVxf, (UV)ps->val.ival);
d5c6462e 147 }
21612876 148 }
9388183f 149 PerlIO_printf(Perl_debug_log, "\n\n");
0de566d7
DM
150}
151
1654d593
DM
152# define YY_STACK_PRINT(parser) \
153do { \
154 if (yydebug && DEBUG_v_TEST) \
155 yy_stack_print (aTHX_ parser); \
0de566d7
DM
156} while (0)
157
09bef843 158
0de566d7
DM
159/*------------------------------------------------.
160| Report that the YYRULE is going to be reduced. |
161`------------------------------------------------*/
162
163static void
164yy_reduce_print (pTHX_ int yyrule)
165{
166 int yyi;
df35152e 167 const unsigned int yylineno = yyrline[yyrule];
0de566d7
DM
168 YYFPRINTF (Perl_debug_log, "Reducing stack by rule %d (line %u), ",
169 yyrule - 1, yylineno);
170 /* Print the symbols being reduced, and their result. */
171 for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++)
172 YYFPRINTF (Perl_debug_log, "%s ", yytname [yyrhs[yyi]]);
173 YYFPRINTF (Perl_debug_log, "-> %s\n", yytname [yyr1[yyrule]]);
174}
175
176# define YY_REDUCE_PRINT(Rule) \
177do { \
178 if (yydebug) \
179 yy_reduce_print (aTHX_ Rule); \
180} while (0)
181
182#else /* !DEBUGGING */
183# define YYDPRINTF(Args)
9388183f 184# define YYDSYMPRINTF(Title, Token, Value)
1654d593 185# define YY_STACK_PRINT(parser)
0de566d7
DM
186# define YY_REDUCE_PRINT(Rule)
187#endif /* !DEBUGGING */
188
718a7425
DM
189/* called during cleanup (via SAVEDESTRUCTOR_X) to free any items on the
190 * parse stack, thus avoiding leaks if we die */
191
192static void
22735491 193S_clear_yystack(pTHX_ const yy_parser *parser)
718a7425 194{
1654d593 195 yy_stack_frame *ps = parser->ps;
670f3923 196 int i;
718a7425 197
199e78b7 198 if (!parser->stack || ps == parser->stack)
718a7425 199 return;
1654d593 200
718a7425 201 YYDPRINTF ((Perl_debug_log, "clearing the parse stack\n"));
670f3923 202
7e5d8ed2
DM
203 /* Freeing ops on the stack, and the op_latefree / op_latefreed /
204 * op_attached flags:
670f3923
DM
205 *
206 * When we pop tokens off the stack during error recovery, or when
207 * we pop all the tokens off the stack after a die during a shift or
7e5d8ed2
DM
208 * reduce (i.e. Perl_croak somewhere in yylex() or in one of the
209 * newFOO() functions), then it's possible that some of these tokens are
670f3923
DM
210 * of type opval, pointing to an OP. All these ops are orphans; each is
211 * its own miniature subtree that has not yet been attached to a
7e5d8ed2
DM
212 * larger tree. In this case, we should clearly free the op (making
213 * sure, for each op we free that we have PL_comppad pointing to the
670f3923
DM
214 * right place for freeing any SVs attached to the op in threaded
215 * builds.
216 *
7e5d8ed2 217 * However, there is a particular problem if we die in newFOO() called
670f3923
DM
218 * by a reducing action; e.g.
219 *
220 * foo : bar baz boz
221 * { $$ = newFOO($1,$2,$3) }
222 *
223 * where
7e5d8ed2 224 * OP *newFOO { ....; if (...) croak; .... }
670f3923
DM
225 *
226 * In this case, when we come to clean bar baz and boz off the stack,
227 * we don't know whether newFOO() has already:
228 * * freed them
7e5d8ed2 229 * * left them as is
670f3923 230 * * attached them to part of a larger tree
7e5d8ed2
DM
231 * * attached them to PL_compcv
232 * * attached them to PL_compcv then freed it (as in BEGIN {die } )
670f3923
DM
233 *
234 * To get round this problem, we set the flag op_latefree on every op
235 * that gets pushed onto the parser stack. If op_free() sees this
236 * flag, it clears the op and frees any children,, but *doesn't* free
237 * the op itself; instead it sets the op_latefreed flag. This means
238 * that we can safely call op_free() multiple times on each stack op.
239 * So, when clearing the stack, we first, for each op that was being
240 * reduced, call op_free with op_latefree=1. This ensures that all ops
241 * hanging off these op are freed, but the reducing ops themselces are
242 * just undefed. Then we set op_latefreed=0 on *all* ops on the stack
7e5d8ed2
DM
243 * and free them. A little thought should convince you that this
244 * two-part approach to the reducing ops should handle the first three
245 * cases above safely.
246 *
247 * In the case of attaching to PL_compcv (currently just newATTRSUB
248 * does this), then we set the op_attached flag on the op that has
249 * been so attached, then avoid doing the final op_free during
250 * cleanup, on the assumption that it will happen (or has already
251 * happened) when PL_compcv is freed.
252 *
253 * Note this is fairly fragile mechanism. A more robust approach
254 * would be to use two of these flag bits as 2-bit reference count
255 * field for each op, indicating whether it is pointed to from:
256 * * a parent op
257 * * the parser stack
258 * * a CV
259 * but this would involve reworking all code (core and external) that
260 * manipulate op trees.
0aded6e1
DM
261 *
262 * XXX DAPM 17/1/07 I've decided its too fragile for now, and so have
263 * disabled it */
264
265#define DISABLE_STACK_FREE
670f3923 266
0aded6e1
DM
267
268#ifdef DISABLE_STACK_FREE
269 ps -= parser->yylen;
270 PERL_UNUSED_VAR(i);
271#else
7e5d8ed2 272 /* clear any reducing ops (1st pass) */
670f3923 273
5912531f 274 for (i=0; i< parser->yylen; i++) {
1654d593
DM
275 if (yy_type_tab[yystos[ps[-i].state]] == toketype_opval
276 && ps[-i].val.opval) {
7e5d8ed2
DM
277 if ( ! (ps[-i].val.opval->op_attached
278 && !ps[-i].val.opval->op_latefreed))
279 {
280 if (ps[-i].comppad != PL_comppad) {
281 PAD_RESTORE_LOCAL(ps[-i].comppad);
282 }
283 op_free(ps[-i].val.opval);
670f3923 284 }
670f3923
DM
285 }
286 }
0aded6e1 287#endif
670f3923
DM
288
289 /* now free whole the stack, including the just-reduced ops */
290
22735491 291 while (ps > parser->stack) {
1654d593
DM
292 if (yy_type_tab[yystos[ps->state]] == toketype_opval
293 && ps->val.opval)
670f3923 294 {
1654d593
DM
295 if (ps->comppad != PL_comppad) {
296 PAD_RESTORE_LOCAL(ps->comppad);
718a7425
DM
297 }
298 YYDPRINTF ((Perl_debug_log, "(freeing op)\n"));
0aded6e1 299#ifndef DISABLE_STACK_FREE
1654d593 300 ps->val.opval->op_latefree = 0;
7e5d8ed2 301 if (!(ps->val.opval->op_attached && !ps->val.opval->op_latefreed))
0aded6e1 302#endif
7e5d8ed2 303 op_free(ps->val.opval);
718a7425 304 }
1654d593 305 ps--;
718a7425
DM
306 }
307}
308
718a7425 309
0de566d7
DM
310/*----------.
311| yyparse. |
312`----------*/
313
79072805 314int
bc463c31
DM
315#ifdef PERL_IN_MADLY_C
316Perl_madparse (pTHX)
317#else
0de566d7 318Perl_yyparse (pTHX)
bc463c31 319#endif
79072805 320{
97aff369 321 dVAR;
0de566d7
DM
322 register int yystate;
323 register int yyn;
324 int yyresult;
325
0de566d7 326 /* Lookahead token as an internal (translated) token number. */
714c8e96 327 int yytoken = 0;
0de566d7 328
5912531f 329 register yy_parser *parser; /* the parser object */
1654d593 330 register yy_stack_frame *ps; /* current parser stack frame */
a0d0e21e 331
1654d593
DM
332#define YYPOPSTACK parser->ps = --ps
333#define YYPUSHSTACK parser->ps = ++ps
0de566d7 334
acdf0a21 335 /* The variable used to return semantic value and location from the
5912531f 336 action routines: ie $$. */
0de566d7
DM
337 YYSTYPE yyval;
338
bc463c31
DM
339#ifndef PERL_IN_MADLY_C
340# ifdef PERL_MAD
00e74f14
NC
341 if (PL_madskills)
342 return madparse();
bc463c31 343# endif
81d86705
NC
344#endif
345
0de566d7
DM
346 YYDPRINTF ((Perl_debug_log, "Starting parse\n"));
347
acdf0a21
DM
348 parser = PL_parser;
349 ps = parser->ps;
1654d593 350
e3abe207
DM
351 ENTER; /* force parser stack cleanup before we return */
352 SAVEDESTRUCTOR_X(S_clear_yystack, parser);
0de566d7 353
0de566d7
DM
354/*------------------------------------------------------------.
355| yynewstate -- Push a new state, which is found in yystate. |
356`------------------------------------------------------------*/
357 yynewstate:
0de566d7 358
1654d593 359 yystate = ps->state;
05a03161 360
670f3923 361 YYDPRINTF ((Perl_debug_log, "Entering state %d\n", yystate));
0de566d7 362
0aded6e1 363#ifndef DISABLE_STACK_FREE
1654d593
DM
364 if (yy_type_tab[yystos[yystate]] == toketype_opval && ps->val.opval) {
365 ps->val.opval->op_latefree = 1;
366 ps->val.opval->op_latefreed = 0;
670f3923 367 }
0aded6e1 368#endif
670f3923 369
5912531f 370 parser->yylen = 0;
0de566d7 371
1654d593 372 {
22735491 373 size_t size = ps - parser->stack + 1;
0de566d7 374
1654d593
DM
375 /* grow the stack? We always leave 1 spare slot,
376 * in case of a '' -> 'foo' reduction */
0de566d7 377
85c508c3 378 if (size >= (size_t)parser->stack_size - 1) {
1654d593
DM
379 /* this will croak on insufficient memory */
380 parser->stack_size *= 2;
22735491
DM
381 Renew(parser->stack, parser->stack_size, yy_stack_frame);
382 ps = parser->ps = parser->stack + size -1;
670f3923 383
1654d593
DM
384 YYDPRINTF((Perl_debug_log,
385 "parser stack size increased to %lu frames\n",
386 (unsigned long int)parser->stack_size));
387 }
93a17b20 388 }
0de566d7 389
0de566d7
DM
390/* Do appropriate processing given the current state. */
391/* Read a lookahead token if we need one and don't already have one. */
0de566d7
DM
392
393 /* First try to decide what to do without reference to lookahead token. */
394
395 yyn = yypact[yystate];
396 if (yyn == YYPACT_NINF)
397 goto yydefault;
398
399 /* Not known => get a lookahead token if don't already have one. */
400
401 /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */
5912531f 402 if (parser->yychar == YYEMPTY) {
0de566d7 403 YYDPRINTF ((Perl_debug_log, "Reading a token: "));
f05e27e5 404#ifdef PERL_IN_MADLY_C
5912531f 405 parser->yychar = PL_madskills ? madlex() : yylex();
f05e27e5 406#else
5912531f 407 parser->yychar = yylex();
81d86705 408#endif
bc463c31 409
12fbd33b 410# ifdef EBCDIC
5912531f
DM
411 if (parser->yychar >= 0 && parser->yychar < 255) {
412 parser->yychar = NATIVE_TO_ASCII(parser->yychar);
12fbd33b
DM
413 }
414# endif
0de566d7
DM
415 }
416
5912531f
DM
417 if (parser->yychar <= YYEOF) {
418 parser->yychar = yytoken = YYEOF;
0de566d7 419 YYDPRINTF ((Perl_debug_log, "Now at end of input.\n"));
93a17b20 420 }
0de566d7 421 else {
5912531f
DM
422 yytoken = YYTRANSLATE (parser->yychar);
423 YYDSYMPRINTF ("Next token is", yytoken, &parser->yylval);
93a17b20 424 }
771df094 425
0de566d7
DM
426 /* If the proper action on seeing token YYTOKEN is to reduce or to
427 detect an error, take that action. */
428 yyn += yytoken;
429 if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
430 goto yydefault;
431 yyn = yytable[yyn];
432 if (yyn <= 0) {
433 if (yyn == 0 || yyn == YYTABLE_NINF)
434 goto yyerrlab;
435 yyn = -yyn;
436 goto yyreduce;
437 }
7b57b0ea 438
0de566d7
DM
439 if (yyn == YYFINAL)
440 YYACCEPT;
771df094 441
0de566d7
DM
442 /* Shift the lookahead token. */
443 YYDPRINTF ((Perl_debug_log, "Shifting token %s, ", yytname[yytoken]));
444
445 /* Discard the token being shifted unless it is eof. */
5912531f
DM
446 if (parser->yychar != YYEOF)
447 parser->yychar = YYEMPTY;
0de566d7 448
1654d593
DM
449 YYPUSHSTACK;
450 ps->state = yyn;
5912531f 451 ps->val = parser->yylval;
1654d593 452 ps->comppad = PL_comppad;
9388183f 453#ifdef DEBUGGING
1654d593 454 ps->name = (const char *)(yytname[yytoken]);
9388183f 455#endif
0de566d7 456
0de566d7
DM
457 /* Count tokens shifted since error; after three, turn off error
458 status. */
5912531f
DM
459 if (parser->yyerrstatus)
460 parser->yyerrstatus--;
0de566d7 461
0de566d7
DM
462 goto yynewstate;
463
464
465 /*-----------------------------------------------------------.
466 | yydefault -- do the default action for the current state. |
467 `-----------------------------------------------------------*/
468 yydefault:
469 yyn = yydefact[yystate];
470 if (yyn == 0)
471 goto yyerrlab;
472 goto yyreduce;
473
474
475 /*-----------------------------.
476 | yyreduce -- Do a reduction. |
477 `-----------------------------*/
478 yyreduce:
479 /* yyn is the number of a rule to reduce with. */
5912531f 480 parser->yylen = yyr2[yyn];
0de566d7
DM
481
482 /* If YYLEN is nonzero, implement the default value of the action:
a0288114 483 "$$ = $1".
0de566d7
DM
484
485 Otherwise, the following line sets YYVAL to garbage.
486 This behavior is undocumented and Bison
487 users should not rely upon it. Assigning to YYVAL
488 unconditionally makes the parser a bit smaller, and it avoids a
489 GCC warning that YYVAL may be used uninitialized. */
5912531f 490 yyval = ps[1-parser->yylen].val;
0de566d7 491
1654d593 492 YY_STACK_PRINT(parser);
0de566d7 493 YY_REDUCE_PRINT (yyn);
718a7425 494
0de566d7
DM
495 switch (yyn) {
496
0de566d7
DM
497
498#define dep() deprecate("\"do\" to call subroutines")
f05e27e5 499
bc463c31 500#ifdef PERL_IN_MADLY_C
f05e27e5
DM
501# define IVAL(i) (i)->tk_lval.ival
502# define PVAL(p) (p)->tk_lval.pval
503# define TOKEN_GETMAD(a,b,c) token_getmad((a),(b),(c))
504# define TOKEN_FREE(a) token_free(a)
505# define OP_GETMAD(a,b,c) op_getmad((a),(b),(c))
506# define IF_MAD(a,b) (a)
507# define DO_MAD(a) a
508# define MAD
bc463c31 509#else
f05e27e5
DM
510# define IVAL(i) (i)
511# define PVAL(p) (p)
512# define TOKEN_GETMAD(a,b,c)
513# define TOKEN_FREE(a)
514# define OP_GETMAD(a,b,c)
515# define IF_MAD(a,b) (b)
516# define DO_MAD(a)
517# undef MAD
bc463c31 518#endif
7b57b0ea 519
f05e27e5
DM
520/* contains all the rule actions; auto-generated from perly.y */
521#include "perly.act"
522
93a17b20 523 }
0de566d7 524
0aded6e1 525#ifndef DISABLE_STACK_FREE
670f3923
DM
526 /* any just-reduced ops with the op_latefreed flag cleared need to be
527 * freed; the rest need the flag resetting */
528 {
529 int i;
5912531f 530 for (i=0; i< parser->yylen; i++) {
1654d593
DM
531 if (yy_type_tab[yystos[ps[-i].state]] == toketype_opval
532 && ps[-i].val.opval)
670f3923 533 {
1654d593
DM
534 ps[-i].val.opval->op_latefree = 0;
535 if (ps[-i].val.opval->op_latefreed)
536 op_free(ps[-i].val.opval);
670f3923
DM
537 }
538 }
539 }
0aded6e1 540#endif
670f3923 541
5912531f 542 parser->ps = ps -= (parser->yylen-1);
0de566d7 543
05a03161
DM
544 /* Now shift the result of the reduction. Determine what state
545 that goes to, based on the state we popped back to and the rule
546 number reduced by. */
547
1654d593
DM
548 ps->val = yyval;
549 ps->comppad = PL_comppad;
9388183f 550#ifdef DEBUGGING
1654d593 551 ps->name = (const char *)(yytname [yyr1[yyn]]);
9388183f 552#endif
0de566d7
DM
553
554 yyn = yyr1[yyn];
555
1654d593
DM
556 yystate = yypgoto[yyn - YYNTOKENS] + ps[-1].state;
557 if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == ps[-1].state)
0de566d7 558 yystate = yytable[yystate];
93a17b20 559 else
0de566d7 560 yystate = yydefgoto[yyn - YYNTOKENS];
1654d593 561 ps->state = yystate;
05a03161 562
0de566d7
DM
563 goto yynewstate;
564
565
566 /*------------------------------------.
567 | yyerrlab -- here on detecting error |
568 `------------------------------------*/
569 yyerrlab:
570 /* If not already recovering from an error, report this error. */
5912531f 571 if (!parser->yyerrstatus) {
07a06489 572 yyerror ("syntax error");
93a17b20 573 }
0de566d7
DM
574
575
5912531f 576 if (parser->yyerrstatus == 3) {
0de566d7
DM
577 /* If just tried and failed to reuse lookahead token after an
578 error, discard it. */
579
580 /* Return failure if at end of input. */
5912531f 581 if (parser->yychar == YYEOF) {
0de566d7
DM
582 /* Pop the error token. */
583 YYPOPSTACK;
584 /* Pop the rest of the stack. */
22735491 585 while (ps > parser->stack) {
1654d593
DM
586 YYDSYMPRINTF ("Error: popping", yystos[ps->state], &ps->val);
587 if (yy_type_tab[yystos[ps->state]] == toketype_opval
588 && ps->val.opval)
670f3923 589 {
0539ab63 590 YYDPRINTF ((Perl_debug_log, "(freeing op)\n"));
1654d593
DM
591 if (ps->comppad != PL_comppad) {
592 PAD_RESTORE_LOCAL(ps->comppad);
718a7425 593 }
1654d593
DM
594 ps->val.opval->op_latefree = 0;
595 op_free(ps->val.opval);
0539ab63 596 }
0de566d7
DM
597 YYPOPSTACK;
598 }
599 YYABORT;
600 }
601
5912531f
DM
602 YYDSYMPRINTF ("Error: discarding", yytoken, &parser->yylval);
603 parser->yychar = YYEMPTY;
0de566d7 604
93a17b20 605 }
0de566d7
DM
606
607 /* Else will try to reuse lookahead token after shifting the error
608 token. */
609 goto yyerrlab1;
610
611
612 /*----------------------------------------------------.
613 | yyerrlab1 -- error raised explicitly by an action. |
614 `----------------------------------------------------*/
615 yyerrlab1:
5912531f 616 parser->yyerrstatus = 3; /* Each real token shifted decrements this. */
0de566d7
DM
617
618 for (;;) {
619 yyn = yypact[yystate];
620 if (yyn != YYPACT_NINF) {
621 yyn += YYTERROR;
622 if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) {
623 yyn = yytable[yyn];
624 if (0 < yyn)
625 break;
626 }
627 }
628
629 /* Pop the current state because it cannot handle the error token. */
22735491 630 if (ps == parser->stack)
0de566d7
DM
631 YYABORT;
632
1654d593
DM
633 YYDSYMPRINTF ("Error: popping", yystos[ps->state], &ps->val);
634 if (yy_type_tab[yystos[ps->state]] == toketype_opval && ps->val.opval) {
0539ab63 635 YYDPRINTF ((Perl_debug_log, "(freeing op)\n"));
1654d593
DM
636 if (ps->comppad != PL_comppad) {
637 PAD_RESTORE_LOCAL(ps->comppad);
718a7425 638 }
1654d593
DM
639 ps->val.opval->op_latefree = 0;
640 op_free(ps->val.opval);
0539ab63 641 }
1654d593
DM
642 YYPOPSTACK;
643 yystate = ps->state;
0de566d7 644
1654d593 645 YY_STACK_PRINT(parser);
93a17b20 646 }
0de566d7
DM
647
648 if (yyn == YYFINAL)
649 YYACCEPT;
650
651 YYDPRINTF ((Perl_debug_log, "Shifting error token, "));
652
1654d593
DM
653 YYPUSHSTACK;
654 ps->state = yyn;
5912531f 655 ps->val = parser->yylval;
1654d593 656 ps->comppad = PL_comppad;
9388183f 657#ifdef DEBUGGING
1654d593 658 ps->name ="<err>";
9388183f 659#endif
0de566d7 660
0de566d7
DM
661 goto yynewstate;
662
663
664 /*-------------------------------------.
665 | yyacceptlab -- YYACCEPT comes here. |
666 `-------------------------------------*/
667 yyacceptlab:
668 yyresult = 0;
22735491 669 parser->ps = parser->stack; /* disable cleanup */
0de566d7
DM
670 goto yyreturn;
671
672 /*-----------------------------------.
673 | yyabortlab -- YYABORT comes here. |
674 `-----------------------------------*/
675 yyabortlab:
676 yyresult = 1;
677 goto yyreturn;
678
0de566d7 679 yyreturn:
e3abe207 680 LEAVE; /* force parser stack cleanup before we return */
0de566d7 681 return yyresult;
e1f15930 682}
66610fdd
RGS
683
684/*
685 * Local variables:
686 * c-indentation-style: bsd
687 * c-basic-offset: 4
688 * indent-tabs-mode: t
689 * End:
690 *
37442d52
RGS
691 * ex: set ts=8 sts=4 sw=4 noet:
692 */