/* process unification constraints */ protected void process(UnifyConstraint c) { Node n1 = c.node1.getRep(); Node n2 = c.node2.getRep(); assert (n1.graph == this); assert (n2.graph == this); if (n1 == n2) return; if (heapfix && n2.isheap && !n1.isheap) { Node sw = n1; n1 = n2; n2 = sw; } n1.mergeTags(n2); n1.mergeFlags(n2); n2.parent = n1; n2.tag = null; n2.region = null; if (secondary_index[0]) { for (FieldEdge e : n2.outfields.values()) { assert (e.src == n2); if (e.dst == n2) w.addLast(new FieldConstraint(n1, n1, e.field)); else { w.addLast(new FieldConstraint(n1, e.dst, e.field)); e.dst.infields.get(e.field).remove(e); } fedges.get(e.field).remove(e); } for (Field f : n2.infields.keySet()) for (FieldEdge e : n2.infields.get(f)) { assert (e.dst == n2); e.dst = n1; addInField(n1, f, e); } n2.outfields = null; n2.infields = null; } else { HashSet<FieldEdge> fremove = new HashSet<FieldEdge>(); for (Field f : fedges.keySet()) { Collection<FieldEdge> fed = fedges.get(f); int size = fed.size(); fremove.clear(); for (FieldEdge e : fed) { if (e.src == n2) { if (e.dst == n2) w.addLast(new FieldConstraint(n1, n1, e.field)); else w.addLast(new FieldConstraint(n1, e.dst, e.field)); } else { if (e.dst == n2) e.dst = n1; continue; } if (!fremove.contains(e)) { fremove.add(e); size--; } } fed.removeAll(fremove); assert (fed.size() == size); } } HashSet<CallEdge> cremove = new HashSet<CallEdge>(); for (Call ce : cedges.keySet()) { Collection<CallEdge> ced = cedges.get(ce); cremove.clear(); int size = ced.size(); for (CallEdge e : ced) { if (e.dst == n2) { if (e.src == n2) w.addLast(new CallConstraint(n1, n1, e.call)); else w.addLast(new CallConstraint(e.src, n1, e.call)); } else { if (e.src == n2) e.src = n1; continue; } if (!cremove.contains(e)) { cremove.add(e); size--; } } ced.removeAll(cremove); assert (ced.size() == size); } }