X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2FGSS.java;h=0718a109ab5406646aceef72a5be0f974b9d378a;hb=60a01254256be2e3b4be2edb66bd84e72de5f1c9;hp=11904d8b8eae83fde2fa6cd1f01e318508e63b9b;hpb=628b3a8eaafdbe8507e841076051bff42aadf5ee;p=sbp.git diff --git a/src/edu/berkeley/sbp/GSS.java b/src/edu/berkeley/sbp/GSS.java index 11904d8..0718a10 100644 --- a/src/edu/berkeley/sbp/GSS.java +++ b/src/edu/berkeley/sbp/GSS.java @@ -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)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)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; }