2009-11-27 Marek Safar <marek.safar@gmail.com>
authorMarek Safar <marek.safar@gmail.com>
Fri, 27 Nov 2009 11:54:42 +0000 (11:54 -0000)
committerMarek Safar <marek.safar@gmail.com>
Fri, 27 Nov 2009 11:54:42 +0000 (11:54 -0000)
* skeleton.cs: Add global state stacks.

svn path=/trunk/mcs/; revision=147028

mcs/jay/ChangeLog
mcs/jay/skeleton.cs

index 1e49ad3b614bd3f18e77e7eeda5b9f3abff41cca..2d96cc9d174a357e466f5bfdd575f1c8713be5a6 100644 (file)
@@ -1,3 +1,7 @@
+2009-11-27  Marek Safar  <marek.safar@gmail.com>
+
+       * skeleton.cs: Add global state stacks.
+
 2008-10-17  Jonathan Pryor  <jpryor@novell.com>
 
        * Makefile: Add doc-update target support.
index ebed7b7c15cd26bea65eae4e018b1186d5de21b1..1d5bd013600f9c5ec7b9c8ff184195835e037510 100644 (file)
@@ -123,6 +123,10 @@ t    this.debug = (yydebug.yyDebug)yyd;
 .    return first;
 .  }
 .
+.      static int[] global_yyStates;
+.      static object[] global_yyVals;
+.      protected bool use_global_stacks;
+.
 .  /** the generated parser.
 .      Maintains a state and a value stack, currently with fixed maximum size.
 .      @param yyLex scanner.
@@ -131,24 +135,31 @@ t    this.debug = (yydebug.yyDebug)yyd;
 .    */
 .  internal Object yyparse (yyParser.yyInput yyLex)
 .  {
-.    if (yyMax <= 0) yyMax = 256;                      // initial size
-.    int yyState = 0;                                   // state stack ptr
-.    int [] yyStates = new int[yyMax];                 // state stack 
-.    Object yyVal = null;                               // value stack ptr
-.    Object [] yyVals = new Object[yyMax];             // value stack
+.    if (yyMax <= 0) yyMax = 256;              // initial size
+.    int yyState = 0;                   // state stack ptr
+.    int [] yyStates                 // state stack 
+.    Object yyVal = null;                // value stack ptr
+.    Object [] yyVals;                                 // value stack
 .    int yyToken = -1;                                 // current input
 .    int yyErrorFlag = 0;                              // #tks to shift
+.      if (use_global_stacks && global_yyStates != null) {
+.              yyVals = global_yyVals;
+.              yyStates = global_yyStates;
+.   } else {
+.              yyVals = new object [yyMax];
+.              yyStates = new int [yyMax];
+.              if (use_global_stacks) {
+.                      global_yyVals = yyVals;
+.                      global_yyStates = yyStates;
+.              }
+.      }
 .
  local         ## %{ ... %} after the first %%
 
 .    /*yyLoop:*/ for (int yyTop = 0;; ++ yyTop) {
 .      if (yyTop >= yyStates.Length) {                 // dynamically increase
-.        int[] i = new int[yyStates.Length+yyMax];
-.        yyStates.CopyTo (i, 0);
-.        yyStates = i;
-.        Object[] o = new Object[yyVals.Length+yyMax];
-.        yyVals.CopyTo (o, 0);
-.        yyVals = o;
+.        Array.Resize (ref yyStates, yyStates.Length+yyMax);
+.        Array.Resize (ref yyVals, yyVals.Length+yyMax);
 .      }
 .      yyStates[yyTop] = yyState;
 .      yyVals[yyTop] = yyVal;