bugfix in Sequence.java regarding epsilonForm()
[sbp.git] / src / edu / berkeley / sbp / Sequence.java
index f63c30a..430f298 100644 (file)
@@ -137,11 +137,16 @@ public abstract class Sequence implements Iterable<Element>, SequenceOrElement {
     static abstract class Pos implements IntegerMappable, Comparable<Pos>, Serializable {
 
         public int ord = -1;
+        private transient Sequence owner;
+
         public int ord()     { return ord; }
 
         final Forest[] holder;
 
-        Pos(int len) { this.holder = new Forest[len]; }
+        Pos(int len, Sequence owner) {
+            this.owner = owner;
+            this.holder = new Forest[len];
+        }
 
         public abstract int   provides();
         public abstract int[] needs();
@@ -154,7 +159,9 @@ public abstract class Sequence implements Iterable<Element>, SequenceOrElement {
         public abstract Pos prev();
         public abstract Pos next();
 
-        abstract Sequence owner();
+        /** the element which produces the sequence to which this Position belongs */
+        public Sequence owner() { return owner; }
+
         abstract Element  element();
 
         public abstract int numPops();
@@ -180,7 +187,6 @@ public abstract class Sequence implements Iterable<Element>, SequenceOrElement {
                 final     int      pos;
         private final     Position next;
         private final     Position prev;
-        private transient Sequence owner;
 
         public int     provides() { return owner().sernum; }
         public int[]   needs() { return owner().needs_int(); }
@@ -188,8 +194,7 @@ public abstract class Sequence implements Iterable<Element>, SequenceOrElement {
         public boolean owner_needed_or_hated() { return owner().needed_or_hated; }
         
         private Position(Sequence owner, int pos, Position prev) {
-            super(owner.elements.length);
-            this.owner    = owner;
+            super(owner.elements.length,owner);
             this.pos      = pos;
             this.next     = pos==owner.elements.length ? null : new Position(owner, pos+1, this);
             this.prev     = prev;
@@ -205,9 +210,6 @@ public abstract class Sequence implements Iterable<Element>, SequenceOrElement {
         /** the element immediately after this Position, or null if this is the last Position */
         public Element  element() { return pos>=owner().elements.length ? null : owner().elements[pos]; }
 
-        /** the element which produces the sequence to which this Position belongs */
-        public Sequence owner() { return owner; }
-
         /** the next Position (the Position after <tt>this.element()</tt>) */
         public Position next() { return next; }
 
@@ -219,7 +221,7 @@ public abstract class Sequence implements Iterable<Element>, SequenceOrElement {
         // Position /////////////////////////////////////////////////////////////////////////////////
 
         public final <T> Forest<T> rewrite(Input.Region loc) {
-            if (isFirst()) owner().epsilonForm(loc);
+            if (isFirst()) return owner().epsilonForm(loc);
             for(int i=0; i<pos; i++) if (holder[i]==null) throw new Error("realbad " + i);
             for(int i=pos; i<owner().elements.length; i++) {
                 if (holder[i]==null) holder[i] = ((Union)owner().elements[i]).epsilonForm(loc);