tentative checkpoint
[sbp.git] / src / edu / berkeley / sbp / GSS.java
index 11904d8..0718a10 100644 (file)
@@ -376,60 +376,31 @@ 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.
-
-                    if (only != null)  {
-                        for(Forest result : results())
-                            for(Node child : ((Forest.Ref<?>)result).parents) {
-                                if (child!=only) continue;
-                                pending = holder[pos] = result;
-                                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;
-                                if (r.pos==1)  rex = singularReductions.get(pending, r);
-                                if (rex==null) {
-                                    rex = r.rewrite(phase().getLocation());
-                                    if (r.pos==1) singularReductions.put(pending, r, rex);
-                                }
-                                only.finish(r, rex, target, holder);
-                            }
-                    } else {
-                        for(Forest result : results()) {
-                            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;
-                            if (rex==null && r.pos==1)  rex = singularReductions.get(pending, r);
+                            if (r.pos==1)  rex = singularReductions.get(pending, r);
                             if (rex==null) {
                                 rex = r.rewrite(phase().getLocation());
                                 if (r.pos==1) singularReductions.put(pending, r, rex);
                             }
-                            for(Node child : ((Forest.Ref<?>)result).parents)
-                                child.finish(r, rex, target, holder);
+                            child.finish(r, rex, target, holder);
+                        } else {
+                            child.reduce(r, pos-1, target, holder, null, null);
                         }
                     }
-                } else {
-                    if (only != null)  {
-                        for(Forest result : results())
-                            for(Node child : ((Forest.Ref<?>)result).parents) {
-                                if (child!=only) continue;
-                                holder[pos] = result;
-                                only.reduce(r, pos-1, target, holder, null, null);
-                            }
-                    } else {
-                        for(Forest result : results())
-                            for(Node child : ((Forest.Ref<?>)result).parents) {
-                                holder[pos] = result;
-                                child.reduce(r, pos-1, target, holder, null, null);
-                            }
-                    }
-                }
+
                 holder[pos] = old;
             }