Changes: Inference engine works fine with the JavaNator benchmark. Found some problem...
[IRC.git] / Robust / src / Analysis / SSJava / LocationInference.java
index 5502eb8808d6f36baba01c80a23d71373384cd2c..ec8c60492b129128578221f5240e1b60a80e2a93 100644 (file)
@@ -400,7 +400,7 @@ public class LocationInference {
     while (!methodDescList.isEmpty()) {
       MethodDescriptor md = methodDescList.removeLast();
 
-      System.out.println("\n#updateCompositeLocationAssignments=" + md);
+      // System.out.println("\n#updateCompositeLocationAssignments=" + md);
 
       FlowGraph flowGraph = getFlowGraph(md);
 
@@ -409,19 +409,19 @@ public class LocationInference {
       Set<FlowNode> nodeSet = flowGraph.getNodeSet();
       for (Iterator iterator = nodeSet.iterator(); iterator.hasNext();) {
         FlowNode node = (FlowNode) iterator.next();
-        System.out.println("-node=" + node + "   node.getDescTuple=" + node.getDescTuple());
+        // System.out.println("-node=" + node + "   node.getDescTuple=" + node.getDescTuple());
         if (node.getCompositeLocation() != null) {
           CompositeLocation compLoc = node.getCompositeLocation();
           CompositeLocation updatedCompLoc = updateCompositeLocation(compLoc);
           node.setCompositeLocation(updatedCompLoc);
-          System.out.println("---updatedCompLoc1=" + updatedCompLoc);
+          // System.out.println("---updatedCompLoc1=" + updatedCompLoc);
         } else {
           NTuple<Descriptor> descTuple = node.getDescTuple();
-          System.out.println("update desc=" + descTuple);
+          // System.out.println("update desc=" + descTuple);
           CompositeLocation compLoc = convertToCompositeLocation(md, descTuple);
           compLoc = updateCompositeLocation(compLoc);
           node.setCompositeLocation(compLoc);
-          System.out.println("---updatedCompLoc2=" + compLoc);
+          // System.out.println("---updatedCompLoc2=" + compLoc);
         }
 
         if (node.isDeclaratonNode()) {
@@ -472,8 +472,8 @@ public class LocationInference {
 
   private void translateCompositeLocationAssignmentToFlowGraph(MethodDescriptor mdCaller) {
 
-    System.out.println("\n\n###translateCompositeLocationAssignmentToFlowGraph mdCaller="
-        + mdCaller);
+    // System.out.println("\n\n###translateCompositeLocationAssignmentToFlowGraph mdCaller="
+    // + mdCaller);
 
     // First, assign a composite location to a node in the flow graph
     GlobalFlowGraph callerGlobalFlowGraph = getSubGlobalFlowGraph(mdCaller);
@@ -535,7 +535,7 @@ public class LocationInference {
         // it matches with the current argument composite location
         // so what is the corresponding parameter local descriptor?
         FlowNode paramNode = calleeFlowGraph.getParamFlowNode(idx);
-        System.out.println("----------found paramNode=" + paramNode);
+        // System.out.println("----------found paramNode=" + paramNode);
         NTuple<Descriptor> paramDescTuple = paramNode.getCurrentDescTuple();
 
         NTuple<Location> newParamTupleFromArgTuple = translateToLocTuple(mdCallee, paramDescTuple);
@@ -543,7 +543,7 @@ public class LocationInference {
           newParamTupleFromArgTuple.add(argLocTuple.get(i));
         }
 
-        System.out.println("-----------newParamTuple=" + newParamTupleFromArgTuple);
+        // System.out.println("-----------newParamTuple=" + newParamTupleFromArgTuple);
         return new CompositeLocation(newParamTupleFromArgTuple);
 
       }
@@ -586,12 +586,33 @@ public class LocationInference {
         System.out.println("###RETURN COMP LOC=" + returnLoc);
         NTuple<Location> returnLocTuple = returnLoc.getTuple();
         NTuple<Descriptor> baseTuple = mapMethodInvokeNodeToBaseTuple.get(min);
+        System.out.println("###basetuple=" + baseTuple);
         NTuple<Descriptor> newReturnTuple = baseTuple.clone();
         for (int i = 1; i < returnLocTuple.size(); i++) {
           newReturnTuple.add(returnLocTuple.get(i).getLocDescriptor());
         }
         System.out.println("###NEW RETURN TUPLE FOR CALLER=" + newReturnTuple);
+
+        FlowReturnNode holderNode = callerFlowGraph.getFlowReturnNode(min);
+        NodeTupleSet holderTupleSet =
+            getNodeTupleSetFromReturnNode(getFlowGraph(mdCaller), holderNode);
+
         callerFlowGraph.getFlowReturnNode(min).setNewTuple(newReturnTuple);
+
+        // then need to remove old constraints
+        // TODO SAT
+        System.out.println("###REMOVE OLD CONSTRAINTS=" + holderNode);
+        for (Iterator<NTuple<Descriptor>> iter = holderTupleSet.iterator(); iter.hasNext();) {
+          NTuple<Descriptor> tupleFromHolder = iter.next();
+          Set<FlowEdge> holderOutEdge = callerFlowGraph.getOutEdgeSet(holderNode);
+          for (Iterator iterator2 = holderOutEdge.iterator(); iterator2.hasNext();) {
+            FlowEdge outEdge = (FlowEdge) iterator2.next();
+            NTuple<Descriptor> toberemovedTuple = outEdge.getEndTuple();
+            // System.out.println("---remove " + tupleFromHolder + " -> " + toberemovedTuple);
+            callerFlowGraph.removeEdge(tupleFromHolder, toberemovedTuple);
+          }
+        }
+
       } else {
         // if the return loc set was empty and later pcloc was connected to the return loc
         // need to make sure that return loc reflects to this changes.
@@ -692,6 +713,7 @@ public class LocationInference {
                       + "-> globalParamLocTu!globalArgLocTuple.get(0).getLocDescriptor().equals(LITERALDESC)ple="
                       + globalParamLocTuple);
               hasChanges = true;
+
               globalGraph.addValueFlowEdge(pcLocTuple, globalParamLocTuple);
             }
           }
@@ -772,10 +794,8 @@ public class LocationInference {
       baseLocTuple = translateToLocTuple(mdCaller, mapMethodInvokeNodeToBaseTuple.get(min));
     }
 
-    System.out.println("\n-#translate caller=" + mdCaller + " infer composite loc to callee="
-        + mdCallee + " baseLocTuple=" + baseLocTuple);
-    // System.out.println("-mapIdxToArgTuple=" + mapIdxToArgTuple);
-    // System.out.println("-callerMapLocToCompLoc=" + callerMapLocToCompLoc);
+    // System.out.println("\n-#translate caller=" + mdCaller + " infer composite loc to callee="
+    // + mdCallee + " baseLocTuple=" + baseLocTuple);
 
     Set<Location> keySet = callerMapLocToCompLoc.keySet();
     for (Iterator iterator = keySet.iterator(); iterator.hasNext();) {
@@ -792,9 +812,9 @@ public class LocationInference {
               translateCompositeLocationToCallee(callerCompLoc, baseLocTuple, mdCallee);
 
           calleeGlobalGraph.addMapLocationToInferCompositeLocation(key, newCalleeCompLoc);
-          System.out.println("1---key=" + key + "  callerCompLoc=" + callerCompLoc
-              + "  newCalleeCompLoc=" + newCalleeCompLoc);
-          System.out.println("-----caller=" + mdCaller + "    callee=" + mdCallee);
+          // System.out.println("1---key=" + key + "  callerCompLoc=" + callerCompLoc
+          // + "  newCalleeCompLoc=" + newCalleeCompLoc);
+          // System.out.println("-----caller=" + mdCaller + "    callee=" + mdCallee);
           if (!newCalleeCompLoc.get(0).getDescriptor().equals(mdCallee)) {
             System.exit(0);
           }
@@ -814,9 +834,9 @@ public class LocationInference {
               newCalleeCompLoc.addLocation(callerCompLoc.get(i));
             }
             calleeGlobalGraph.addMapLocationToInferCompositeLocation(key, newCalleeCompLoc);
-            System.out.println("2---key=" + key + "  callerCompLoc=" + callerCompLoc
-                + "  newCalleeCompLoc=" + newCalleeCompLoc);
-            System.out.println("-----caller=" + mdCaller + "    callee=" + mdCallee);
+            // System.out.println("2---key=" + key + "  callerCompLoc=" + callerCompLoc
+            // + "  newCalleeCompLoc=" + newCalleeCompLoc);
+            // System.out.println("-----caller=" + mdCaller + "    callee=" + mdCallee);
 
           } else {
             int paramIdx = getParamIdx(callerCompLoc, mapIdxToArgTuple);
@@ -826,12 +846,12 @@ public class LocationInference {
               // so transfer the same composite location to the callee
               if (!calleeGlobalGraph.contrainsInferCompositeLocationMapKey(key)) {
                 if (callerCompLoc.get(0).getDescriptor().equals(mdCallee)) {
-                  System.out.println("3---key=" + key + "  callerCompLoc=" + callerCompLoc
-                      + "  newCalleeCompLoc=" + callerCompLoc);
-                  System.out.println("-----caller=" + mdCaller + "    callee=" + mdCallee);
+                  // System.out.println("3---key=" + key + "  callerCompLoc=" + callerCompLoc
+                  // + "  newCalleeCompLoc=" + callerCompLoc);
+                  // System.out.println("-----caller=" + mdCaller + "    callee=" + mdCallee);
                   calleeGlobalGraph.addMapLocationToInferCompositeLocation(key, callerCompLoc);
                 } else {
-                  System.out.println("3---SKIP key=" + key + " callerCompLoc=" + callerCompLoc);
+                  // System.out.println("3---SKIP key=" + key + " callerCompLoc=" + callerCompLoc);
                 }
               }
               continue;
@@ -859,14 +879,9 @@ public class LocationInference {
               newCalleeCompLoc.addLocation(callerCompLoc.get(i));
             }
             calleeGlobalGraph.addMapLocationToInferCompositeLocation(key, newCalleeCompLoc);
-            System.out.println("4---key=" + key + "  callerCompLoc=" + callerCompLoc
-                + "  newCalleeCompLoc=" + newCalleeCompLoc);
-            System.out.println("-----caller=" + mdCaller + "    callee=" + mdCallee);
-
-            // System.out.println("-----argTuple=" + argTuple + " caller=" + mdCaller +
-            // "    callee="
-            // + mdCallee);
-            // System.out.println("-----paramIdx=" + paramIdx + "  paramFlowNode=" + paramFlowNode);
+            // System.out.println("4---key=" + key + "  callerCompLoc=" + callerCompLoc
+            // + "  newCalleeCompLoc=" + newCalleeCompLoc);
+            // System.out.println("-----caller=" + mdCaller + "    callee=" + mdCallee);
 
           }
 
@@ -875,9 +890,6 @@ public class LocationInference {
       }
     }
 
-    // System.out.println("-----*AFTER TRANSLATING COMP LOC MAPPING, CALLEE MAPPING="
-    // + calleeGlobalGraph.getMapLocationToInferCompositeLocation());
-
     System.out.println("#ASSIGN COMP LOC TO CALLEE PARAMS: callee=" + mdCallee + "  caller="
         + mdCaller);
     // If the location of an argument has a composite location
@@ -1049,8 +1061,6 @@ public class LocationInference {
           if (!needToGenerateCompositeLocation(paramGlobalNode, curPrefix)) {
             System.out.println("NO NEED TO GENERATE COMP LOC to " + paramGlobalNode
                 + " with prefix=" + curPrefix);
-            // System.out.println("prefixList=" + prefixList);
-            // System.out.println("reachableNodeSet=" + reachableNodeSet);
             return null;
           }
 
@@ -1308,6 +1318,7 @@ public class LocationInference {
 
     MethodDescriptor md = (MethodDescriptor) targetLocalLoc.getDescriptor();
     FlowGraph flowGraph = getFlowGraph(md);
+
     FlowNode flowNode = flowGraph.getFlowNode(node.getDescTuple());
     Set<FlowNode> reachableSet = flowGraph.getReachFlowNodeSetFrom(flowNode);
 
@@ -1315,7 +1326,6 @@ public class LocationInference {
     for (Iterator iterator = paramNodeSet.iterator(); iterator.hasNext();) {
       FlowNode paramFlowNode = (FlowNode) iterator.next();
       if (curPrefix.startsWith(translateToLocTuple(md, paramFlowNode.getDescTuple()))) {
-        System.out.println("here1?!");
         return true;
       }
     }
@@ -1333,7 +1343,6 @@ public class LocationInference {
 
         FlowNode paramNode = getFlowGraph(mdCallee).getParamFlowNode(paramIdx);
         if (checkNodeReachToReturnNode(mdCallee, paramNode)) {
-          System.out.println("here2?!");
           return true;
         }
 
@@ -1356,7 +1365,6 @@ public class LocationInference {
                 mapMethodDescriptorToCompositeReturnCase.get(md).booleanValue();
             if (hasCompReturnLocWithThis) {
               if (checkNodeReachToReturnNode(md, flowNode)) {
-                System.out.println("here3?!");
                 return true;
               }
             }
@@ -1366,7 +1374,6 @@ public class LocationInference {
             GlobalFlowNode subGlobalReachalbeNode = (GlobalFlowNode) iterator3.next();
             if (subGlobalReachalbeNode.getLocTuple().get(0).getLocDescriptor().equals(md.getThis())) {
               System.out.println("PREFIX FOUND=" + subGlobalReachalbeNode);
-              System.out.println("here4?!");
               return true;
             }
           }
@@ -1374,16 +1381,6 @@ public class LocationInference {
       }
     }
 
-    // System.out.println("flowGraph.getReturnNodeSet()=" + flowGraph.getReturnNodeSet());
-    // System.out.println("flowGraph.contains(node.getDescTuple())="
-    // + flowGraph.contains(node.getDescTuple()) + "  flowGraph.getFlowNode(node.getDescTuple())="
-    // + flowGraph.getFlowNode(node.getDescTuple()));reachableSet
-
-    // if (flowGraph.contains(node.getDescTuple())
-    // && flowGraph.getReturnNodeSet().contains(flowGraph.getFlowNode(node.getDescTuple()))) {
-    // // return checkFlowNodeReturnThisField(flowGraph);
-    // }
-
     Location lastLocationOfPrefix = curPrefix.get(curPrefix.size() - 1);
     // check whether prefix appears in the list of parameters
     Set<MethodInvokeNode> minSet = mapMethodDescToMethodInvokeNodeSet.get(md);
@@ -1413,8 +1410,6 @@ public class LocationInference {
                 if (globalReachlocTuple.get(i).equals(lastLocationOfPrefix)) {
                   System.out.println("ARG  " + argTuple + "  IS MATCHED WITH="
                       + lastLocationOfPrefix);
-                  System.out.println("here5?!");
-
                   return true;
                 }
               }
@@ -1424,39 +1419,6 @@ public class LocationInference {
       }
     }
 
-    // ClassDescriptor cd;
-    // if (lastLocationOfPrefix.getLocDescriptor() instanceof VarDescriptor) {
-    // cd = ((VarDescriptor) lastLocationOfPrefix.getLocDescriptor()).getType().getClassDesc();
-    // } else {
-    // // it is a field descriptor
-    // cd = ((FieldDescriptor) lastLocationOfPrefix.getLocDescriptor()).getType().getClassDesc();
-    // }
-    //
-    // GlobalFlowGraph subGlobalFlowGraph = getSubGlobalFlowGraph(md);
-    // Set<GlobalFlowNode> subGlobalReachableSet = subGlobalFlowGraph.getReachableNodeSetFrom(node);
-    //
-    // System.out.println("TRY TO FIND lastLocationOfPrefix=" + lastLocationOfPrefix);
-    // for (Iterator iterator2 = subGlobalReachableSet.iterator(); iterator2.hasNext();) {
-    // GlobalFlowNode subGlobalReachalbeNode = (GlobalFlowNode) iterator2.next();
-    // // NTuple<Location> locTuple = translateToLocTuple(md, reachalbeNode.getDescTuple());
-    // NTuple<Location> locTuple = subGlobalReachalbeNode.getLocTuple();
-    //
-    // for (int i = 0; i < locTuple.size(); i++) {
-    // if (locTuple.get(i).equals(lastLocationOfPrefix)) {
-    // return true;
-    // }
-    // }
-    //
-    // Location lastLoc = locTuple.get(locTuple.size() - 1);
-    // Descriptor enclosingDescriptor = lastLoc.getDescriptor();
-    //
-    // if (enclosingDescriptor != null && enclosingDescriptor.equals(cd)) {
-    // System.out.println("# WHY HERE?");
-    // System.out.println("subGlobalReachalbeNode=" + subGlobalReachalbeNode);
-    // return true;
-    // }
-    // }
-
     return false;
   }
 
@@ -1534,24 +1496,6 @@ public class LocationInference {
       }
     });
 
-    // remove a prefix which is not suitable for generating composite location
-    Location localVarLoc = node.getLocTuple().get(0);
-    MethodDescriptor md = (MethodDescriptor) localVarLoc.getDescriptor();
-    ClassDescriptor cd = md.getClassDesc();
-
-    int idx = 0;
-    Set<NTuple<Location>> toberemoved = new HashSet<NTuple<Location>>();
-    // for (int i = 0; i < prefixList.size(); i++) {
-    // NTuple<Location> prefixLocTuple = prefixList.get(i);
-    // if (!containsClassDesc(cd, prefixLocTuple)) {
-    // toberemoved.add(prefixLocTuple);
-    // }
-    // }
-
-    // System.out.println("method class=" + cd + "  toberemoved=" + toberemoved);
-
-    prefixList.removeAll(toberemoved);
-
     return prefixList;
 
   }
@@ -1596,17 +1540,6 @@ public class LocationInference {
         MethodDescriptor curPrefixFirstElementMethodDesc =
             (MethodDescriptor) curPrefix.get(0).getDescriptor();
 
-        // MethodDescriptor nodePrefixLocFirstElementMethodDesc =
-        // (MethodDescriptor) prefixLoc.getDescriptor();
-
-        // System.out.println("curPrefixFirstElementMethodDesc=" +
-        // curPrefixFirstElementMethodDesc);
-        // System.out.println("nodePrefixLocFirstElementMethodDesc="
-        // + nodePrefixLocFirstElementMethodDesc);
-
-        // TODO
-        // if (!node.getLocTuple().startsWith(curPrefix.get(0))) {
-
         Location curPrefixLocalLoc = curPrefix.get(0);
 
         Location targetLocalLoc = new Location(md, node.getDescTuple().get(0));
@@ -1616,12 +1549,6 @@ public class LocationInference {
         System.out.println("NEED2ASSIGN COMP LOC TO " + node + " with prefix=" + curPrefix);
         System.out.println("-targetLocalLoc=" + targetLocalLoc + "   - newCompLoc=" + newCompLoc);
 
-        // // makes sure that a newly generated location appears in the hierarchy graph
-        // for (int compIdx = 0; compIdx < newCompLoc.getSize(); compIdx++) {
-        // Location curLoc = newCompLoc.get(compIdx);
-        // getHierarchyGraph(curLoc.getDescriptor()).getHNode(curLoc.getLocDescriptor());
-        // }
-        // subGlobalFlowGraph.addMapLocationToInferCompositeLocation(targetLocalLoc, newCompLoc);
         node.setCompositeLocation(newCompLoc);
 
         return newCompLoc;
@@ -1719,24 +1646,7 @@ public class LocationInference {
       // here only keep the first element(method location) of the descriptor
       // tuple
       NTuple<Location> srcLocTuple = translateToLocTuple(md, srcDescTuple);
-      // Location srcMethodLoc = srcLocTuple.get(0);
-      // Descriptor srcVarDesc = srcMethodLoc.getLocDescriptor();
-      // // if (flowGraph.isParamDesc(srcVarDesc) &&
-      // (!srcVarDesc.equals(md.getThis()))) {
-      // if (!srcVarDesc.equals(md.getThis())) {
-      // srcLocTuple = new NTuple<Location>();
-      // Location loc = new Location(md, srcVarDesc);
-      // srcLocTuple.add(loc);
-      // }
-      //
       NTuple<Location> dstLocTuple = translateToLocTuple(md, dstDescTuple);
-      // Location dstMethodLoc = dstLocTuple.get(0);
-      // Descriptor dstVarDesc = dstMethodLoc.getLocDescriptor();
-      // if (!dstVarDesc.equals(md.getThis())) {
-      // dstLocTuple = new NTuple<Location>();
-      // Location loc = new Location(md, dstVarDesc);
-      // dstLocTuple.add(loc);
-      // }
 
       globalGraph.addValueFlowEdge(srcLocTuple, dstLocTuple);
 
@@ -1761,7 +1671,6 @@ public class LocationInference {
       } else if (desc instanceof FieldDescriptor) {
         enclosingDesc = ((FieldDescriptor) desc).getType().getClassDesc();
       } else {
-        // TODO: inter descriptor case
         enclosingDesc = desc;
       }
 
@@ -1849,6 +1758,7 @@ public class LocationInference {
         if (callerSrcNodeLocTuple != null && callerSrcNodeLocTuple.size() > 0) {
           for (Iterator iterator2 = pcLocTupleSet.iterator(); iterator2.hasNext();) {
             NTuple<Location> pcLocTuple = (NTuple<Location>) iterator2.next();
+
             callerSubGlobalGraph.addValueFlowEdge(pcLocTuple, callerSrcNodeLocTuple);
           }
         }
@@ -1864,11 +1774,11 @@ public class LocationInference {
     GlobalFlowGraph calleeSubGlobalGraph = getSubGlobalFlowGraph(mdCallee);
     GlobalFlowGraph callerSubGlobalGraph = getSubGlobalFlowGraph(mdCaller);
 
-    // System.out.println("$addValueFlowFromCalleeNode calleeSrcNode=" + calleeSrcNode);
+    System.out.println("$addValueFlowFromCalleeNode calleeSrcNode=" + calleeSrcNode);
 
     NTuple<Location> callerSrcNodeLocTuple =
         translateToCallerLocTuple(min, mdCallee, mdCaller, calleeSrcNode.getLocTuple());
-    // System.out.println("---callerSrcNodeLocTuple=" + callerSrcNodeLocTuple);
+    System.out.println("---callerSrcNodeLocTuple=" + callerSrcNodeLocTuple);
 
     if (callerSrcNodeLocTuple != null && callerSrcNodeLocTuple.size() > 0) {
 
@@ -1880,7 +1790,8 @@ public class LocationInference {
             translateToCallerLocTuple(min, mdCallee, mdCaller, outNode.getLocTuple());
         // System.out.println("outNode=" + outNode + "   callerDstNodeLocTuple="
         // + callerDstNodeLocTuple);
-        if (callerDstNodeLocTuple != null) {
+        if (callerSrcNodeLocTuple != null && callerDstNodeLocTuple != null
+            && callerSrcNodeLocTuple.size() > 0 && callerDstNodeLocTuple.size() > 0) {
           callerSubGlobalGraph.addValueFlowEdge(callerSrcNodeLocTuple, callerDstNodeLocTuple);
         }
       }
@@ -1941,7 +1852,7 @@ public class LocationInference {
 
       TypeDescriptor type = ((FieldDescriptor) desc).getType();
       if (type.isArray()) {
-        return false;
+        return !type.isPrimitive();
       } else {
         return type.isPtr();
       }
@@ -1949,7 +1860,7 @@ public class LocationInference {
     } else if (desc instanceof VarDescriptor) {
       TypeDescriptor type = ((VarDescriptor) desc).getType();
       if (type.isArray()) {
-        return false;
+        return !type.isPrimitive();
       } else {
         return type.isPtr();
       }
@@ -2009,18 +1920,6 @@ public class LocationInference {
         FlowNode flowNode = flowGraph.getParamFlowNode(paramIdx);
         CompositeLocation inferredCompLoc =
             updateCompositeLocation(flowNode.getCompositeLocation());
-        // NTuple<Descriptor> descTuple = flowNode.getDescTuple();
-        //
-        // CompositeLocation assignedCompLoc = flowNode.getCompositeLocation();
-        // CompositeLocation inferredCompLoc;
-        // if (assignedCompLoc != null) {
-        // inferredCompLoc = translateCompositeLocation(assignedCompLoc);
-        // } else {
-        // Descriptor locDesc = descTuple.get(0);
-        // Location loc = new Location(md, locDesc.getSymbol());
-        // loc.setLocDescriptor(locDesc);
-        // inferredCompLoc = new CompositeLocation(loc);
-        // }
         System.out.println("-paramIdx=" + paramIdx + "   infer=" + inferredCompLoc + " original="
             + flowNode.getCompositeLocation());
 
@@ -2338,6 +2237,60 @@ public class LocationInference {
 
   private void constructHierarchyGraph() {
 
+    LinkedList<MethodDescriptor> methodDescList =
+        (LinkedList<MethodDescriptor>) toanalyze_methodDescList.clone();
+
+    while (!methodDescList.isEmpty()) {
+      MethodDescriptor md = methodDescList.removeLast();
+      if (state.SSJAVADEBUG) {
+        HierarchyGraph hierarchyGraph = new HierarchyGraph(md);
+        System.out.println();
+        System.out.println("SSJAVA: Construcing the hierarchy graph from " + md);
+        constructHierarchyGraph(md, hierarchyGraph);
+        mapDescriptorToHierarchyGraph.put(md, hierarchyGraph);
+
+      }
+    }
+
+    setupToAnalyze();
+    while (!toAnalyzeIsEmpty()) {
+      ClassDescriptor cd = toAnalyzeNext();
+      HierarchyGraph graph = getHierarchyGraph(cd);
+      for (Iterator iter = cd.getFields(); iter.hasNext();) {
+        FieldDescriptor fieldDesc = (FieldDescriptor) iter.next();
+        if (!(fieldDesc.isStatic() && fieldDesc.isFinal())) {
+          graph.getHNode(fieldDesc);
+        }
+      }
+    }
+
+    Set<Descriptor> keySet = mapDescriptorToHierarchyGraph.keySet();
+    for (Iterator iterator = keySet.iterator(); iterator.hasNext();) {
+      Descriptor key = (Descriptor) iterator.next();
+      HierarchyGraph graph = getHierarchyGraph(key);
+
+      Set<HNode> nodeToBeConnected = new HashSet<HNode>();
+      for (Iterator iterator2 = graph.getNodeSet().iterator(); iterator2.hasNext();) {
+        HNode node = (HNode) iterator2.next();
+        if (!node.isSkeleton() && !node.isCombinationNode()) {
+          if (graph.getIncomingNodeSet(node).size() == 0) {
+            nodeToBeConnected.add(node);
+          }
+        }
+      }
+
+      for (Iterator iterator2 = nodeToBeConnected.iterator(); iterator2.hasNext();) {
+        HNode node = (HNode) iterator2.next();
+        System.out.println("NEED TO BE CONNECTED TO TOP=" + node);
+        graph.addEdge(graph.getHNode(TOPDESC), node);
+      }
+
+    }
+
+  }
+
+  private void constructHierarchyGraph2() {
+
     // do fixed-point analysis
 
     LinkedList<MethodDescriptor> descriptorListToAnalyze = ssjava.getSortedDescriptors();
@@ -2547,6 +2500,9 @@ public class LocationInference {
           System.out.println("-srcCurTuple=" + srcCurTuple + "  dstCurTuple=" + dstCurTuple
               + "  srcNode=" + srcNode + "   dstNode=" + dstNode);
 
+          // srcCurTuple = translateBaseTuple(srcNode, srcCurTuple);
+          // dstCurTuple = translateBaseTuple(dstNode, dstCurTuple);
+
           if ((srcCurTuple.size() > 1 && dstCurTuple.size() > 1)
               && srcCurTuple.get(0).equals(dstCurTuple.get(0))) {
 
@@ -2611,6 +2567,31 @@ public class LocationInference {
 
   }
 
+  private NTuple<Descriptor> translateBaseTuple(FlowNode flowNode, NTuple<Descriptor> inTuple) {
+
+    if (flowNode.getBaseTuple() != null) {
+
+      NTuple<Descriptor> translatedTuple = new NTuple<Descriptor>();
+
+      NTuple<Descriptor> baseTuple = flowNode.getBaseTuple();
+
+      for (int i = 0; i < baseTuple.size(); i++) {
+        translatedTuple.add(baseTuple.get(i));
+      }
+
+      for (int i = 1; i < inTuple.size(); i++) {
+        translatedTuple.add(inTuple.get(i));
+      }
+
+      System.out.println("------TRANSLATED " + inTuple + " -> " + translatedTuple);
+      return translatedTuple;
+
+    } else {
+      return inTuple;
+    }
+
+  }
+
   private MethodSummary getMethodSummary(MethodDescriptor md) {
     if (!mapDescToLocationSummary.containsKey(md)) {
       mapDescToLocationSummary.put(md, new MethodSummary(md));
@@ -3262,6 +3243,7 @@ public class LocationInference {
             if (!paramDescNOTHavingInFlowSet.contains(node.getCurrentDescTuple().get(0))) {
               flowNodeLowerthanPCLocSet.add(node);
               fg.addValueFlowEdge(pcDescTuple, node.getDescTuple());
+
               subGlobalFlowGraph.addValueFlowEdge(pcLocTuple,
                   translateToLocTuple(md, node.getDescTuple()));
             }
@@ -3276,7 +3258,7 @@ public class LocationInference {
           System.out.println("#########################################");
           for (Iterator iterator = flowNodeLowerthanPCLocSet.iterator(); iterator.hasNext();) {
             FlowNode lowerNode = (FlowNode) iterator.next();
-            if (lowerNode.getCompositeLocation() == null) {
+            if (lowerNode.getDescTuple().size() == 1 && lowerNode.getCompositeLocation() == null) {
               NTuple<Location> lowerLocTuple = translateToLocTuple(md, lowerNode.getDescTuple());
               CompositeLocation newComp =
                   calculateCompositeLocationFromSubGlobalGraph(md, lowerNode);
@@ -4547,7 +4529,6 @@ public class LocationInference {
       newImplicitTupleSet.addTupleSet(implicitFlowTupleSet);
       newImplicitTupleSet.addTupleSet(condTupleNode);
 
-      System.out.println("A5");
       newImplicitTupleSet.addGlobalFlowTupleSet(implicitFlowTupleSet.getGlobalLocTupleSet());
       newImplicitTupleSet.addGlobalFlowTupleSet(condTupleNode.getGlobalLocTupleSet());
 
@@ -4701,7 +4682,6 @@ public class LocationInference {
     // translateToLocTuple(md, callerImplicitTuple));
     // }
     // }
-    System.out.println("A4");
     newImplicitTupleSet.addGlobalFlowTupleSet(condTupleNode.getGlobalLocTupleSet());
 
     analyzeFlowBlockNode(md, nametable, isn.getTrueBlock(), newImplicitTupleSet);
@@ -4723,6 +4703,7 @@ public class LocationInference {
     fn.setDeclarationNode();
 
     if (dn.getExpression() != null) {
+      System.out.println("-analyzeFlowDeclarationNode=" + dn.printNode(0));
 
       NodeTupleSet nodeSetRHS = new NodeTupleSet();
       analyzeFlowExpressionNode(md, nametable, dn.getExpression(), nodeSetRHS, null,
@@ -4751,9 +4732,20 @@ public class LocationInference {
       GlobalFlowGraph globalFlowGraph = getSubGlobalFlowGraph(md);
       for (Iterator<NTuple<Location>> iterator = nodeSetRHS.globalIterator(); iterator.hasNext();) {
         NTuple<Location> calleeReturnLocTuple = iterator.next();
+
         globalFlowGraph.addValueFlowEdge(calleeReturnLocTuple, translateToLocTuple(md, tupleLHS));
       }
 
+      for (Iterator<NTuple<Location>> iterator = implicitFlowTupleSet.globalIterator(); iterator
+          .hasNext();) {
+        NTuple<Location> implicitGlobalTuple = iterator.next();
+
+        globalFlowGraph.addValueFlowEdge(implicitGlobalTuple, translateToLocTuple(md, tupleLHS));
+      }
+
+      System.out.println("-nodeSetRHS=" + nodeSetRHS);
+      System.out.println("-implicitFlowTupleSet=" + implicitFlowTupleSet);
+
     }
 
   }
@@ -4865,7 +4857,7 @@ public class LocationInference {
   private void analyzeFlowTertiaryNode(MethodDescriptor md, SymbolTable nametable, TertiaryNode tn,
       NodeTupleSet nodeSet, NodeTupleSet implicitFlowTupleSet) {
 
-    System.out.println("analyzeFlowTertiaryNode=" + tn.printNode(0));
+    // System.out.println("analyzeFlowTertiaryNode=" + tn.printNode(0));
 
     NodeTupleSet tertiaryTupleNode = new NodeTupleSet();
     analyzeFlowExpressionNode(md, nametable, tn.getCond(), tertiaryTupleNode, null,
@@ -4892,7 +4884,6 @@ public class LocationInference {
       newImplicitTupleSet.addTuple(interTuple);
     }
 
-    System.out.println("A7");
     newImplicitTupleSet.addGlobalFlowTupleSet(tertiaryTupleNode.getGlobalLocTupleSet());
 
     System.out.println("---------newImplicitTupleSet=" + newImplicitTupleSet);
@@ -4904,7 +4895,6 @@ public class LocationInference {
     analyzeFlowExpressionNode(md, nametable, tn.getFalseExpr(), tertiaryTupleNode, null,
         newImplicitTupleSet, false);
 
-    System.out.println("A8");
     nodeSet.addGlobalFlowTupleSet(tertiaryTupleNode.getGlobalLocTupleSet());
     nodeSet.addTupleSet(tertiaryTupleNode);
 
@@ -5001,6 +4991,13 @@ public class LocationInference {
 
         assert (baseNodeSet.size() == 1);
         NTuple<Descriptor> baseTuple = baseNodeSet.iterator().next();
+        if (baseTuple.get(0) instanceof InterDescriptor) {
+          if (baseTuple.size() > 1) {
+            throw new Error();
+          }
+          FlowNode interNode = getFlowGraph(mdCaller).getFlowNode(baseTuple);
+          baseTuple = translateBaseTuple(interNode, baseTuple);
+        }
         mapMethodInvokeNodeToBaseTuple.put(min, baseTuple);
 
         if (!min.getMethod().isStatic()) {
@@ -5024,7 +5021,8 @@ public class LocationInference {
               // nodeSet.addTuple(inFlowTuple);
               System.out.println("1CREATE A NEW TUPLE=" + inFlowTuple + "  from="
                   + mdCallee.getThis());
-              tupleSet.addTuple(inFlowTuple);
+              // tupleSet.addTuple(inFlowTuple);
+              tupleSet.addTuple(baseTuple);
             } else {
               // TODO
               System.out.println("returnNode=" + returnNode);
@@ -5110,7 +5108,7 @@ public class LocationInference {
       }
 
       if (mdCallee.getReturnType() != null && !mdCallee.getReturnType().isVoid()) {
-        FlowReturnNode setNode = getFlowGraph(mdCaller).createReturnNode(min);
+        FlowReturnNode returnHolderNode = getFlowGraph(mdCaller).createReturnNode(min);
 
         if (needToGenerateInterLoc(tupleSet)) {
           System.out.println("20");
@@ -5136,17 +5134,26 @@ public class LocationInference {
             }
           }
 
-          setNode.addTuple(interTuple);
-          System.out.println("ADD TUPLESET=" + interTuple + " to returnnode=" + setNode);
+          returnHolderNode.addTuple(interTuple);
 
-        } else {
-          setNode.addTupleSet(tupleSet);
-          System.out.println("ADD TUPLESET=" + tupleSet + " to returnnode=" + setNode);
+          nodeSet.addTuple(interTuple);
+          System.out.println("ADD TUPLESET=" + interTuple + " to returnnode=" + returnHolderNode);
 
+        } else {
+          returnHolderNode.addTupleSet(tupleSet);
+          System.out.println("ADD TUPLESET=" + tupleSet + " to returnnode=" + returnHolderNode);
         }
         // setNode.addTupleSet(tupleSet);
-        nodeSet.addTuple(setNode.getDescTuple());
+        // NodeTupleSet setFromReturnNode=new NodeTupleSet();
+        // setFromReturnNode.addTuple(tuple);
+
+        NodeTupleSet holderTupleSet =
+            getNodeTupleSetFromReturnNode(getFlowGraph(mdCaller), returnHolderNode);
 
+        System.out.println("HOLDER TUPLe SET=" + holderTupleSet);
+        nodeSet.addTupleSet(holderTupleSet);
+
+        nodeSet.addTuple(returnHolderNode.getDescTuple());
       }
 
       // propagateFlowsFromCallee(min, md, min.getMethod());
@@ -5175,6 +5182,47 @@ public class LocationInference {
 
   }
 
+  private NodeTupleSet getNodeTupleSetFromReturnNode(FlowGraph fg, FlowReturnNode node) {
+    NodeTupleSet nts = new NodeTupleSet();
+
+    Set<NTuple<Descriptor>> returnSet = node.getReturnTupleSet();
+
+    for (Iterator iterator = returnSet.iterator(); iterator.hasNext();) {
+      NTuple<Descriptor> tuple = (NTuple<Descriptor>) iterator.next();
+      FlowNode flowNode = fg.getFlowNode(tuple);
+      if (flowNode instanceof FlowReturnNode) {
+        returnSet.addAll(recurGetNode(fg, (FlowReturnNode) flowNode));
+      } else {
+        returnSet.add(tuple);
+      }
+    }
+
+    for (Iterator iterator = returnSet.iterator(); iterator.hasNext();) {
+      NTuple<Descriptor> nTuple = (NTuple<Descriptor>) iterator.next();
+      nts.addTuple(nTuple);
+    }
+
+    return nts;
+
+  }
+
+  private Set<NTuple<Descriptor>> recurGetNode(FlowGraph fg, FlowReturnNode rnode) {
+
+    Set<NTuple<Descriptor>> tupleSet = new HashSet<NTuple<Descriptor>>();
+
+    Set<NTuple<Descriptor>> returnSet = rnode.getReturnTupleSet();
+    for (Iterator iterator = returnSet.iterator(); iterator.hasNext();) {
+      NTuple<Descriptor> tuple = (NTuple<Descriptor>) iterator.next();
+      FlowNode flowNode = fg.getFlowNode(tuple);
+      if (flowNode instanceof FlowReturnNode) {
+        tupleSet.addAll(recurGetNode(fg, (FlowReturnNode) flowNode));
+      }
+      tupleSet.add(tuple);
+    }
+
+    return tupleSet;
+  }
+
   private NTuple<Descriptor> generateArgTuple(MethodDescriptor mdCaller, NodeTupleSet argTupleSet) {
 
     int size = 0;
@@ -5222,7 +5270,7 @@ public class LocationInference {
     }
     // Set<FlowNode> reachableSet = fg.getReachFlowNodeSetFrom(inNode);
     Set<FlowNode> reachableSet = fg.getReachableSetFrom(inNode.getDescTuple());
-    System.out.println("inNode=" + inNode + "  reachalbeSet=" + reachableSet);
+    // System.out.println("inNode=" + inNode + "  reachalbeSet=" + reachableSet);
 
     for (Iterator iterator = reachableSet.iterator(); iterator.hasNext();) {
       FlowNode fn = (FlowNode) iterator.next();
@@ -5290,6 +5338,7 @@ public class LocationInference {
         NTuple<Location> calleeReturnLocTuple = iterator.next();
         for (Iterator<NTuple<Descriptor>> arrIter = expNodeTupleSet.iterator(); arrIter.hasNext();) {
           NTuple<Descriptor> arrTuple = arrIter.next();
+
           globalFlowGraph.addValueFlowEdge(calleeReturnLocTuple, translateToLocTuple(md, arrTuple));
         }
       }
@@ -5307,7 +5356,8 @@ public class LocationInference {
 
         if (needToGenerateInterLoc(nodeSetArrayAccessExp)) {
           System.out.println("1");
-          NTuple<Descriptor> interTuple = getFlowGraph(md).createIntermediateNode().getDescTuple();
+          FlowNode interNode = getFlowGraph(md).createIntermediateNode();
+          NTuple<Descriptor> interTuple = interNode.getDescTuple();
 
           for (Iterator<NTuple<Descriptor>> iter = nodeSetArrayAccessExp.iterator(); iter.hasNext();) {
             NTuple<Descriptor> higherTuple = iter.next();
@@ -5321,11 +5371,11 @@ public class LocationInference {
           if (base != null) {
             fg.addMapInterLocNodeToEnclosingDescriptor(interTuple.get(0),
                 getClassTypeDescriptor(base.get(base.size() - 1)));
+            interNode.setBaseTuple(base);
           }
         }
       }
 
-      System.out.println("A1");
       nodeSet.addGlobalFlowTupleSet(idxNodeTupleSet.getGlobalLocTupleSet());
       nodeSet.addTupleSet(nodeSetArrayAccessExp);
 
@@ -5396,7 +5446,6 @@ public class LocationInference {
       nodeSet.addTupleSet(leftOpSet);
       nodeSet.addTupleSet(rightOpSet);
 
-      System.out.println("A6");
       nodeSet.addGlobalFlowTupleSet(leftOpSet.getGlobalLocTupleSet());
       nodeSet.addGlobalFlowTupleSet(rightOpSet.getGlobalLocTupleSet());
 
@@ -5557,6 +5606,7 @@ public class LocationInference {
         for (Iterator<NTuple<Location>> iterator = idxNodeTupleSet.globalIterator(); iterator
             .hasNext();) {
           NTuple<Location> calleeReturnLocTuple = iterator.next();
+
           globalFlowGraph.addValueFlowEdge(calleeReturnLocTuple,
               translateToLocTuple(md, flowFieldTuple));
         }
@@ -5598,7 +5648,6 @@ public class LocationInference {
               nodeSet.clear();
               flowFieldTuple = interTuple;
             }
-            System.out.println("A3");
             nodeSet.addGlobalFlowTupleSet(idxNodeTupleSet.getGlobalLocTupleSet());
           }
 
@@ -5689,6 +5738,7 @@ public class LocationInference {
           NTuple<Descriptor> callerLHSTuple = iter2.next();
           System.out.println("$$$ GLOBAL FLOW ADD=" + calleeReturnLocTuple + " -> "
               + translateToLocTuple(md, callerLHSTuple));
+
           globalFlowGraph.addValueFlowEdge(calleeReturnLocTuple,
               translateToLocTuple(md, callerLHSTuple));
         }
@@ -5699,6 +5749,7 @@ public class LocationInference {
         NTuple<Location> calleeReturnLocTuple = iterator.next();
         for (Iterator<NTuple<Descriptor>> iter2 = nodeSetLHS.iterator(); iter2.hasNext();) {
           NTuple<Descriptor> callerLHSTuple = iter2.next();
+
           globalFlowGraph.addValueFlowEdge(calleeReturnLocTuple,
               translateToLocTuple(md, callerLHSTuple));
           System.out.println("$$$ GLOBAL FLOW PCLOC ADD=" + calleeReturnLocTuple + " -> "
@@ -5740,7 +5791,6 @@ public class LocationInference {
 
     if (nodeSet != null) {
       nodeSet.addTupleSet(nodeSetLHS);
-      System.out.println("A2");
       nodeSet.addGlobalFlowTupleSet(nodeSetLHS.getGlobalLocTupleSet());
     }
   }