--- perly.c.orig Mon Aug 5 15:02:10 2002 +++ perly.c Mon Aug 5 15:08:41 2002 @@ -1,5 +1,5 @@ #ifndef lint -static char yysccsid[] = "@(#)yaccpar 1.8 (Berkeley) 01/20/91"; +/* static char yysccsid[] = "@(#)yaccpar 1.8 (Berkeley) 01/20/91"; */ #endif #define YYBYACC 1 #line 16 "perly.y" @@ -9,7 +9,7 @@ #ifdef EBCDIC #undef YYDEBUG #endif -#define dep() deprecate("\"do\" to call subroutines") +#define dep() deprecate_old("\"do\" to call subroutines") /* stuff included here to make perly_c.diff apply better */ @@ -50,72 +50,9 @@ #define yylex yylex_r #endif -#line 54 "y.tab.c" -#define WORD 257 -#define METHOD 258 -#define FUNCMETH 259 -#define THING 260 -#define PMFUNC 261 -#define PRIVATEREF 262 -#define FUNC0SUB 263 -#define UNIOPSUB 264 -#define LSTOPSUB 265 -#define LABEL 266 -#define FORMAT 267 -#define SUB 268 -#define ANONSUB 269 -#define PACKAGE 270 -#define USE 271 -#define WHILE 272 -#define UNTIL 273 -#define IF 274 -#define UNLESS 275 -#define ELSE 276 -#define ELSIF 277 -#define CONTINUE 278 -#define FOR 279 -#define LOOPEX 280 -#define DOTDOT 281 -#define FUNC0 282 -#define FUNC1 283 -#define FUNC 284 -#define UNIOP 285 -#define LSTOP 286 -#define RELOP 287 -#define EQOP 288 -#define MULOP 289 -#define ADDOP 290 -#define DOLSHARP 291 -#define DO 292 -#define HASHBRACK 293 -#define NOAMP 294 -#define LOCAL 295 -#define MY 296 -#define MYSUB 297 -#define COLONATTR 298 -#define PREC_LOW 299 -#define OROP 300 -#define DOROP 301 -#define ANDOP 302 -#define NOTOP 303 -#define ASSIGNOP 304 -#define OROR 305 -#define DORDOR 306 -#define ANDAND 307 -#define BITOROP 308 -#define BITANDOP 309 -#define SHIFTOP 310 -#define MATCHOP 311 -#define UMINUS 312 -#define REFGEN 313 -#define POWOP 314 -#define PREINC 315 -#define PREDEC 316 -#define POSTINC 317 -#define POSTDEC 318 -#define ARROW 319 +#line 54 "perly.c" #define YYERRCODE 256 -short yylhs[] = { -1, +static short yylhs[] = { -1, 0, 9, 7, 6, 10, 8, 11, 11, 11, 12, 12, 12, 12, 25, 25, 25, 25, 25, 25, 25, 15, 15, 15, 14, 14, 43, 43, 13, 13, 13, @@ -137,7 +74,7 @@ 49, 49, 49, 34, 34, 35, 35, 35, 44, 24, 19, 20, 21, 22, 23, 36, 36, 36, 36, }; -short yylen[] = { 2, +static short yylen[] = { 2, 2, 4, 0, 0, 4, 0, 0, 2, 2, 2, 1, 2, 3, 1, 1, 3, 3, 3, 3, 3, 0, 2, 6, 7, 7, 0, 2, 8, 8, 10, @@ -159,7 +96,7 @@ 1, 1, 1, 0, 1, 0, 1, 2, 1, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, }; -short yydefred[] = { 4, +static short yydefred[] = { 4, 0, 7, 0, 45, 58, 56, 0, 56, 56, 8, 46, 9, 11, 48, 0, 47, 49, 50, 0, 0, 0, 70, 71, 0, 14, 3, 175, 0, 0, 156, @@ -201,7 +138,7 @@ 0, 32, 0, 0, 0, 22, 0, 0, 0, 31, 5, 0, 30, 0, 0, 33, 0, 23, }; -short yydgoto[] = { 1, +static short yydgoto[] = { 1, 10, 11, 20, 104, 19, 2, 95, 374, 98, 363, 3, 12, 13, 70, 379, 289, 72, 73, 74, 75, 76, 77, 78, 79, 295, 81, 296, 285, 287, 290, @@ -209,7 +146,7 @@ 196, 331, 156, 293, 275, 227, 14, 83, 137, 84, 85, 86, 87, 15, 16, 17, 18, 93, 282, }; -short yysindex[] = { 0, +static short yysindex[] = { 0, 0, 0, -183, 0, 0, 0, -57, 0, 0, 0, 0, 0, 0, 0, 820, 0, 0, 0, -222, -208, 7, 0, 0, -208, 0, 0, 0, -31, -31, 0, @@ -251,7 +188,7 @@ 179, 0, 1860, -168, 352, 0, 2214, -168, 298, 0, 0, 299, 0, 179, 179, 0, -256, 0, }; -short yyrindex[] = { 0, +static short yyrindex[] = { 0, 0, 0, 372, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -293,7 +230,7 @@ 0, 0, 370, 91, 881, 0, 0, 91, 0, 0, 0, 0, 0, 0, 0, 0, 187, 0, }; -short yygindex[] = { 0, +static short yygindex[] = { 0, 0, 0, 29, 378, 0, 0, -55, 0, 676, 567, -94, 0, 0, 0, -355, -15, 2480, 0, 650, 364, 380, 0, 0, 0, 412, 755, 0, 0, 291, -202, @@ -302,7 +239,7 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, }; #define YYTABLESIZE 5052 -short yytable[] = { 71, +static short yytable[] = { 71, 199, 22, 60, 229, 65, 65, 222, 297, 60, 111, 380, 200, 279, 329, 65, 300, 62, 64, 258, 377, 378, 161, 15, 184, 161, 220, 230, 187, 65, 67, @@ -810,7 +747,7 @@ 0, 0, 0, 0, 0, 115, 115, 115, 0, 115, 115, 115, }; -short yycheck[] = { 15, +static short yycheck[] = { 15, 95, 59, 59, 41, 36, 36, 59, 210, 123, 40, 366, 100, 201, 59, 36, 41, 59, 59, 40, 276, 277, 41, 41, 40, 44, 40, 93, 91, 36, 37, @@ -1324,7 +1261,7 @@ #endif #define YYMAXTOKEN 319 #if YYDEBUG -char *yyname[] = { +static char *yyname[] = { "end-of-file",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, "'!'",0,0,"'$'","'%'","'&'",0,"'('","')'","'*'","'+'","','","'-'",0,0,0,0,0,0,0, 0,0,0,0,0,"':'","';'",0,0,0,"'?'","'@'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -1341,7 +1278,7 @@ "DORDOR","ANDAND","BITOROP","BITANDOP","SHIFTOP","MATCHOP","UMINUS","REFGEN", "POWOP","PREINC","PREDEC","POSTINC","POSTDEC","ARROW", }; -char *yyrule[] = { +static char *yyrule[] = { "$accept : prog", "prog : progstart lineseq", "block : '{' remember lineseq '}'", @@ -1558,17 +1495,6 @@ #define YYMAXDEPTH 500 #endif #endif -int yydebug; -int yynerrs; -int yyerrflag; -int yychar; -short *yyssp; -YYSTYPE *yyvsp; -YYSTYPE yyval; -YYSTYPE yylval; -short yyss[YYSTACKSIZE]; -YYSTYPE yyvs[YYSTACKSIZE]; -#define yystacksize YYSTACKSIZE #line 797 "perly.y" /* PROGRAM */ @@ -1579,7 +1505,7 @@ #endif #define yyparse() Perl_yyparse(pTHX) -#line 1583 "y.tab.c" +#line 1509 "perly.c" #define YYABORT goto yyabort #define YYACCEPT goto yyaccept #define YYERROR goto yyerrlab @@ -1587,11 +1513,31 @@ yyparse() { register int yym, yyn, yystate; + register short *yyssp; + register YYSTYPE *yyvsp; + short* yyss; + YYSTYPE* yyvs; + unsigned yystacksize = YYSTACKSIZE; + int retval = 0; #if YYDEBUG register char *yys; - extern char *getenv(); +#endif + + struct ysv *ysave; +#ifdef USE_ITHREADS + ENTER; /* force yydestruct() before we return */ +#endif + New(73, ysave, 1, struct ysv); + SAVEDESTRUCTOR_X(yydestruct, ysave); + ysave->oldyydebug = yydebug; + ysave->oldyynerrs = yynerrs; + ysave->oldyyerrflag = yyerrflag; + ysave->oldyychar = yychar; + ysave->oldyyval = yyval; + ysave->oldyylval = yylval; - if (yys = getenv("YYDEBUG")) +#if YYDEBUG + if ((yys = getenv("YYDEBUG"))) { yyn = *yys; if (yyn >= '0' && yyn <= '9') @@ -1603,12 +1549,22 @@ yyerrflag = 0; yychar = (-1); + /* + ** Initialize private stacks (yyparse may be called from an action) + */ + New(73, yyss, yystacksize, short); + New(73, yyvs, yystacksize, YYSTYPE); + ysave->yyss = yyss; + ysave->yyvs = yyvs; + if (!yyvs || !yyss) + goto yyoverflow; + yyssp = yyss; yyvsp = yyvs; *yyssp = yystate = 0; yyloop: - if (yyn = yydefred[yystate]) goto yyreduce; + if ((yyn = yydefred[yystate])) goto yyreduce; if (yychar < 0) { if ((yychar = yylex()) < 0) yychar = 0; @@ -1618,7 +1574,7 @@ yys = 0; if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; if (!yys) yys = "illegal-symbol"; - printf("yydebug: state %d, reading %d (%s)\n", yystate, + PerlIO_printf(Perl_debug_log, "yydebug: state %d, reading %d (%s)\n", yystate, yychar, yys); } #endif @@ -1628,12 +1584,24 @@ { #if YYDEBUG if (yydebug) - printf("yydebug: state %d, shifting to state %d\n", + PerlIO_printf(Perl_debug_log, "yydebug: state %d, shifting to state %d\n", yystate, yytable[yyn]); #endif if (yyssp >= yyss + yystacksize - 1) { + /* + ** reallocate and recover. Note that pointers + ** have to be reset, or bad things will happen + */ + int yyps_index = (yyssp - yyss); + int yypv_index = (yyvsp - yyvs); + yystacksize += YYSTACKSIZE; + ysave->yyvs = Renew(yyvs, yystacksize, YYSTYPE); + ysave->yyss = Renew(yyss, yystacksize, short); + if (!yyvs || !yyss) goto yyoverflow; + yyssp = yyss + yyps_index; + yyvsp = yyvs + yypv_index; } *++yyssp = yystate = yytable[yyn]; *++yyvsp = yylval; @@ -1649,14 +1617,14 @@ } if (yyerrflag) goto yyinrecovery; #ifdef lint - goto yynewerror; + #endif -yynewerror: + yyerror("syntax error"); #ifdef lint - goto yyerrlab; + #endif -yyerrlab: + ++yynerrs; yyinrecovery: if (yyerrflag < 3) @@ -1669,12 +1637,24 @@ { #if YYDEBUG if (yydebug) - printf("yydebug: state %d, error recovery shifting\ + PerlIO_printf(Perl_debug_log, "yydebug: state %d, error recovery shifting\ to state %d\n", *yyssp, yytable[yyn]); #endif if (yyssp >= yyss + yystacksize - 1) { + /* + ** reallocate and recover. Note that pointers + ** have to be reset, or bad things will happen + */ + int yyps_index = (yyssp - yyss); + int yypv_index = (yyvsp - yyvs); + yystacksize += YYSTACKSIZE; + ysave->yyvs = Renew(yyvs, yystacksize, YYSTYPE); + ysave->yyss = Renew(yyss, yystacksize, short); + if (!yyvs || !yyss) goto yyoverflow; + yyssp = yyss + yyps_index; + yyvsp = yyvs + yypv_index; } *++yyssp = yystate = yytable[yyn]; *++yyvsp = yylval; @@ -1684,7 +1664,7 @@ { #if YYDEBUG if (yydebug) - printf("yydebug: error recovery discarding state %d\n", + PerlIO_printf(Perl_debug_log, "yydebug: error recovery discarding state %d\n", *yyssp); #endif if (yyssp <= yyss) goto yyabort; @@ -1702,7 +1682,7 @@ yys = 0; if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; if (!yys) yys = "illegal-symbol"; - printf("yydebug: state %d, error recovery discards token %d (%s)\n", + PerlIO_printf(Perl_debug_log, "yydebug: state %d, error recovery discards token %d (%s)\n", yystate, yychar, yys); } #endif @@ -1712,7 +1692,7 @@ yyreduce: #if YYDEBUG if (yydebug) - printf("yydebug: state %d, reducing by rule %d (%s)\n", + PerlIO_printf(Perl_debug_log, "yydebug: state %d, reducing by rule %d (%s)\n", yystate, yyn, yyrule[yyn]); #endif yym = yylen[yyn]; @@ -2583,7 +2563,7 @@ #line 794 "perly.y" { yyval.opval = yyvsp[0].opval; } break; -#line 2587 "y.tab.c" +#line 2567 "perly.c" } yyssp -= yym; yystate = *yyssp; @@ -2593,7 +2573,7 @@ { #if YYDEBUG if (yydebug) - printf("yydebug: after reduction, shifting from state 0 to\ + PerlIO_printf(Perl_debug_log, "yydebug: after reduction, shifting from state 0 to\ state %d\n", YYFINAL); #endif yystate = YYFINAL; @@ -2608,7 +2588,7 @@ yys = 0; if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; if (!yys) yys = "illegal-symbol"; - printf("yydebug: state %d, reading %d (%s)\n", + PerlIO_printf(Perl_debug_log, "yydebug: state %d, reading %d (%s)\n", YYFINAL, yychar, yys); } #endif @@ -2623,20 +2603,50 @@ yystate = yydgoto[yym]; #if YYDEBUG if (yydebug) - printf("yydebug: after reduction, shifting from state %d \ + PerlIO_printf(Perl_debug_log, "yydebug: after reduction, shifting from state %d \ to state %d\n", *yyssp, yystate); #endif if (yyssp >= yyss + yystacksize - 1) { + /* + ** reallocate and recover. Note that pointers + ** have to be reset, or bad things will happen + */ + int yyps_index = (yyssp - yyss); + int yypv_index = (yyvsp - yyvs); + yystacksize += YYSTACKSIZE; + ysave->yyvs = Renew(yyvs, yystacksize, YYSTYPE); + ysave->yyss = Renew(yyss, yystacksize, short); + if (!yyvs || !yyss) goto yyoverflow; + yyssp = yyss + yyps_index; + yyvsp = yyvs + yypv_index; } *++yyssp = yystate; *++yyvsp = yyval; goto yyloop; yyoverflow: - yyerror("yacc stack overflow"); + yyerror("Out of memory for yacc stack"); yyabort: - return (1); + retval = 1; yyaccept: - return (0); +#ifdef USE_ITHREADS + LEAVE; /* force yydestruct() before we return */ +#endif + return retval; +} + +static void +yydestruct(pTHX_ void *ptr) +{ + struct ysv* ysave = (struct ysv*)ptr; + if (ysave->yyss) Safefree(ysave->yyss); + if (ysave->yyvs) Safefree(ysave->yyvs); + yydebug = ysave->oldyydebug; + yynerrs = ysave->oldyynerrs; + yyerrflag = ysave->oldyyerrflag; + yychar = ysave->oldyychar; + yyval = ysave->oldyyval; + yylval = ysave->oldyylval; + Safefree(ysave); }