Change 29570 by [EMAIL PROTECTED] on 2006/12/18 00:24:01

        move parser state into new parser object, PL_parser

Affected files ...

... //depot/perl/MANIFEST#1496 edit
... //depot/perl/embedvar.h#231 edit
... //depot/perl/intrpvar.h#187 edit
... //depot/perl/parser.h#1 add
... //depot/perl/perl.h#746 edit
... //depot/perl/perlapi.h#153 edit
... //depot/perl/perly.c#98 edit
... //depot/perl/pod/perlapi.pod#274 edit
... //depot/perl/pod/perlintern.pod#59 edit
... //depot/perl/toke.c#718 edit

Differences ...

==== //depot/perl/MANIFEST#1496 (text) ====
Index: perl/MANIFEST
--- perl/MANIFEST#1495~29566~   2006-12-16 15:03:42.000000000 -0800
+++ perl/MANIFEST       2006-12-17 16:24:01.000000000 -0800
@@ -2915,6 +2915,7 @@
 overload.pl                    generate overload.h
 pad.c                          Scratchpad functions
 pad.h                          Scratchpad headers
+parser.h                       parser object header
 patchlevel.h                   The current patch level of perl
 perlapi.c                      Perl API functions
 perlapi.h                      Perl API function declarations

==== //depot/perl/embedvar.h#231 (text+w) ====
Index: perl/embedvar.h
--- perl/embedvar.h#230~29064~  2006-10-20 06:01:14.000000000 -0700
+++ perl/embedvar.h     2006-12-17 16:24:01.000000000 -0800
@@ -312,6 +312,7 @@
 #define PL_pad_reset_pending   (vTHX->Ipad_reset_pending)
 #define PL_padix               (vTHX->Ipadix)
 #define PL_padix_floor         (vTHX->Ipadix_floor)
+#define PL_parser              (vTHX->Iparser)
 #define PL_patchlevel          (vTHX->Ipatchlevel)
 #define PL_pending_ident       (vTHX->Ipending_ident)
 #define PL_perl_destruct_level (vTHX->Iperl_destruct_level)
@@ -411,8 +412,6 @@
 #define PL_warnhook            (vTHX->Iwarnhook)
 #define PL_widesyscalls                (vTHX->Iwidesyscalls)
 #define PL_xmlfp               (vTHX->Ixmlfp)
-#define PL_yycharp             (vTHX->Iyycharp)
-#define PL_yylvalp             (vTHX->Iyylvalp)
 
 #else  /* !MULTIPLICITY */
 
@@ -610,6 +609,7 @@
 #define PL_Ipad_reset_pending  PL_pad_reset_pending
 #define PL_Ipadix              PL_padix
 #define PL_Ipadix_floor                PL_padix_floor
+#define PL_Iparser             PL_parser
 #define PL_Ipatchlevel         PL_patchlevel
 #define PL_Ipending_ident      PL_pending_ident
 #define PL_Iperl_destruct_level        PL_perl_destruct_level
@@ -709,8 +709,6 @@
 #define PL_Iwarnhook           PL_warnhook
 #define PL_Iwidesyscalls       PL_widesyscalls
 #define PL_Ixmlfp              PL_xmlfp
-#define PL_Iyycharp            PL_yycharp
-#define PL_Iyylvalp            PL_yylvalp
 
 #define PL_TSv                 PL_Sv
 #define PL_TXpv                        PL_Xpv

==== //depot/perl/intrpvar.h#187 (text) ====
Index: perl/intrpvar.h
--- perl/intrpvar.h#186~29053~  2006-10-19 08:54:15.000000000 -0700
+++ perl/intrpvar.h     2006-12-17 16:24:01.000000000 -0800
@@ -402,9 +402,7 @@
 PERLVAR(Ilast_swash_tmps,      U8 *)
 PERLVAR(Ilast_swash_slen,      STRLEN)
 
-/* perly.c globals */
-PERLVAR(Iyycharp,      int *)
-PERLVAR(Iyylvalp,      YYSTYPE *)
+PERLVAR(Iparser,       yy_parser *)    /* current parser state */
 
 PERLVARI(Iglob_index,  int,    0)
 PERLVAR(Isrand_called, bool)

