You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by lu...@apache.org on 2012/09/28 16:56:45 UTC

svn commit: r1391491 - /commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/algorithmic/forward/analysis/TrackingValue.java

Author: luc
Date: Fri Sep 28 14:56:45 2012
New Revision: 1391491

URL: http://svn.apache.org/viewvc?rev=1391491&view=rev
Log:
Fixed merging.

Modified:
    commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/algorithmic/forward/analysis/TrackingValue.java

Modified: commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/algorithmic/forward/analysis/TrackingValue.java
URL: http://svn.apache.org/viewvc/commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/algorithmic/forward/analysis/TrackingValue.java?rev=1391491&r1=1391490&r2=1391491&view=diff
==============================================================================
--- commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/algorithmic/forward/analysis/TrackingValue.java (original)
+++ commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/algorithmic/forward/analysis/TrackingValue.java Fri Sep 28 14:56:45 2012
@@ -40,7 +40,7 @@ public class TrackingValue implements Va
     /** Instructions that produce this value. */
     private Set<AbstractInsnNode> producers;
 
-    /** Values that are merged with this value. */
+    /** Values that are merged with this value (including the instance itself). */
     private Set<TrackingValue> merged;
 
     /** Build a new value without any link to instructions.
@@ -51,6 +51,7 @@ public class TrackingValue implements Va
         consumers  = new HashSet<AbstractInsnNode>();
         producers  = new HashSet<AbstractInsnNode>();
         merged     = new HashSet<TrackingValue>();
+        merged.add(this);
     }
 
     /** Get the wrapped {@link BasicValue}.
@@ -103,20 +104,22 @@ public class TrackingValue implements Va
     public static void merge(final TrackingValue value1,
                              final TrackingValue value2) {
 
+        if (value1.merged.contains(value2)) {
+            // the values have already been merged
+            return;
+        }
+
         // merge the sets
         value1.consumers.addAll(value2.consumers);
         value1.producers.addAll(value2.producers);
         value1.merged.addAll(value2.merged);
 
         // share the merged sets
-        for (TrackingValue value : value2.merged) {
+        for (final TrackingValue value : value2.merged) {
             value.consumers = value1.consumers;
             value.producers = value1.producers;
             value.merged    = value1.merged;
         }
-        value2.consumers = value1.consumers;
-        value2.producers = value1.producers;
-        value2.merged    = value1.merged;
 
     }