This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Add a test case for waitpid(): from Rocco Caputo.
[perl5.git] / perly_c.diff
index 11664b4..aab3a86 100644 (file)
-*** perly.c.orig       Tue Oct 27 12:59:58 1998
---- perly.c    Tue Oct 27 13:00:18 1998
-***************
-*** 7,10 ****
---- 7,27 ----
-  #include "perl.h"
-  
-+ #define yydebug          PL_yydebug
-+ #define yynerrs          PL_yynerrs
-+ #define yyerrflag   PL_yyerrflag
-+ #define yychar           PL_yychar
-+ #define yyssp            PL_yyssp
-+ #define yyvsp            PL_yyvsp
-+ #define yyval            PL_yyval
-+ #define yylval           PL_yylval
-+ 
-+ #ifdef PERL_OBJECT
-+ static void
-+ Dep(CPerlObj *pPerl)
-+ {
-+     pPerl->deprecate("\"do\" to call subroutines");
-+ }
-+ #define dep() Dep(this)
-+ #else
-  static void
-  dep(void)
-***************
-*** 12,91 ****
-      deprecate("\"do\" to call subroutines");
-  }
-  
-  #line 30 "perly.y"
-- /* I sense a Big Blue pattern here... */
-- #if !defined(OEMVS) && !defined(__OPEN_VM) && !defined(POSIX_BC)
-- #line 34 "perly.y"
-- typedef union {
--     I32      ival;
--     char *pval;
--     OP *opval;
--     GV *gvval;
-- } YYSTYPE;
-- #line 42 "perly.y"
-- #endif /* !OEMVS && !__OPEN_VM && !POSIX_BC */
-- 
-- #ifdef USE_PURE_BISON
-- #define YYLEX_PARAM (&yychar)
-- #endif
-- #line 32 "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 OROP 297
-- #define ANDOP 298
-- #define NOTOP 299
-- #define ASSIGNOP 300
-- #define OROR 301
-- #define ANDAND 302
-- #define BITOROP 303
-- #define BITANDOP 304
-- #define SHIFTOP 305
-- #define MATCHOP 306
-- #define UMINUS 307
-- #define REFGEN 308
-- #define POWOP 309
-- #define PREINC 310
-- #define PREDEC 311
-- #define POSTINC 312
-- #define POSTDEC 313
-- #define ARROW 314
-  #define YYERRCODE 256
-  short yylhs[] = {                                        -1,
---- 29,35 ----
-      deprecate("\"do\" to call subroutines");
-  }
-+ #endif
-  
-  #line 30 "perly.y"
-  #define YYERRCODE 256
-  short yylhs[] = {                                        -1,
-***************
-*** 1342,1370 ****
-  #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 648 "perly.y"
-   /* PROGRAM */
-! #line 1358 "y.tab.c"
-  #define YYABORT goto yyabort
-  #define YYACCEPT goto yyaccept
-  #define YYERROR goto yyerrlab
-  int
-! yyparse()
-  {
-      register int yym, yyn, yystate;
-  #if YYDEBUG
-      register char *yys;
-      extern char *getenv();
-  
-      if (yys = getenv("YYDEBUG"))
-      {
---- 1286,1350 ----
-  #endif
-  #endif
-  #line 648 "perly.y"
-   /* PROGRAM */
-! #line 1358 "perly.c"
-  #define YYABORT goto yyabort
-  #define YYACCEPT goto yyaccept
-  #define YYERROR goto yyerrlab
-+ 
-+ struct ysv {
-+     short* yyss;
-+     YYSTYPE* yyvs;
-+     int oldyydebug;
-+     int oldyynerrs;
-+     int oldyyerrflag;
-+     int oldyychar;
-+     YYSTYPE oldyyval;
-+     YYSTYPE oldyylval;
-+ };
-+ 
-+ void
-+ yydestruct(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);
-+ }
-+ 
-  int
-! yyparse(void)
-  {
-      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;
-+ #ifndef __cplusplus
-      extern char *getenv();
-+ #endif
-+ #endif
-+ 
-+     struct ysv *ysave;
-+     New(73, ysave, 1, struct ysv);
-+     SAVEDESTRUCTOR(yydestruct, ysave);
-+     ysave->oldyydebug        = yydebug;
-+     ysave->oldyynerrs        = yynerrs;
-+     ysave->oldyyerrflag      = yyerrflag;
-+     ysave->oldyychar = yychar;
-+     ysave->oldyyval  = yyval;
-+     ysave->oldyylval = yylval;
-  
-+ #if YYDEBUG
-      if (yys = getenv("YYDEBUG"))
-      {
-***************
-*** 1379,1382 ****
---- 1359,1372 ----
-      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;
-***************
-*** 1404,1413 ****
-  #if YYDEBUG
-          if (yydebug)
-!             printf("yydebug: state %d, shifting to state %d\n",
-                      yystate, yytable[yyn]);
-  #endif
-          if (yyssp >= yyss + yystacksize - 1)
-          {
-!             goto yyoverflow;
-          }
-          *++yyssp = yystate = yytable[yyn];
---- 1394,1417 ----
-  #if YYDEBUG
-          if (yydebug)
-!             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 = yyvs =
-!              (YYSTYPE*)PerlMem_realloc((char*)yyvs,yystacksize * sizeof(YYSTYPE));
-!          ysave->yyss = yyss =
-!              (short*)PerlMem_realloc((char*)yyss,yystacksize * sizeof(short));
-!          if (!yyvs || !yyss)
-!              goto yyoverflow;
-!          yyssp = yyss + yyps_index;
-!          yyvsp = yyvs + yypv_index;
-          }
-          *++yyssp = yystate = yytable[yyn];
-***************
-*** 1445,1454 ****
-  #if YYDEBUG
-                  if (yydebug)
-!                     printf("yydebug: state %d, error recovery shifting\
-!  to state %d\n", *yyssp, yytable[yyn]);
-  #endif
-                  if (yyssp >= yyss + yystacksize - 1)
-                  {
-!                     goto yyoverflow;
-                  }
-                  *++yyssp = yystate = yytable[yyn];
---- 1449,1473 ----
-  #if YYDEBUG
-                  if (yydebug)
-!                     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 = yyvs = (YYSTYPE*)PerlMem_realloc((char*)yyvs,
-!                      yystacksize * sizeof(YYSTYPE));
-!                  ysave->yyss = yyss = (short*)PerlMem_realloc((char*)yyss,
-!                      yystacksize * sizeof(short));
-!                  if (!yyvs || !yyss)
-!                      goto yyoverflow;
-!                  yyssp = yyss + yyps_index;
-!                  yyvsp = yyvs + yypv_index;
-                  }
-                  *++yyssp = yystate = yytable[yyn];
-***************
-*** 1460,1465 ****
-  #if YYDEBUG
-                  if (yydebug)
-!                     printf("yydebug: error recovery discarding state %d\n",
-!                             *yyssp);
-  #endif
-                  if (yyssp <= yyss) goto yyabort;
---- 1479,1485 ----
-  #if YYDEBUG
-                  if (yydebug)
-!                     PerlIO_printf(Perl_debug_log,
-!                      "yydebug: error recovery discarding state %d\n",
-!                      *yyssp);
-  #endif
-                  if (yyssp <= yyss) goto yyabort;
-***************
-*** 1478,1483 ****
-              if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
-              if (!yys) yys = "illegal-symbol";
-!             printf("yydebug: state %d, error recovery discards token %d (%s)\n",
-!                     yystate, yychar, yys);
-          }
-  #endif
---- 1498,1504 ----
-              if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
-              if (!yys) yys = "illegal-symbol";
-!             PerlIO_printf(Perl_debug_log,
-!              "yydebug: state %d, error recovery discards token %d (%s)\n",
-!              yystate, yychar, yys);
-          }
-  #endif
-***************
-*** 1488,1492 ****
-  #if YYDEBUG
-      if (yydebug)
-!         printf("yydebug: state %d, reducing by rule %d (%s)\n",
-                  yystate, yyn, yyrule[yyn]);
-  #endif
---- 1509,1513 ----
-  #if YYDEBUG
-      if (yydebug)
-!         PerlIO_printf(Perl_debug_log, "yydebug: state %d, reducing by rule %d (%s)\n",
-                  yystate, yyn, yyrule[yyn]);
-  #endif
-***************
-*** 2272,2276 ****
-  { yyval.opval = yyvsp[0].opval; }
-  break;
-! #line 2275 "y.tab.c"
-      }
-      yyssp -= yym;
---- 2293,2297 ----
-  { yyval.opval = yyvsp[0].opval; }
-  break;
-! #line 2275 "perly.c"
-      }
-      yyssp -= yym;
-***************
-*** 2282,2287 ****
-  #if YYDEBUG
-          if (yydebug)
-!             printf("yydebug: after reduction, shifting from state 0 to\
-!  state %d\n", YYFINAL);
-  #endif
-          yystate = YYFINAL;
---- 2303,2309 ----
-  #if YYDEBUG
-          if (yydebug)
-!             PerlIO_printf(Perl_debug_log,
-!              "yydebug: after reduction, shifting from state 0 to state %d\n",
-!              YYFINAL);
-  #endif
-          yystate = YYFINAL;
-***************
-*** 2297,2301 ****
-                  if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
-                  if (!yys) yys = "illegal-symbol";
-!                 printf("yydebug: state %d, reading %d (%s)\n",
-                          YYFINAL, yychar, yys);
-              }
---- 2319,2323 ----
-                  if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
-                  if (!yys) yys = "illegal-symbol";
-!                 PerlIO_printf(Perl_debug_log, "yydebug: state %d, reading %d (%s)\n",
-                          YYFINAL, yychar, yys);
-              }
-***************
-*** 2312,2321 ****
-  #if YYDEBUG
-      if (yydebug)
-!         printf("yydebug: after reduction, shifting from state %d \
-! to state %d\n", *yyssp, yystate);
-  #endif
-      if (yyssp >= yyss + yystacksize - 1)
-      {
-!         goto yyoverflow;
-      }
-      *++yyssp = yystate;
---- 2334,2358 ----
-  #if YYDEBUG
-      if (yydebug)
-!         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 = yyvs =
-!          (YYSTYPE*)PerlMem_realloc((char*)yyvs,yystacksize * sizeof(YYSTYPE));
-!      ysave->yyss = yyss =
-!          (short*)PerlMem_realloc((char*)yyss,yystacksize * sizeof(short));
-!      if (!yyvs || !yyss)
-!          goto yyoverflow;
-!      yyssp = yyss + yyps_index;
-!      yyvsp = yyvs + yypv_index;
-      }
-      *++yyssp = yystate;
-***************
-*** 2323,2330 ****
-      goto yyloop;
-  yyoverflow:
-!     yyerror("yacc stack overflow");
-  yyabort:
-!     return (1);
-  yyaccept:
-!     return (0);
-  }
---- 2360,2367 ----
-      goto yyloop;
-  yyoverflow:
-!     yyerror("Out of memory for yacc stack");
-  yyabort:
-!     retval = 1;
-  yyaccept:
-!     return retval;
-  }
+--- perly.c.orig       Tue Jun 19 08:39:52 2001
++++ perly.c    Tue Jun 19 08:39:24 2001
+@@ -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"
+@@ -50,70 +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 ANDOP 301
+-#define NOTOP 302
+-#define ASSIGNOP 303
+-#define OROR 304
+-#define ANDAND 305
+-#define BITOROP 306
+-#define BITANDOP 307
+-#define SHIFTOP 308
+-#define MATCHOP 309
+-#define UMINUS 310
+-#define REFGEN 311
+-#define POWOP 312
+-#define PREINC 313
+-#define PREDEC 314
+-#define POSTINC 315
+-#define POSTDEC 316
+-#define ARROW 317
++#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,
+@@ -135,7 +74,7 @@
+    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,
+@@ -157,7 +96,7 @@
+     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,  173,    0,    0,  154,
+@@ -199,7 +138,7 @@
+     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,  370,   98,  359,
+     3,   12,   13,   70,  375,  285,   72,   73,   74,   75,
+    76,   77,   78,   79,  291,   81,  292,  281,  283,  286,
+@@ -207,7 +146,7 @@
+   194,  327,  156,  289,  271,  225,   14,   83,  137,   84,
+    85,   86,   87,   15,   16,   17,   18,   93,  278,
+ };
+-short yysindex[] = {                                      0,
++static short yysindex[] = {                                      0,
+     0,    0, -132,    0,    0,    0,  -51,    0,    0,    0,
+     0,    0,    0,    0,  650,    0,    0,    0, -239, -215,
+     5,    0,    0, -215,    0,    0,    0,  -31,  -31,    0,
+@@ -249,7 +188,7 @@
+   449,    0, 2181, -150,  340,    0,    0,  355,    0,  216,
+   216,    0, -123,    0,
+ };
+-short yyrindex[] = {                                      0,
++static short yyrindex[] = {                                      0,
+     0,    0,  247,    0,    0,    0,    0,    0,    0,    0,
+     0,    0,    0,    0,    0,    0,    0,    0,  274,    0,
+     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+@@ -291,7 +230,7 @@
+   917,    0,    0,  119,    0,    0,    0,    0,    0,    0,
+     0,    0,  179,    0,
+ };
+-short yygindex[] = {                                      0,
++static short yygindex[] = {                                      0,
+     0,    0,  196,  425,    0,    0,   -2,    0,   37,  634,
+   -94,    0,    0,    0, -323,  -15, 2445,    0,  999,  414,
+   417,    0,    0,    0,  463,  -43,    0,    0,  321, -198,
+@@ -300,7 +239,7 @@
+     0,    0,    0,    0,    0,    0,    0,    0,    0,
+ };
+ #define YYTABLESIZE 4568
+-short yytable[] = {                                      71,
++static short yytable[] = {                                      71,
+   197,   65,  121,  227,   65,  111,  220,   22,  198,  293,
+   139,  296,  315,  275,  305,  102,  273,   88,  113,  228,
+    60,  113,  279,   65,  317,   60,  182,  254,  325,  101,
+@@ -759,7 +698,7 @@
+     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+     0,    0,    0,    0,    0,    0,   77,   77,
+ };
+-short yycheck[] = {                                      15,
++static short yycheck[] = {                                      15,
+    95,   36,   46,   41,   36,   40,   59,   59,  100,  208,
+    54,   41,   59,  199,   41,   40,  196,  257,   41,   93,
+   123,   44,  202,   36,   93,   59,   40,   40,   59,   29,
+@@ -1224,7 +1163,7 @@
+ #endif
+ #define YYMAXTOKEN 317
+ #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,
+@@ -1241,7 +1180,7 @@
+ "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 '}'",
+@@ -1456,17 +1395,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 793 "perly.y"
+  /* PROGRAM */
+@@ -1477,7 +1405,7 @@
+ #endif
+ #define yyparse() Perl_yyparse(pTHX)
+-#line 1481 "y.tab.c"
++#line 1409 "perly.c"
+ #define YYABORT goto yyabort
+ #define YYACCEPT goto yyaccept
+ #define YYERROR goto yyerrlab
+@@ -1485,11 +1413,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')
+@@ -1501,12 +1449,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;
+@@ -1516,7 +1474,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
+@@ -1526,12 +1484,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;
+@@ -1547,14 +1517,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)
+@@ -1567,12 +1537,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;
+@@ -1582,7 +1564,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;
+@@ -1600,7 +1582,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
+@@ -1610,7 +1592,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];
+@@ -2473,7 +2455,7 @@
+ #line 790 "perly.y"
+ { yyval.opval = yyvsp[0].opval; }
+ break;
+-#line 2477 "y.tab.c"
++#line 2459 "perly.c"
+     }
+     yyssp -= yym;
+     yystate = *yyssp;
+@@ -2483,7 +2465,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;
+@@ -2498,7 +2480,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
+@@ -2513,20 +2495,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);
+ }