tentative checkpoint
[sbp.git] / src / edu / berkeley / sbp / GSS.java
index bde44df..0718a10 100644 (file)
@@ -376,18 +376,17 @@ class GSS {
             */
             public void reduce(Position r, int pos, Phase target, Forest[] holder, Node only, Forest pending) {
                 Forest old = holder[pos];
-                holder[pos] = pending;
-                if (pos==0) {
-
-                    // FIXME: I'm unsure about this -- basically we want to deal with the case where
-                    //        there are two nodes, each of whose Ref points to the same Forest instance.
-                    //        Some node in the next phase has both of these as parents.  This might happen
-                    //        since the same reduction can appear in more than one state.
-
-                    for(Forest result : results())
-                        for(Node child : ((Forest.Ref<?>)result).parents) {
-                            if (only != null && child!=only) continue;
-                            pending = holder[pos] = result;
+
+                // FIXME: I'm unsure about this -- basically we want to deal with the case where
+                //        there are two nodes, each of whose Ref points to the same Forest instance.
+                //        Some node in the next phase has both of these as parents.  This might happen
+                //        since the same reduction can appear in more than one state.
+                
+                for(Forest result : results())
+                    for(Node child : ((Forest.Ref<?>)result).parents) {
+                        if (only != null && child!=only) continue;
+                        pending = holder[pos] = result;
+                        if (pos==0) {
                             System.arraycopy(holder, 0, r.holder, 0, holder.length);
                             for(int i=0; i<r.pos; i++) if (r.holder[i]==null) throw new Error("realbad");
                             Forest rex = null;
@@ -397,15 +396,11 @@ class GSS {
                                 if (r.pos==1) singularReductions.put(pending, r, rex);
                             }
                             child.finish(r, rex, target, holder);
-                        }
-                } else {
-                    for(Forest result : results())
-                        for(Node child : ((Forest.Ref<?>)result).parents) {
-                            if (only!=null && child!=only) continue;
-                            holder[pos] = result;
+                        } else {
                             child.reduce(r, pos-1, target, holder, null, null);
                         }
-                }
+                    }
+
                 holder[pos] = old;
             }