==== //depot/perl/parser.h#1 (text) ====
Index: perl/parser.h
--- /dev/null   2006-11-16 10:04:37.532058837 -0800
+++ perl/parser.h       2006-12-17 16:24:01.000000000 -0800
@@ -0,0 +1,34 @@
+/*    parser.h
+ *
+ *    Copyright (c) 2006 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.
+ * 
+ * This file defines the layout of the parser object used by the parser
+ * and lexer (perly.c, toke,c).
+ */
+
+typedef struct {
+    YYSTYPE val;    /* semantic value */
+    short   state;
+    AV     *comppad; /* value of PL_comppad when this value was created */
+#ifdef DEBUGGING
+    const char  *name; /* token/rule name for -Dpv */
+#endif
+} yy_stack_frame;
+
+typedef struct {
+    int                    yychar;     /* The lookahead symbol.  */
+    YYSTYPE        yylval;     /* value of lookahead symbol, set by yylex() */
+
+    /* Number of tokens to shift before error messages enabled.  */
+    int                    yyerrstatus;
+
+    int                    stack_size;
+    int                    yylen;      /* length of active reduction */
+    yy_stack_frame  *ps;       /* current stack frame */
+    yy_stack_frame  stack[1];  /* will actually be as many as needed */
+} yy_parser;
+    
+

==== //depot/perl/perl.h#746 (text) ====
Index: perl/perl.h
--- perl/perl.h#745~29430~      2006-12-01 05:59:27.000000000 -0800
+++ perl/perl.h 2006-12-17 16:24:01.000000000 -0800
@@ -3236,6 +3236,7 @@
 #  define YYTOKENTYPE
 #endif
 #include "perly.h"
