X-Git-Url: http://git.megacz.com/?p=sbp.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2FGSS.java;h=0718a109ab5406646aceef72a5be0f974b9d378a;hp=bde44df40c8af28d1dd3d1d9f45e2fe31adc800f;hb=60a01254256be2e3b4be2edb66bd84e72de5f1c9;hpb=ef61db31ac4d0674b5206803ea04013d6292cf3d diff --git a/src/edu/berkeley/sbp/GSS.java b/src/edu/berkeley/sbp/GSS.java index bde44df..0718a10 100644 --- a/src/edu/berkeley/sbp/GSS.java +++ b/src/edu/berkeley/sbp/GSS.java @@ -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)result).parents) { - if (only!=null && child!=only) continue; - holder[pos] = result; + } else { child.reduce(r, pos-1, target, holder, null, null); } - } + } + holder[pos] = old; }