+#include "parser.h"
 
 #ifdef PERL_MAD
 struct nexttoken {

==== //depot/perl/perlapi.h#153 (text+w) ====
Index: perl/perlapi.h
--- perl/perlapi.h#152~29064~   2006-10-20 06:01:14.000000000 -0700
+++ perl/perlapi.h      2006-12-17 16:24:01.000000000 -0800
@@ -502,6 +502,8 @@
 #define PL_padix               (*Perl_Ipadix_ptr(aTHX))
 #undef  PL_padix_floor
 #define PL_padix_floor         (*Perl_Ipadix_floor_ptr(aTHX))
+#undef  PL_parser
+#define PL_parser              (*Perl_Iparser_ptr(aTHX))
 #undef  PL_patchlevel
 #define PL_patchlevel          (*Perl_Ipatchlevel_ptr(aTHX))
 #undef  PL_pending_ident
@@ -700,10 +702,6 @@
 #define PL_widesyscalls                (*Perl_Iwidesyscalls_ptr(aTHX))
 #undef  PL_xmlfp
 #define PL_xmlfp               (*Perl_Ixmlfp_ptr(aTHX))
-#undef  PL_yycharp
-#define PL_yycharp             (*Perl_Iyycharp_ptr(aTHX))
-#undef  PL_yylvalp
-#define PL_yylvalp             (*Perl_Iyylvalp_ptr(aTHX))
 #undef  PL_Sv
 #define PL_Sv                  (*Perl_TSv_ptr(aTHX))
 #undef  PL_Xpv

==== //depot/perl/perly.c#98 (text) ====
Index: perl/perly.c
--- perl/perly.c#97~29569~      2006-12-17 14:21:40.000000000 -0800
+++ perl/perly.c        2006-12-17 16:24:01.000000000 -0800
@@ -34,24 +34,6 @@
 typedef short int yytype_int16;
 typedef signed char yysigned_char;
 
-typedef struct {
-    YYSTYPE val;    /* semantic value */
-    short   state;
-    AV     *comppad; /* value of PL_comppad when this value was created */
-#ifdef DEBUGGING
-    const char  *name; /* token/rule name for -Dpv */
-#endif
-} yy_stack_frame;
-
-typedef struct {
-    int                    stack_size;
-    int                    reduce_len; /* XXX integrate with yylen ? */
-    yy_stack_frame  *ps;     /* current stack frame */
-    yy_stack_frame  stack[1]; /* will actually be as many as needed */
-} yy_parser;
-    
-
-
 #ifdef DEBUGGING
 #  define YYDEBUG 1
 #else
@@ -268,7 +250,7 @@
 
     /* free any reducing ops (1st pass) */
 
-    for (i=0; i< parser->reduce_len; i++) {
+    for (i=0; i< parser->yylen; i++) {
        if (yy_type_tab[yystos[ps[-i].state]] == toketype_opval
            && ps[-i].val.opval) {
            if (ps[-i].comppad != PL_comppad) {
@@ -309,33 +291,24 @@
 #endif
 {
     dVAR;
-    int yychar; /* The lookahead symbol.  */
-    YYSTYPE yylval; /* The semantic value of the lookahead symbol.  */
-    int yynerrs; /* Number of syntax errors so far.  */
     register int yystate;
     register int yyn;
     int yyresult;
 
-    /* Number of tokens to shift before error messages enabled.  */
-    int yyerrstatus;
     /* Lookahead token as an internal (translated) token number.  */
-    int yytoken = 0;
+    int yytoken;
 
     SV *parser_sv;                 /* SV whose PVX holds the parser object */
-    yy_parser *parser;             /* the parser object */
+    register yy_parser *parser;            /* the parser object */
     register yy_stack_frame  *ps;   /* current parser stack frame */
 
 #define YYPOPSTACK   parser->ps = --ps
 #define YYPUSHSTACK  parser->ps = ++ps
 
     /* The variables used to return semantic value and location from the
-         action routines.  */
+         action routines: ie $$.  */
     YYSTYPE yyval;
 
-    /* When reducing, the number of symbols on the RHS of the reduced
-         rule.  */
-    int yylen;
-
 #ifndef PERL_IN_MADLY_C
 #  ifdef PERL_MAD
     if (PL_madskills)
@@ -346,15 +319,12 @@
     YYDPRINTF ((Perl_debug_log, "Starting parse\n"));
 
     ENTER;                     /* force stack free before we return */
-    SAVEVPTR(PL_yycharp);
-    SAVEVPTR(PL_yylvalp);
-    PL_yycharp = &yychar; /* so PL_yyerror() can access it */
-    PL_yylvalp = &yylval; /* so various functions in toke.c can access it */
+    SAVEVPTR(PL_parser);
 
     parser_sv = newSV(sizeof(yy_parser)
                        + (YYINITDEPTH-1) * sizeof(yy_stack_frame));
     SAVEFREESV(parser_sv);
-    parser = (yy_parser*)  SvPVX(parser_sv);
+    PL_parser = parser = (yy_parser*)  SvPVX(parser_sv);
     ps = (yy_stack_frame*) &parser->stack[0];
     parser->ps = ps;
 
@@ -365,9 +335,8 @@
 
 
     ps->state = 0;
-    yyerrstatus = 0;
-    yynerrs = 0;
-    yychar = YYEMPTY;          /* Cause a token to be read.  */
+    parser->yyerrstatus = 0;
+    parser->yychar = YYEMPTY;          /* Cause a token to be read.  */
 
 /*------------------------------------------------------------.
 | yynewstate -- Push a new state, which is found in yystate.  |
@@ -383,7 +352,7 @@
        ps->val.opval->op_latefreed = 0;
     }
 
-    parser->reduce_len = 0;
+    parser->yylen = 0;
 
     {
        size_t size = ps - &parser->stack[0] + 1;
@@ -394,7 +363,8 @@
        if (size >= parser->stack_size - 1) {
            /* this will croak on insufficient memory */
            parser->stack_size *= 2;
-           parser = (yy_parser*) SvGROW(parser_sv, sizeof(yy_parser)
+           PL_parser = parser =
+                       (yy_parser*) SvGROW(parser_sv, sizeof(yy_parser)
                            + (parser->stack_size-1) * sizeof(yy_stack_frame));
 
            /* readdress any pointers into realloced parser object */
@@ -418,28 +388,28 @@
     /* Not known => get a lookahead token if don't already have one.  */
 
     /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol.  */
-    if (yychar == YYEMPTY) {
+    if (parser->yychar == YYEMPTY) {
        YYDPRINTF ((Perl_debug_log, "Reading a token: "));
 #ifdef PERL_IN_MADLY_C
-       yychar = PL_madskills ? madlex() : yylex();
+       parser->yychar = PL_madskills ? madlex() : yylex();
 #else
-       yychar = yylex();
+       parser->yychar = yylex();
 #endif
 
 #  ifdef EBCDIC
-       if (yychar >= 0 && yychar < 255) {
-           yychar = NATIVE_TO_ASCII(yychar);
+       if (parser->yychar >= 0 && parser->yychar < 255) {
+           parser->yychar = NATIVE_TO_ASCII(parser->yychar);
        }
 #  endif
     }
 
-    if (yychar <= YYEOF) {
-       yychar = yytoken = YYEOF;
+    if (parser->yychar <= YYEOF) {
+       parser->yychar = yytoken = YYEOF;
        YYDPRINTF ((Perl_debug_log, "Now at end of input.\n"));
     }
     else {
-       yytoken = YYTRANSLATE (yychar);
-       YYDSYMPRINTF ("Next token is", yytoken, &yylval);
+       yytoken = YYTRANSLATE (parser->yychar);
+       YYDSYMPRINTF ("Next token is", yytoken, &parser->yylval);
     }
 
     /* If the proper action on seeing token YYTOKEN is to reduce or to
@@ -462,12 +432,12 @@
     YYDPRINTF ((Perl_debug_log, "Shifting token %s, ", yytname[yytoken]));
 
     /* Discard the token being shifted unless it is eof.  */
-    if (yychar != YYEOF)
-       yychar = YYEMPTY;
+    if (parser->yychar != YYEOF)
+       parser->yychar = YYEMPTY;
 
     YYPUSHSTACK;
     ps->state   = yyn;
-    ps->val     = yylval;
+    ps->val     = parser->yylval;
     ps->comppad = PL_comppad;
 #ifdef DEBUGGING
     ps->name    = (const char *)(yytname[yytoken]);
@@ -475,8 +445,8 @@
 
     /* Count tokens shifted since error; after three, turn off error
          status.  */
-    if (yyerrstatus)
-       yyerrstatus--;
+    if (parser->yyerrstatus)
+       parser->yyerrstatus--;
 
     goto yynewstate;
 
@@ -496,7 +466,7 @@
   `-----------------------------*/
   yyreduce:
     /* yyn is the number of a rule to reduce with.  */
-    yylen = yyr2[yyn];
+    parser->yylen = yyr2[yyn];
 
     /* If YYLEN is nonzero, implement the default value of the action:
       "$$ = $1".
@@ -506,14 +476,11 @@
       users should not rely upon it.  Assigning to YYVAL
       unconditionally makes the parser a bit smaller, and it avoids a
       GCC warning that YYVAL may be used uninitialized.  */
-    yyval = ps[1-yylen].val;
+    yyval = ps[1-parser->yylen].val;
 
     YY_STACK_PRINT(parser);
     YY_REDUCE_PRINT (yyn);
 
-    /* if we croak during a reduce, this many tokens need special clean up */
-    parser->reduce_len = yylen;
-
     switch (yyn) {
 
 
@@ -548,7 +515,7 @@
      * freed; the rest need the flag resetting */
     {
        int i;
-       for (i=0; i< yylen; i++) {
+       for (i=0; i< parser->yylen; i++) {
            if (yy_type_tab[yystos[ps[-i].state]] == toketype_opval
                && ps[-i].val.opval)
            {
@@ -559,7 +526,7 @@
        }
     }
 
-    parser->ps = ps -= (yylen-1);
+    parser->ps = ps -= (parser->yylen-1);
 
     /* Now shift the result of the reduction.  Determine what state
          that goes to, based on the state we popped back to and the rule
@@ -588,18 +555,17 @@
   `------------------------------------*/
   yyerrlab:
     /* If not already recovering from an error, report this error.  */
-    if (!yyerrstatus) {
-       ++yynerrs;
+    if (!parser->yyerrstatus) {
        yyerror ("syntax error");
     }
 
 
-    if (yyerrstatus == 3) {
+    if (parser->yyerrstatus == 3) {
        /* If just tried and failed to reuse lookahead token after an
              error, discard it.  */
 
        /* Return failure if at end of input.  */
-       if (yychar == YYEOF) {
+       if (parser->yychar == YYEOF) {
            /* Pop the error token.  */
            YYPOPSTACK;
            /* Pop the rest of the stack.  */
@@ -620,8 +586,8 @@
            YYABORT;
        }
 
-       YYDSYMPRINTF ("Error: discarding", yytoken, &yylval);
-       yychar = YYEMPTY;
+       YYDSYMPRINTF ("Error: discarding", yytoken, &parser->yylval);
+       parser->yychar = YYEMPTY;
 
     }
 
@@ -634,7 +600,7 @@
   | yyerrlab1 -- error raised explicitly by an action.  |
   `----------------------------------------------------*/
   yyerrlab1:
-    yyerrstatus = 3;   /* Each real token shifted decrements this.  */
+    parser->yyerrstatus = 3;   /* Each real token shifted decrements this.  */
 
     for (;;) {
        yyn = yypact[yystate];
@@ -673,7 +639,7 @@
 
     YYPUSHSTACK;
     ps->state   = yyn;
-    ps->val     = yylval;
+    ps->val     = parser->yylval;
     ps->comppad = PL_comppad;
 #ifdef DEBUGGING
     ps->name    ="<err>";

==== //depot/perl/pod/perlapi.pod#274 (text+w) ====
Index: perl/pod/perlapi.pod
--- perl/pod/perlapi.pod#273~29480~     2006-12-06 09:28:03.000000000 -0800
+++ perl/pod/perlapi.pod        2006-12-17 16:24:01.000000000 -0800
@@ -4631,6 +4631,8 @@
 X<SvUTF8>
 
 Returns a boolean indicating whether the SV contains UTF-8 encoded data.
+Call this after SvPV() in case any call to string overloading updates the
+internal flag.
 
        bool    SvUTF8(SV* sv)
 

==== //depot/perl/pod/perlintern.pod#59 (text+w) ====
Index: perl/pod/perlintern.pod
--- perl/pod/perlintern.pod#58~29480~   2006-12-06 09:28:03.000000000 -0800
+++ perl/pod/perlintern.pod     2006-12-17 16:24:01.000000000 -0800
@@ -621,7 +621,7 @@
 The SVs in the names AV have their PV being the name of the variable.
 NV+1..IV inclusive is a range of cop_seq numbers for which the name is
 valid.  For typed lexicals name SV is SVt_PVMG and SvSTASH points at the
-type.  For C<our> lexicals, the type is also SVt_PVGV, with the MAGIC slot
+type.  For C<our> lexicals, the type is also SVt_PVMG, with the OURSTASH slot
 pointing at the stash of the associated global (so that duplicate C<our>
 declarations in the same package can be detected).  SvCUR is sometimes
 hijacked to store the generation number during compilation.

==== //depot/perl/toke.c#718 (text) ====
Index: perl/toke.c
--- perl/toke.c#717~29548~      2006-12-13 09:16:22.000000000 -0800
+++ perl/toke.c 2006-12-17 16:24:01.000000000 -0800
@@ -23,8 +23,7 @@
 #define PERL_IN_TOKE_C
 #include "perl.h"
 
-#define yychar (*PL_yycharp)
-#define yylval (*PL_yylvalp)
+#define yylval (PL_parser->yylval)
 
 static const char ident_too_long[] = "Identifier too long";
 static const char commaless_variable_list[] = "comma-less variable list";
@@ -12381,6 +12380,7 @@
     const char *context = NULL;
     int contlen = -1;
     SV *msg;
+    int yychar  = PL_parser->yychar;
 
     if (!yychar || (yychar == ';' && !PL_rsfp))
        where = "at EOF";
End of Patch.

Reply via email to