1 cananian 1.1.2.2 // ODInformation.java, created Mon Dec 11 17:58:49 2000 by vivien
   2 cananian 1.1.2.2 // Copyright (C) 2001 Frederic VIVIEN <vivien@lcs.mit.edu>
   3 vivien   1.1.2.1 // Licensed under the terms of the GNU GPL; see COPYING for details.
   4 vivien   1.1.2.1 package harpoon.Analysis.PointerAnalysis;
   5 vivien   1.1.2.1 
   6 vivien   1.1.2.1 import java.util.HashSet;
   7 vivien   1.1.2.1 import java.util.Set;
   8 vivien   1.1.2.1 import java.util.Iterator;
   9 vivien   1.1.2.1 import java.util.Map;
  10 vivien   1.1.2.1 import java.util.LinkedList;
  11 vivien   1.1.2.1 
  12 vivien   1.1.2.1 import harpoon.Util.Util;
  13 vivien   1.1.2.1 
  14 vivien   1.1.2.1 import harpoon.Util.DataStructs.Relation;
  15 vivien   1.1.2.1 import harpoon.Util.DataStructs.LightRelation;
  16 vivien   1.1.2.1 import harpoon.Util.DataStructs.LightMap;
  17 vivien   1.1.2.1 
  18 vivien   1.1.2.1 
  19 vivien   1.1.2.1 /**
  20 vivien   1.1.2.1  * <code>ODInformation</code> contains the pieces of information
  21 vivien   1.1.2.1  * relative to an on-demand analysis.
  22 cananian 1.1.2.2  *
  23 cananian 1.1.2.2  * @author  Frederic VIVIEN <vivien@lcs.mit.edu>
  24 cananian 1.5      * @version $Id: ODInformation.java,v 1.5 2004/02/08 03:20:02 cananian Exp $
  25 vivien   1.1.2.1  */
  26 vivien   1.1.2.1 
  27 vivien   1.1.2.1 public class ODInformation {
  28 vivien   1.1.2.1     public static final boolean DEBUG = false;
  29 vivien   1.1.2.1     private static int odinfonum = 0;
  30 vivien   1.1.2.1     
  31 vivien   1.1.2.1     public boolean precise  = true;
  32 vivien   1.1.2.1 
  33 vivien   1.1.2.1     // The three relationships between edges and skipped call sites
  34 vivien   1.1.2.1     public EdgesNCallees inAlways    = null;
  35 vivien   1.1.2.1     public EdgesNCallees outAlways   = null;
  36 vivien   1.1.2.1     public EdgesNCallees outMaybe    = null;
  37 vivien   1.1.2.1     public  Set      skippedCS        = null;
  38 vivien   1.1.2.1     private Relation skippedCSHistory = null;
  39 vivien   1.1.2.1     private Relation locks            = null;
  40 vivien   1.1.2.1     private Set      lock_set         = null;
  41 vivien   1.1.2.1     private int id = -1;
  42 vivien   1.1.2.1 
  43 vivien   1.1.2.1     
  44 vivien   1.1.2.1     /** Creates an <code>ODInformation</code> object. This information
  45 vivien   1.1.2.1      * is precise or conservative depending of the value of the
  46 vivien   1.1.2.1      * corresponding static field in ODPointerAnalysis.
  47 vivien   1.1.2.1      */
  48 vivien   1.1.2.1     public ODInformation(){
  49 vivien   1.1.2.1         skippedCS = new HashSet();
  50 vivien   1.1.2.1 
  51 vivien   1.1.2.1         precise = ODPointerAnalysis.ODA_precise;
  52 vivien   1.1.2.1 
  53 vivien   1.1.2.1         if(precise){
  54 vivien   1.1.2.1             inAlways  = new EdgesNCallees(true);
  55 vivien   1.1.2.1             outAlways = new EdgesNCallees(true);
  56 vivien   1.1.2.1             outMaybe  = new EdgesNCallees(false);
  57 vivien   1.1.2.1             skippedCSHistory = new LightRelation();
  58 vivien   1.1.2.1             locks            = new LightRelation();
  59 vivien   1.1.2.1         }
  60 vivien   1.1.2.1         else{
  61 vivien   1.1.2.1             lock_set = new HashSet();
  62 vivien   1.1.2.1         }
  63 vivien   1.1.2.1         id = ODInformation.odinfonum++;
  64 vivien   1.1.2.1     }
  65 vivien   1.1.2.1 
  66 vivien   1.1.2.1    /** Private constructor for <code>clone</code>. */
  67 vivien   1.1.2.1     private ODInformation(boolean precision, Set cs, 
  68 vivien   1.1.2.1                           EdgesNCallees ia, EdgesNCallees oa, EdgesNCallees om,
  69 vivien   1.1.2.1                           Relation cs_hist, Relation org_locks, Set org_lock_set)
  70 vivien   1.1.2.1     {
  71 vivien   1.1.2.1         precise = precision;
  72 vivien   1.1.2.1         skippedCS = cs;
  73 vivien   1.1.2.1 
  74 vivien   1.1.2.1         inAlways  = ia;
  75 vivien   1.1.2.1         outAlways = oa;
  76 vivien   1.1.2.1         outMaybe  = om;
  77 vivien   1.1.2.1         skippedCSHistory = cs_hist;
  78 vivien   1.1.2.1         locks     = org_locks;
  79 vivien   1.1.2.1         lock_set  = org_lock_set;
  80 vivien   1.1.2.1         id = ODInformation.odinfonum++;
  81 vivien   1.1.2.1     }
  82 vivien   1.1.2.1 
  83 vivien   1.1.2.1 
  84 vivien   1.1.2.1     /** Creates an <code>ODInformation</code> object, whose precision
  85 vivien   1.1.2.1      * is set by its boolean argument.
  86 vivien   1.1.2.1      */
  87 vivien   1.1.2.1     public ODInformation(boolean precision){
  88 vivien   1.1.2.1         skippedCS = new HashSet();
  89 vivien   1.1.2.1 
  90 vivien   1.1.2.1         precise = precision;
  91 vivien   1.1.2.1 
  92 vivien   1.1.2.1         if(precise){
  93 vivien   1.1.2.1             inAlways  = new EdgesNCallees(true);
  94 vivien   1.1.2.1             outAlways = new EdgesNCallees(true);
  95 vivien   1.1.2.1             outMaybe  = new EdgesNCallees(false);
  96 vivien   1.1.2.1             skippedCSHistory = new LightRelation();
  97 vivien   1.1.2.1             locks            = new LightRelation();
  98 vivien   1.1.2.1             lock_set         = null;
  99 vivien   1.1.2.1         }
 100 vivien   1.1.2.1         else{
 101 vivien   1.1.2.1             locks    = null;
 102 vivien   1.1.2.1             lock_set = new HashSet();
 103 vivien   1.1.2.1         }
 104 vivien   1.1.2.1         id = ODInformation.odinfonum++;
 105 vivien   1.1.2.1     }
 106 vivien   1.1.2.1 
 107 vivien   1.1.2.1 
 108 vivien   1.1.2.1 
 109 vivien   1.1.2.1     /** Joins two <code>ODInformation</code> objects.
 110 vivien   1.1.2.1      */
 111 vivien   1.1.2.1     public void join(ODInformation odi2)
 112 vivien   1.1.2.1     {
 113 cananian 1.3.2.1         assert precise==odi2.precise : "We can only join EdgesNCallees of same precision";
 114 vivien   1.1.2.1 
 115 vivien   1.1.2.1         if(precise)
 116 vivien   1.1.2.1             join_precise(odi2);
 117 vivien   1.1.2.1         else
 118 vivien   1.1.2.1             join_conservative(odi2);
 119 vivien   1.1.2.1    }
 120 vivien   1.1.2.1 
 121 vivien   1.1.2.1     private void join_precise(ODInformation odi2)
 122 vivien   1.1.2.1     {
 123 vivien   1.1.2.1         Map hole_conversion  = new LightMap();
 124 vivien   1.1.2.1         hole_conversion.put(ODPointerAnalysis.BottomHole,ODPointerAnalysis.BottomHole);
 125 vivien   1.1.2.1         Set skippedCS_org = new HashSet(skippedCS);
 126 vivien   1.1.2.1         Set projected_skippedCS2 = new HashSet();
 127 vivien   1.1.2.1 
 128 cananian 1.5             for(Object h2O : odi2.skippedCS){
 129 cananian 1.5                 MethodHole h2 = (MethodHole) h2O;
 130 vivien   1.1.2.1             // If this MethodHole is also a MethodHole of the first
 131 vivien   1.1.2.1             // ODInformation, we keep it like that.
 132 vivien   1.1.2.1             if(skippedCS.contains(h2)){
 133 vivien   1.1.2.1                 hole_conversion.put(h2,h2);
 134 vivien   1.1.2.1                 projected_skippedCS2.add(h2);
 135 vivien   1.1.2.1                 continue;
 136 vivien   1.1.2.1             }
 137 vivien   1.1.2.1             // If this MethodHole is a MethodHole of the first
 138 vivien   1.1.2.1             // ODInformation, under another copy, we tranpose it to
 139 vivien   1.1.2.1             // that copy.
 140 vivien   1.1.2.1             MethodHole h2_bis = h2.IsInAs(skippedCS);
 141 vivien   1.1.2.1             if (h2_bis!=null){
 142 vivien   1.1.2.1                 hole_conversion.put(h2, h2_bis);
 143 vivien   1.1.2.1                 projected_skippedCS2.add(h2_bis);
 144 vivien   1.1.2.1             }
 145 vivien   1.1.2.1             else {
 146 vivien   1.1.2.1                 // This hole is unknown so far, we keep it.
 147 vivien   1.1.2.1                 hole_conversion.put(h2, h2);
 148 vivien   1.1.2.1                 skippedCS.add(h2);
 149 vivien   1.1.2.1                 projected_skippedCS2.add(h2);
 150 vivien   1.1.2.1             }
 151 vivien   1.1.2.1             // Note: this scheme suppose no redundance in each of the
 152 vivien   1.1.2.1             // two set of skipped call sites, but possible redundance
 153 vivien   1.1.2.1             // between them.
 154 vivien   1.1.2.1         }
 155 vivien   1.1.2.1         
 156 vivien   1.1.2.1         inAlways.join (odi2.inAlways,  hole_conversion, 
 157 vivien   1.1.2.1                        skippedCS_org, projected_skippedCS2,
 158 vivien   1.1.2.1                        skippedCS);
 159 vivien   1.1.2.1         outAlways.join(odi2.outAlways, hole_conversion, 
 160 vivien   1.1.2.1                        skippedCS_org, projected_skippedCS2,
 161 vivien   1.1.2.1                        skippedCS);
 162 vivien   1.1.2.1         outMaybe.join (odi2.outMaybe,  hole_conversion, 
 163 vivien   1.1.2.1                        skippedCS_org, projected_skippedCS2,
 164 vivien   1.1.2.1                        skippedCS);
 165 vivien   1.1.2.1 
 166 vivien   1.1.2.1         joinHistories(odi2, hole_conversion);
 167 vivien   1.1.2.1         joinLocks(odi2, hole_conversion);
 168 vivien   1.1.2.1     }
 169 vivien   1.1.2.1 
 170 vivien   1.1.2.1 
 171 vivien   1.1.2.1     private void join_conservative(ODInformation odi2)
 172 vivien   1.1.2.1     {
 173 cananian 1.5             for(Object h2O : odi2.skippedCS){
 174 cananian 1.5                 MethodHole h2 = (MethodHole) h2O;
 175 vivien   1.1.2.1             // If this MethodHole is also a MethodHole of the first
 176 vivien   1.1.2.1             // ODInformation, nothing to do.
 177 vivien   1.1.2.1             if(skippedCS.contains(h2)){
 178 vivien   1.1.2.1                 continue;
 179 vivien   1.1.2.1             }
 180 vivien   1.1.2.1             // If this MethodHole is a MethodHole of the first
 181 vivien   1.1.2.1             // ODInformation, under another copy, nothing to do.
 182 vivien   1.1.2.1             MethodHole h2_bis = h2.IsInAs(skippedCS);
 183 vivien   1.1.2.1             if (h2_bis!=null){
 184 vivien   1.1.2.1                 continue;
 185 vivien   1.1.2.1             }
 186 vivien   1.1.2.1             // This hole is unknown so far, we keep it.
 187 vivien   1.1.2.1             skippedCS.add(h2);
 188 vivien   1.1.2.1             // Note: this scheme suppose no redundance in each of the
 189 vivien   1.1.2.1             // two set of skipped call sites, but possible redundance
 190 vivien   1.1.2.1             // between them.
 191 vivien   1.1.2.1         }
 192 vivien   1.1.2.1 
 193 vivien   1.1.2.1         lock_set.addAll(odi2.lock_set);
 194 vivien   1.1.2.1     }
 195 vivien   1.1.2.1 
 196 vivien   1.1.2.1 
 197 vivien   1.1.2.1     private void joinHistories(ODInformation odi, Map conversion)
 198 vivien   1.1.2.1     {
 199 vivien   1.1.2.1         LightRelation new_hist = new LightRelation();
 200 vivien   1.1.2.1         Relation org_hist = odi.skippedCSHistory;
 201 vivien   1.1.2.1         
 202 cananian 1.5             for(Object org_firstO : org_hist.keys()){
 203 cananian 1.5                 MethodHole org_first = (MethodHole) org_firstO;
 204 vivien   1.1.2.1             MethodHole new_first = (MethodHole) conversion.get(org_first);
 205 vivien   1.1.2.1             if (new_first==null){
 206 vivien   1.1.2.1                 System.err.println("joinHistories: No conversion for " 
 207 vivien   1.1.2.1                                    + org_first);
 208 vivien   1.1.2.1                 System.out.println("joinHistories: No conversion for " 
 209 vivien   1.1.2.1                                    + org_first + "\n in "
 210 vivien   1.1.2.1                                    + conversion +
 211 vivien   1.1.2.1                                    "\n for " + org_hist);
 212 vivien   1.1.2.1                 System.exit(1);
 213 vivien   1.1.2.1             }
 214 vivien   1.1.2.1             else{
 215 cananian 1.5                     for(Object org_secondO : org_hist.getValues(org_first))
 216 vivien   1.1.2.1                     {
 217 cananian 1.5                             MethodHole org_second = (MethodHole) org_secondO;
 218 vivien   1.1.2.1                         MethodHole new_second = (MethodHole) conversion.get(org_second);
 219 vivien   1.1.2.1                         if (new_second==null){
 220 vivien   1.1.2.1                             System.err.println("joinHistories (2): No conversion for " 
 221 vivien   1.1.2.1                                                + org_second);
 222 vivien   1.1.2.1                             System.out.println("joinHistories (2): No conversion for " 
 223 vivien   1.1.2.1                                                + org_second + "\n in "
 224 vivien   1.1.2.1                                                + conversion + 
 225 vivien   1.1.2.1                                                "\n for " + org_hist);
 226 vivien   1.1.2.1                             System.exit(1);
 227 vivien   1.1.2.1                         }
 228 vivien   1.1.2.1                         else{
 229 vivien   1.1.2.1                             new_hist.add(new_first,new_second);
 230 vivien   1.1.2.1                         }
 231 vivien   1.1.2.1                     }
 232 vivien   1.1.2.1             }
 233 vivien   1.1.2.1         }
 234 vivien   1.1.2.1         odi.skippedCSHistory = new_hist;
 235 vivien   1.1.2.1     }
 236 vivien   1.1.2.1 
 237 vivien   1.1.2.1     private void joinLocks(ODInformation odi, Map conversion)
 238 vivien   1.1.2.1     {
 239 vivien   1.1.2.1         LightRelation new_locks = new LightRelation();
 240 vivien   1.1.2.1         Relation org_locks = odi.locks; 
 241 vivien   1.1.2.1         
 242 cananian 1.5             for(Object syncO : org_locks.keys()){
 243 cananian 1.5                 PASync sync = (PASync) syncO;
 244 cananian 1.5                 for(Object org_mhO : org_locks.getValues(sync))
 245 vivien   1.1.2.1                 {
 246 cananian 1.5                         MethodHole org_mh = (MethodHole) org_mhO;
 247 vivien   1.1.2.1                     if (org_mh==null) {
 248 vivien   1.1.2.1                         System.err.println("Null MethodHole in joinLocks...");
 249 vivien   1.1.2.1                         System.out.println("Null MethodHole in joinLocks...");
 250 vivien   1.1.2.1                         continue;
 251 vivien   1.1.2.1                     }
 252 vivien   1.1.2.1                     MethodHole new_mh = (MethodHole) conversion.get(org_mh);
 253 vivien   1.1.2.1                     if (new_mh==null){
 254 vivien   1.1.2.1                         System.err.println("joinLocks: No conversion for " 
 255 vivien   1.1.2.1                                            + org_mh);
 256 vivien   1.1.2.1                         System.out.println("joinLocks: No conversion for " 
 257 vivien   1.1.2.1                                            + org_mh + " in "
 258 vivien   1.1.2.1                                            + conversion);
 259 vivien   1.1.2.1                     }
 260 vivien   1.1.2.1                     else{
 261 vivien   1.1.2.1                         new_locks.add(sync,new_mh);
 262 vivien   1.1.2.1                     }
 263 vivien   1.1.2.1                 }
 264 vivien   1.1.2.1         }
 265 vivien   1.1.2.1         odi.locks = new_locks;
 266 vivien   1.1.2.1     }
 267 vivien   1.1.2.1 
 268 vivien   1.1.2.1 
 269 vivien   1.1.2.1     public Object clone()
 270 vivien   1.1.2.1     {
 271 vivien   1.1.2.1         Set cs = new HashSet(skippedCS);
 272 vivien   1.1.2.1 
 273 vivien   1.1.2.1         if(this.precise){
 274 vivien   1.1.2.1             EdgesNCallees ia = (EdgesNCallees) inAlways. clone();
 275 vivien   1.1.2.1             EdgesNCallees oa = (EdgesNCallees) outAlways.clone();
 276 vivien   1.1.2.1             EdgesNCallees om = (EdgesNCallees) outMaybe. clone();
 277 vivien   1.1.2.1             
 278 vivien   1.1.2.1             Relation cs_hist   = (Relation) skippedCSHistory.clone();
 279 vivien   1.1.2.1             Relation the_locks = (Relation) locks.clone();
 280 vivien   1.1.2.1             
 281 vivien   1.1.2.1             return new ODInformation(this.precise, cs,
 282 vivien   1.1.2.1                                      ia, oa, om,
 283 vivien   1.1.2.1                                      cs_hist, the_locks, null);
 284 vivien   1.1.2.1         }
 285 vivien   1.1.2.1         else{
 286 vivien   1.1.2.1             return new ODInformation(this.precise, cs,
 287 vivien   1.1.2.1                                      null, null, null,
 288 vivien   1.1.2.1                                      null, null, (Set) ((HashSet) lock_set).clone());
 289 vivien   1.1.2.1         }
 290 vivien   1.1.2.1     }
 291 vivien   1.1.2.1     
 292 vivien   1.1.2.1 
 293 vivien   1.1.2.1 
 294 vivien   1.1.2.1     public Object clonebis()
 295 vivien   1.1.2.1     {
 296 vivien   1.1.2.1         LightMap hole_convert = new LightMap();
 297 vivien   1.1.2.1         Set cs = MethodHole.DuplicateSet(this.skippedCS, hole_convert);
 298 vivien   1.1.2.1 
 299 vivien   1.1.2.1         if(this.precise){
 300 vivien   1.1.2.1             EdgesNCallees ia = inAlways. clone(hole_convert);
 301 vivien   1.1.2.1             EdgesNCallees oa = outAlways.clone(hole_convert);
 302 vivien   1.1.2.1             EdgesNCallees om = outMaybe. clone(hole_convert);
 303 vivien   1.1.2.1             
 304 vivien   1.1.2.1             Relation cs_hist = MethodHole.DuplicateHistory(this.skippedCSHistory,
 305 vivien   1.1.2.1                                                            hole_convert);
 306 vivien   1.1.2.1         
 307 vivien   1.1.2.1             Relation the_locks = MethodHole.DuplicateLocks(this.locks, hole_convert);
 308 vivien   1.1.2.1             
 309 vivien   1.1.2.1             return new ODInformation(this.precise, cs,
 310 vivien   1.1.2.1                                      ia, oa, om,
 311 vivien   1.1.2.1                                      cs_hist, the_locks, null);
 312 vivien   1.1.2.1         }
 313 vivien   1.1.2.1         else{
 314 vivien   1.1.2.1             return new ODInformation(this.precise, cs,
 315 vivien   1.1.2.1                                      null, null, null,
 316 vivien   1.1.2.1                                      null, null, (Set) ((HashSet) lock_set).clone());
 317 vivien   1.1.2.1         }
 318 vivien   1.1.2.1     }
 319 vivien   1.1.2.1     
 320 vivien   1.1.2.1 
 321 vivien   1.1.2.1     public ODInformation specialize(Map nodeConversion)
 322 vivien   1.1.2.1     {
 323 vivien   1.1.2.1         LightMap hole_convert = new LightMap();
 324 vivien   1.1.2.1         Set cs = MethodHole.DuplicateSet(this.skippedCS, hole_convert, nodeConversion);
 325 vivien   1.1.2.1 
 326 vivien   1.1.2.1         if (this.precise){
 327 vivien   1.1.2.1             EdgesNCallees ia = inAlways. clone(hole_convert, nodeConversion);
 328 vivien   1.1.2.1             EdgesNCallees oa = outAlways.clone(hole_convert, nodeConversion);
 329 vivien   1.1.2.1             EdgesNCallees om = outMaybe. clone(hole_convert, nodeConversion);
 330 vivien   1.1.2.1 
 331 vivien   1.1.2.1             Relation cs_hist = MethodHole.DuplicateHistory(this.skippedCSHistory,
 332 vivien   1.1.2.1                                                            hole_convert);
 333 vivien   1.1.2.1         
 334 vivien   1.1.2.1             Relation the_locks = MethodHole.DuplicateLocks(this.locks, hole_convert);
 335 vivien   1.1.2.1 
 336 vivien   1.1.2.1             return new ODInformation(this.precise, cs,
 337 vivien   1.1.2.1                                      ia, oa, om,
 338 vivien   1.1.2.1                                      cs_hist, the_locks, null);
 339 vivien   1.1.2.1         }
 340 vivien   1.1.2.1         else{
 341 vivien   1.1.2.1             return new ODInformation(this.precise, cs,
 342 vivien   1.1.2.1                                      null, null, null,
 343 vivien   1.1.2.1                                      null, null, (Set) ((HashSet) lock_set).clone());
 344 vivien   1.1.2.1         }
 345 vivien   1.1.2.1     }
 346 vivien   1.1.2.1 
 347 vivien   1.1.2.1     /** Pretty-print debug function.
 348 vivien   1.1.2.1      */
 349 vivien   1.1.2.1     public String toString()
 350 vivien   1.1.2.1     {
 351 vivien   1.1.2.1         StringBuffer buffer = new StringBuffer();
 352 vivien   1.1.2.1         
 353 vivien   1.1.2.1         if (!DEBUG)
 354 vivien   1.1.2.1             return "";
 355 vivien   1.1.2.1 
 356 vivien   1.1.2.1         if (this==null) {
 357 vivien   1.1.2.1             return "";
 358 vivien   1.1.2.1         }
 359 vivien   1.1.2.1         else{
 360 vivien   1.1.2.1             buffer.append("Id = " + id);
 361 vivien   1.1.2.1             buffer.append("\n Skipped call sites \n" + skippedCS);
 362 vivien   1.1.2.1 
 363 vivien   1.1.2.1 //          buffer.append("\n Inside  edges   always  after callees " +  inAlways);
 364 vivien   1.1.2.1 //          buffer.append("\n Outside edges   always  after callees " + outAlways);
 365 vivien   1.1.2.1 //          buffer.append("\n Outside edges sometines after callees " + outMaybe);
 366 vivien   1.1.2.1 
 367 vivien   1.1.2.1 //          buffer.append("\n History of skipped call sites\n" + skippedCSHistory);
 368 vivien   1.1.2.1 //          buffer.append("\n Synchronizations and skipped call sites\n" + locks + lock_set);
 369 vivien   1.1.2.1 
 370 vivien   1.1.2.1             return buffer.toString();
 371 vivien   1.1.2.1         }
 372 vivien   1.1.2.1         
 373 vivien   1.1.2.1     }
 374 vivien   1.1.2.1 
 375 vivien   1.1.2.1 
 376 vivien   1.1.2.1     public void remove(MethodHole mh)
 377 vivien   1.1.2.1     {
 378 vivien   1.1.2.1         skippedCS.remove(mh);
 379 vivien   1.1.2.1 
 380 vivien   1.1.2.1         if (precise){
 381 vivien   1.1.2.1             inAlways. remove(mh);
 382 vivien   1.1.2.1             outAlways.remove(mh);
 383 vivien   1.1.2.1             outMaybe. remove(mh);
 384 vivien   1.1.2.1 
 385 vivien   1.1.2.1             // Removing mh from the skippedCSHistory field
 386 vivien   1.1.2.1             skippedCSHistory.removeKey(mh);
 387 vivien   1.1.2.1             for(Iterator it=skippedCSHistory.keys().iterator(); it.hasNext(); ){
 388 vivien   1.1.2.1                 skippedCSHistory.remove(it.next(), mh);
 389 vivien   1.1.2.1             }
 390 vivien   1.1.2.1 
 391 vivien   1.1.2.1             // Removing mh from the locks field...
 392 cananian 1.5                 for(Object syncroO : locks.keys()){
 393 cananian 1.5                     PASync syncro = (PASync) syncroO;
 394 vivien   1.1.2.1                 locks.remove(syncro, mh);
 395 vivien   1.1.2.1             }
 396 vivien   1.1.2.1         }
 397 vivien   1.1.2.1     }
 398 vivien   1.1.2.1 
 399 vivien   1.1.2.1     public Set predecessors(MethodHole mh)
 400 vivien   1.1.2.1     {
 401 vivien   1.1.2.1         if (!precise)
 402 vivien   1.1.2.1             return null;
 403 vivien   1.1.2.1         else
 404 vivien   1.1.2.1             return skippedCSHistory.getValues(mh);
 405 vivien   1.1.2.1     }
 406 vivien   1.1.2.1 
 407 vivien   1.1.2.1 
 408 vivien   1.1.2.1     public void addOutsideEdges(Set nodes1, String f, PANode n2)
 409 vivien   1.1.2.1     {
 410 vivien   1.1.2.1         if (!precise) return;
 411 vivien   1.1.2.1 
 412 vivien   1.1.2.1         outAlways.add(nodes1, f, n2, skippedCS);
 413 vivien   1.1.2.1         outMaybe. add(nodes1, f, n2, skippedCS);
 414 vivien   1.1.2.1     }
 415 vivien   1.1.2.1 
 416 vivien   1.1.2.1     public void addOutsideEdges(PANode n1, String f, PANode n2)
 417 vivien   1.1.2.1     {
 418 vivien   1.1.2.1         if (!precise) return;
 419 vivien   1.1.2.1 
 420 vivien   1.1.2.1         outAlways.add(n1, f, n2, skippedCS);
 421 vivien   1.1.2.1         outMaybe. add(n1, f, n2, skippedCS);
 422 vivien   1.1.2.1     }
 423 vivien   1.1.2.1 
 424 vivien   1.1.2.1 
 425 vivien   1.1.2.1 
 426 vivien   1.1.2.1     public void addOutsideEdges(PANode n1, String f, PANode n2,
 427 vivien   1.1.2.1                                 ODInformation reference,
 428 vivien   1.1.2.1                                 Set new_n1)
 429 vivien   1.1.2.1     {
 430 vivien   1.1.2.1         if (!reference.precise) return;
 431 vivien   1.1.2.1 
 432 vivien   1.1.2.1         Set always_holes = reference.outAlways.callees(n1, f, n2);
 433 vivien   1.1.2.1         outAlways.add(new_n1, f, n2, always_holes);
 434 vivien   1.1.2.1 
 435 vivien   1.1.2.1         Set maybe_holes  = reference.outMaybe.callees(n1, f, n2);
 436 vivien   1.1.2.1         outMaybe.add(new_n1, f, n2, maybe_holes);
 437 vivien   1.1.2.1     }
 438 vivien   1.1.2.1 
 439 vivien   1.1.2.1     public void addOutsideEdges(PANode n1, String f, PANode n2,
 440 vivien   1.1.2.1                                 ODInformation reference,
 441 vivien   1.1.2.1                                 Set new_n1, Set previous_holes)
 442 vivien   1.1.2.1     {
 443 vivien   1.1.2.1         if (!reference.precise) return;
 444 vivien   1.1.2.1 
 445 vivien   1.1.2.1         Set always_holes = reference.outAlways.callees(n1, f, n2);
 446 vivien   1.1.2.1         always_holes.addAll(previous_holes);
 447 vivien   1.1.2.1         outAlways.add(new_n1, f, n2, always_holes);
 448 vivien   1.1.2.1 
 449 vivien   1.1.2.1         Set maybe_holes  = reference.outMaybe.callees(n1, f, n2);
 450 vivien   1.1.2.1         maybe_holes.addAll(previous_holes);
 451 vivien   1.1.2.1         outMaybe.add(new_n1, f, n2, maybe_holes);
 452 vivien   1.1.2.1     }
 453 vivien   1.1.2.1 
 454 vivien   1.1.2.1 
 455 vivien   1.1.2.1     public void addInsideEdges(PANode n1, String f, PANode n2)
 456 vivien   1.1.2.1     {
 457 vivien   1.1.2.1         if (!precise) return;
 458 vivien   1.1.2.1         
 459 vivien   1.1.2.1         inAlways.add(n1, f, n2, skippedCS);
 460 vivien   1.1.2.1     }
 461 vivien   1.1.2.1 
 462 vivien   1.1.2.1 
 463 vivien   1.1.2.1     public void addInsideEdges(Set nodes1, String f, Set nodes2)
 464 vivien   1.1.2.1     {
 465 vivien   1.1.2.1         if (!precise) return;
 466 vivien   1.1.2.1         
 467 cananian 1.5             for(Object n1O : nodes1){
 468 cananian 1.5                 PANode n1 = (PANode) n1O;
 469 cananian 1.5                 for(Object n2O : nodes2){
 470 cananian 1.5                     PANode n2 = (PANode) n2O;
 471 vivien   1.1.2.1                 inAlways.add(n1, f, n2, skippedCS);
 472 vivien   1.1.2.1             }
 473 vivien   1.1.2.1         }
 474 vivien   1.1.2.1     }
 475 vivien   1.1.2.1 
 476 vivien   1.1.2.1 
 477 vivien   1.1.2.1 
 478 vivien   1.1.2.1     public void addInsideEdges(PANode n1, String f, PANode n2,
 479 vivien   1.1.2.1                                ODInformation reference,
 480 vivien   1.1.2.1                                Set new_n1, Set new_n2)
 481 vivien   1.1.2.1     {
 482 vivien   1.1.2.1         if (!precise) return;
 483 vivien   1.1.2.1 
 484 vivien   1.1.2.1         Set always_holes = reference.inAlways.callees(n1, f, n2);
 485 vivien   1.1.2.1         inAlways.add(new_n1, f, new_n2, always_holes);
 486 vivien   1.1.2.1     }
 487 vivien   1.1.2.1 
 488 vivien   1.1.2.1     public void addInsideEdges(PANode n1, String f, PANode n2,
 489 vivien   1.1.2.1                                ODInformation reference,
 490 vivien   1.1.2.1                                Set new_n1, Set new_n2,
 491 vivien   1.1.2.1                                Set previous_holes)
 492 vivien   1.1.2.1     {
 493 vivien   1.1.2.1         if (!precise) return;
 494 vivien   1.1.2.1 
 495 vivien   1.1.2.1         Set always_holes = reference.inAlways.callees(n1, f, n2);
 496 vivien   1.1.2.1         always_holes.addAll(previous_holes);
 497 vivien   1.1.2.1         inAlways.add(new_n1, f, new_n2, always_holes);
 498 vivien   1.1.2.1     }
 499 vivien   1.1.2.1 
 500 vivien   1.1.2.1 
 501 vivien   1.1.2.1     public void addLock(PASync sync)
 502 vivien   1.1.2.1     {
 503 vivien   1.1.2.1         if (precise) 
 504 vivien   1.1.2.1             locks.addAll(sync, skippedCS);
 505 vivien   1.1.2.1         else
 506 vivien   1.1.2.1             lock_set.add(sync);
 507 vivien   1.1.2.1     }
 508 vivien   1.1.2.1 
 509 vivien   1.1.2.1 
 510 vivien   1.1.2.1     public void addHole(MethodHole hole)
 511 vivien   1.1.2.1     {
 512 vivien   1.1.2.1         if (precise){
 513 vivien   1.1.2.1             skippedCSHistory.addAll(hole, skippedCS);
 514 vivien   1.1.2.1             skippedCS.add(hole);
 515 vivien   1.1.2.1         }
 516 vivien   1.1.2.1         else
 517 vivien   1.1.2.1             if(hole.IsInAs(skippedCS)==null)
 518 vivien   1.1.2.1                 skippedCS.add(hole);
 519 vivien   1.1.2.1     }
 520 vivien   1.1.2.1 
 521 vivien   1.1.2.1 
 522 vivien   1.1.2.1 
 523 vivien   1.1.2.1     public Set update(ODInformation new_odi,
 524 vivien   1.1.2.1                       ODParIntGraph pig_caller, 
 525 vivien   1.1.2.1                       ODParIntGraph pig_callee, 
 526 vivien   1.1.2.1                       Relation first_mapping,
 527 vivien   1.1.2.1                       Relation second_mapping_extended,
 528 vivien   1.1.2.1                       MethodHole hole,
 529 vivien   1.1.2.1                       ODInformation first_part,
 530 vivien   1.1.2.1                       ODInformation second_part,
 531 vivien   1.1.2.1                       Set toberemoved)
 532 vivien   1.1.2.1     {
 533 vivien   1.1.2.1 //      ODInformation new_odi = new ODInformation(precise);
 534 vivien   1.1.2.1 
 535 vivien   1.1.2.1 
 536 vivien   1.1.2.1         // ************************
 537 vivien   1.1.2.1         // Updating method holes
 538 vivien   1.1.2.1         // ************************
 539 vivien   1.1.2.1 
 540 vivien   1.1.2.1         // Initialization needed for the conversion of the method holes
 541 vivien   1.1.2.1         MethodHole.reset(pig_caller.odi.skippedCS,pig_callee.odi.skippedCS);
 542 vivien   1.1.2.1             
 543 vivien   1.1.2.1         // Transposing the callee method_holes set
 544 vivien   1.1.2.1         MethodHole [] mh_converter = 
 545 vivien   1.1.2.1             new MethodHole[skippedCS.size()+pig_callee.odi.skippedCS.size()+1];
 546 vivien   1.1.2.1         int mapsize = 0;
 547 vivien   1.1.2.1         HashSet mh_from_callee_new = new HashSet();
 548 vivien   1.1.2.1 
 549 vivien   1.1.2.1         Set mh_from_callee_org = pig_callee.odi.skippedCS;
 550 vivien   1.1.2.1             
 551 vivien   1.1.2.1         mapsize = project_method_holes(first_mapping,
 552 vivien   1.1.2.1                                        mh_from_callee_org,
 553 vivien   1.1.2.1                                        mh_converter,
 554 vivien   1.1.2.1                                        mapsize,
 555 vivien   1.1.2.1                                        hole,
 556 vivien   1.1.2.1                                        mh_from_callee_new);
 557 vivien   1.1.2.1 
 558 vivien   1.1.2.1 
 559 vivien   1.1.2.1 
 560 vivien   1.1.2.1         if(hole!=null){
 561 vivien   1.1.2.1             // Transposing the caller method_holes set
 562 vivien   1.1.2.1             skippedCS.remove(hole);
 563 vivien   1.1.2.1             
 564 vivien   1.1.2.1             mapsize = project_method_holes(second_mapping_extended,
 565 vivien   1.1.2.1                                            skippedCS,
 566 vivien   1.1.2.1                                            mh_converter,
 567 vivien   1.1.2.1                                            mapsize,
 568 vivien   1.1.2.1                                            new_odi);
 569 vivien   1.1.2.1         }
 570 vivien   1.1.2.1 
 571 vivien   1.1.2.1         // Computation of the new method_holes set
 572 vivien   1.1.2.1         new_odi.skippedCS.addAll(mh_from_callee_new);
 573 vivien   1.1.2.1 
 574 vivien   1.1.2.1 
 575 vivien   1.1.2.1         if(!precise) {
 576 vivien   1.1.2.1             return lock_set;
 577 vivien   1.1.2.1         }
 578 vivien   1.1.2.1 
 579 vivien   1.1.2.1 
 580 vivien   1.1.2.1         // Update history of skipped call sites
 581 vivien   1.1.2.1         update_skippedCSHistory(skippedCSHistory,
 582 vivien   1.1.2.1                                 mh_converter,
 583 vivien   1.1.2.1                                 mapsize,
 584 vivien   1.1.2.1                                 hole,
 585 vivien   1.1.2.1                                 mh_from_callee_new,
 586 vivien   1.1.2.1                                 new_odi,
 587 vivien   1.1.2.1                                 pig_callee.odi.skippedCSHistory);
 588 vivien   1.1.2.1 
 589 vivien   1.1.2.1 
 590 vivien   1.1.2.1 
 591 vivien   1.1.2.1         
 592 vivien   1.1.2.1         // ************************
 593 vivien   1.1.2.1         // Updating in_edge_always
 594 vivien   1.1.2.1         // ************************
 595 vivien   1.1.2.1 
 596 vivien   1.1.2.1 //      System.out.println("Original inAlways " + inAlways);
 597 vivien   1.1.2.1 //      System.out.println("Original first_part inAlways " + first_part.inAlways);
 598 vivien   1.1.2.1 //      System.out.println("Original second_part inAlways " + second_part.inAlways);
 599 vivien   1.1.2.1 //      System.out.println("to be removed " + toberemoved);
 600 vivien   1.1.2.1         
 601 vivien   1.1.2.1 
 602 vivien   1.1.2.1         // Update the caller field (if necessary).
 603 vivien   1.1.2.1         if (hole!=null){
 604 vivien   1.1.2.1             update(new_odi.inAlways, inAlways,
 605 vivien   1.1.2.1                    mh_converter, mapsize,
 606 vivien   1.1.2.1                    mh_from_callee_new,
 607 vivien   1.1.2.1                    hole,
 608 vivien   1.1.2.1                    toberemoved);
 609 vivien   1.1.2.1         }
 610 vivien   1.1.2.1         else
 611 vivien   1.1.2.1             new_odi.inAlways = (EdgesNCallees) inAlways.clone();
 612 vivien   1.1.2.1 
 613 vivien   1.1.2.1         // Update and include the edges created by the
 614 vivien   1.1.2.1         // ``classical'' part of the map-up.
 615 vivien   1.1.2.1         update(new_odi.inAlways, first_part.inAlways,
 616 vivien   1.1.2.1                mh_converter, mapsize,
 617 vivien   1.1.2.1                mh_from_callee_new,
 618 vivien   1.1.2.1                hole,
 619 vivien   1.1.2.1                toberemoved);
 620 vivien   1.1.2.1         
 621 vivien   1.1.2.1         // Update and include the edges created by the second part
 622 vivien   1.1.2.1         // of the map-up.
 623 vivien   1.1.2.1         if (hole!=null){
 624 vivien   1.1.2.1             update_and_add(new_odi.inAlways,
 625 vivien   1.1.2.1                            second_part.inAlways,
 626 vivien   1.1.2.1                            mh_converter,
 627 vivien   1.1.2.1                            hole,
 628 vivien   1.1.2.1                            toberemoved);
 629 vivien   1.1.2.1         }
 630 vivien   1.1.2.1 
 631 vivien   1.1.2.1 
 632 vivien   1.1.2.1         
 633 vivien   1.1.2.1         // ************************
 634 vivien   1.1.2.1         // Updating out_edge_always
 635 vivien   1.1.2.1         // ************************
 636 vivien   1.1.2.1         // Update the caller field (if necessary).
 637 vivien   1.1.2.1 
 638 vivien   1.1.2.1         if (hole!=null){
 639 vivien   1.1.2.1             update(new_odi.outAlways, outAlways,
 640 vivien   1.1.2.1                    mh_converter, mapsize,
 641 vivien   1.1.2.1                    mh_from_callee_new,
 642 vivien   1.1.2.1                    hole,
 643 vivien   1.1.2.1                    toberemoved);
 644 vivien   1.1.2.1         }
 645 vivien   1.1.2.1         else
 646 vivien   1.1.2.1             new_odi.outAlways = (EdgesNCallees) outAlways.clone();
 647 vivien   1.1.2.1                 
 648 vivien   1.1.2.1         // Update and include the edges created by the
 649 vivien   1.1.2.1         // ``classical'' part of the map-up.
 650 vivien   1.1.2.1         update(new_odi.outAlways,  first_part.outAlways,
 651 vivien   1.1.2.1                mh_converter, mapsize,
 652 vivien   1.1.2.1                mh_from_callee_new,
 653 vivien   1.1.2.1                hole,
 654 vivien   1.1.2.1                toberemoved);
 655 vivien   1.1.2.1 
 656 vivien   1.1.2.1         // Update and include the edges created by the second part
 657 vivien   1.1.2.1         // of the map-up.
 658 vivien   1.1.2.1         if (hole!=null){
 659 vivien   1.1.2.1             update_and_add(new_odi.outAlways,
 660 vivien   1.1.2.1                            second_part.outAlways,
 661 vivien   1.1.2.1                            mh_converter,
 662 vivien   1.1.2.1                            hole,
 663 vivien   1.1.2.1                            toberemoved);
 664 vivien   1.1.2.1         }
 665 vivien   1.1.2.1 
 666 vivien   1.1.2.1 
 667 vivien   1.1.2.1 
 668 vivien   1.1.2.1         // ************************
 669 vivien   1.1.2.1         // Updating out_edge_maybe
 670 vivien   1.1.2.1         // ************************
 671 vivien   1.1.2.1         // Update the caller field (if necessary).
 672 vivien   1.1.2.1         if (hole!=null){
 673 vivien   1.1.2.1             update(new_odi.outMaybe,   outMaybe,
 674 vivien   1.1.2.1                    mh_converter, mapsize,
 675 vivien   1.1.2.1                    mh_from_callee_new,
 676 vivien   1.1.2.1                    hole,
 677 vivien   1.1.2.1                    toberemoved);
 678 vivien   1.1.2.1         }
 679 vivien   1.1.2.1         else
 680 vivien   1.1.2.1             new_odi.outMaybe = (EdgesNCallees) outMaybe.clone();
 681 vivien   1.1.2.1                 
 682 vivien   1.1.2.1         // Update and include the edges created by the ``classical''
 683 vivien   1.1.2.1         // part of the map-up.
 684 vivien   1.1.2.1         update(new_odi.outMaybe,   first_part.outMaybe,
 685 vivien   1.1.2.1                mh_converter, mapsize,
 686 vivien   1.1.2.1                mh_from_callee_new,
 687 vivien   1.1.2.1                hole,
 688 vivien   1.1.2.1                toberemoved);
 689 vivien   1.1.2.1 
 690 vivien   1.1.2.1         // Update and include the edges created by the second part
 691 vivien   1.1.2.1         // of the map-up.
 692 vivien   1.1.2.1         if (hole!=null){
 693 vivien   1.1.2.1             update_and_add(new_odi.outMaybe,
 694 vivien   1.1.2.1                            second_part.outMaybe,
 695 vivien   1.1.2.1                            mh_converter,
 696 vivien   1.1.2.1                            hole,
 697 vivien   1.1.2.1                            toberemoved);
 698 vivien   1.1.2.1         }
 699 vivien   1.1.2.1 
 700 vivien   1.1.2.1 
 701 vivien   1.1.2.1         // ************************
 702 vivien   1.1.2.1         // Updating locks
 703 vivien   1.1.2.1         // ************************
 704 vivien   1.1.2.1            
 705 vivien   1.1.2.1         Set par_locks = null;
 706 vivien   1.1.2.1         par_locks = update_locks(this,
 707 vivien   1.1.2.1                                  new_odi,
 708 vivien   1.1.2.1                                  pig_callee.odi,
 709 vivien   1.1.2.1                                  first_mapping,
 710 vivien   1.1.2.1                                  second_mapping_extended,
 711 vivien   1.1.2.1                                  mh_converter,
 712 vivien   1.1.2.1                                  hole,
 713 vivien   1.1.2.1                                  mh_from_callee_new);
 714 vivien   1.1.2.1 
 715 vivien   1.1.2.1         return par_locks;
 716 vivien   1.1.2.1     }
 717 vivien   1.1.2.1 
 718 vivien   1.1.2.1     private int project_method_holes(Relation mu, Set holes,
 719 vivien   1.1.2.1                                      MethodHole [] map,
 720 vivien   1.1.2.1                                      int mapsize,
 721 vivien   1.1.2.1                                      ODInformation new_odi)
 722 vivien   1.1.2.1     {
 723 vivien   1.1.2.1         MethodHole new_mh;
 724 vivien   1.1.2.1 
 725 cananian 1.5             for(Object mhO : holes){
 726 cananian 1.5                 MethodHole mh = (MethodHole) mhO;
 727 vivien   1.1.2.1             int mh_id = mh.IsInAs(map, mapsize);
 728 vivien   1.1.2.1             if (mh_id<0){
 729 vivien   1.1.2.1                 new_mh=projection(mu,mh);
 730 vivien   1.1.2.1                 new_odi.skippedCS.add(new_mh);
 731 vivien   1.1.2.1                 map[mapsize] = new_mh;
 732 vivien   1.1.2.1                 mh.setId(mapsize);
 733 vivien   1.1.2.1                 mapsize++;
 734 vivien   1.1.2.1             }
 735 vivien   1.1.2.1             else{
 736 vivien   1.1.2.1                 mh.setId(mh_id);
 737 vivien   1.1.2.1             }
 738 vivien   1.1.2.1         }
 739 vivien   1.1.2.1         return mapsize;
 740 vivien   1.1.2.1     } 
 741 vivien   1.1.2.1 
 742 vivien   1.1.2.1     
 743 vivien   1.1.2.1     private int project_method_holes(Relation mu, 
 744 vivien   1.1.2.1                                      Set holes,
 745 vivien   1.1.2.1                                      MethodHole [] map,
 746 vivien   1.1.2.1                                      int mapsize,
 747 vivien   1.1.2.1                                      MethodHole hole,
 748 vivien   1.1.2.1                                      Set transposed_holes)
 749 vivien   1.1.2.1     {
 750 vivien   1.1.2.1         MethodHole new_mh = null;
 751 vivien   1.1.2.1         int depth = 0;
 752 vivien   1.1.2.1         if (hole!=null)
 753 vivien   1.1.2.1             depth = hole.depth();
 754 vivien   1.1.2.1         
 755 vivien   1.1.2.1         int bottomid = ODPointerAnalysis.BottomHole.IsInAs(map, mapsize);
 756 vivien   1.1.2.1         if (bottomid<0){
 757 vivien   1.1.2.1             map[mapsize] = ODPointerAnalysis.BottomHole;
 758 vivien   1.1.2.1             ODPointerAnalysis.BottomHole.setId(mapsize);
 759 vivien   1.1.2.1             mapsize++;
 760 vivien   1.1.2.1         }
 761 vivien   1.1.2.1 
 762 cananian 1.5             for(Object mh1O : holes){
 763 cananian 1.5                 MethodHole mh1 = (MethodHole) mh1O;
 764 vivien   1.1.2.1             int id = mh1.IsInAs(map, mapsize);
 765 vivien   1.1.2.1             if (id<0){
 766 vivien   1.1.2.1                 new_mh=projection(mu,mh1,depth,hole.callsitehistory());
 767 vivien   1.1.2.1                 map[mapsize] = new_mh;
 768 vivien   1.1.2.1                 mh1.setId(mapsize);
 769 vivien   1.1.2.1                 mapsize++;
 770 vivien   1.1.2.1                 transposed_holes.add(new_mh);
 771 vivien   1.1.2.1             }
 772 vivien   1.1.2.1             else {
 773 vivien   1.1.2.1                 mh1.setId(id);
 774 vivien   1.1.2.1             }
 775 vivien   1.1.2.1         }
 776 vivien   1.1.2.1         return mapsize;
 777 vivien   1.1.2.1     } 
 778 vivien   1.1.2.1 
 779 vivien   1.1.2.1 
 780 vivien   1.1.2.1     private static MethodHole projection(Relation mu, MethodHole org)
 781 vivien   1.1.2.1     {
 782 vivien   1.1.2.1         return projection(mu,org,0,null);
 783 vivien   1.1.2.1     }
 784 vivien   1.1.2.1 
 785 vivien   1.1.2.1     private static MethodHole projection(Relation mu, MethodHole org,
 786 vivien   1.1.2.1                                          int depth, LinkedList history)
 787 vivien   1.1.2.1     {
 788 vivien   1.1.2.1         Set [] org_params = org.ungroupedparameters();
 789 vivien   1.1.2.1         Set [] new_params = new Set[org_params.length];
 790 vivien   1.1.2.1         for(int i = 0; i< org_params.length; i++){
 791 vivien   1.1.2.1             new_params[i] = new HashSet();
 792 cananian 1.5                 for(Object nO : org_params[i]){
 793 cananian 1.5                     PANode n = (PANode) nO;
 794 vivien   1.1.2.1                 Set nodes = mu.getValues(n);
 795 vivien   1.1.2.1                 new_params[i].addAll(nodes);
 796 vivien   1.1.2.1             }
 797 vivien   1.1.2.1         }
 798 vivien   1.1.2.1         
 799 vivien   1.1.2.1         MethodHole projected = new MethodHole(org, new_params,
 800 vivien   1.1.2.1                                               depth,
 801 vivien   1.1.2.1                                               history);
 802 vivien   1.1.2.1         return projected;
 803 vivien   1.1.2.1     }
 804 vivien   1.1.2.1 
 805 vivien   1.1.2.1 
 806 vivien   1.1.2.1     public void update_skippedCSHistory(Relation caller_hist,
 807 vivien   1.1.2.1                                         MethodHole[] map,
 808 vivien   1.1.2.1                                         int mapsize,
 809 vivien   1.1.2.1                                         MethodHole hole,
 810 vivien   1.1.2.1                                         Set hole_corresp,
 811 vivien   1.1.2.1                                         ODInformation new_odi,
 812 vivien   1.1.2.1                                         Relation callee_hist)
 813 vivien   1.1.2.1     {
 814 vivien   1.1.2.1         if(hole==null)
 815 vivien   1.1.2.1             new_odi.skippedCSHistory = (Relation) caller_hist.clone();
 816 vivien   1.1.2.1         else{
 817 cananian 1.5                 for(Object mhO : caller_hist.keys()){
 818 cananian 1.5                     MethodHole mh = (MethodHole) mhO;
 819 vivien   1.1.2.1 
 820 vivien   1.1.2.1                 if (mh!=hole) {
 821 vivien   1.1.2.1                     HashSet holes = new HashSet();
 822 cananian 1.5                         for(Object mh_2O : caller_hist.getValues(mh)){
 823 cananian 1.5                             MethodHole mh_2 = (MethodHole) mh_2O;
 824 vivien   1.1.2.1 
 825 vivien   1.1.2.1                         if (mh_2!=hole) {
 826 vivien   1.1.2.1                             holes.add(map[mh_2.Id()]);
 827 vivien   1.1.2.1                         }
 828 vivien   1.1.2.1                         else{
 829 vivien   1.1.2.1                             holes.addAll(hole_corresp);
 830 vivien   1.1.2.1                         }
 831 vivien   1.1.2.1                     }
 832 vivien   1.1.2.1                     
 833 vivien   1.1.2.1                     new_odi.skippedCSHistory.addAll(map[mh.Id()],holes);
 834 vivien   1.1.2.1                 }
 835 vivien   1.1.2.1                 else {
 836 vivien   1.1.2.1                     HashSet holes = new HashSet();
 837 cananian 1.5                         for(Object mh_2O : caller_hist.getValues(mh)){
 838 cananian 1.5                             MethodHole mh_2 = (MethodHole) mh_2O;
 839 vivien   1.1.2.1                         
 840 vivien   1.1.2.1                         if (mh_2!=hole) 
 841 vivien   1.1.2.1                             holes.add(map[mh_2.Id()]);
 842 vivien   1.1.2.1                         else{
 843 vivien   1.1.2.1                             System.err.println("Error in some hole history ");
 844 vivien   1.1.2.1                             System.err.println("a hole precedes itself!");
 845 vivien   1.1.2.1                             System.out.println("Error in some hole history ");
 846 vivien   1.1.2.1                             System.out.println("a hole precedes itself!");
 847 vivien   1.1.2.1                             System.out.println("hole: " + hole);
 848 vivien   1.1.2.1                             System.out.println("history: " + caller_hist);
 849 vivien   1.1.2.1                         }
 850 vivien   1.1.2.1                     }
 851 vivien   1.1.2.1                     for(Iterator hole_it=hole_corresp.iterator(); hole_it.hasNext(); )
 852 vivien   1.1.2.1                         new_odi.skippedCSHistory.addAll(hole_it.next(),
 853 vivien   1.1.2.1                                                         holes);
 854 vivien   1.1.2.1                 }
 855 vivien   1.1.2.1             }
 856 vivien   1.1.2.1         }
 857 vivien   1.1.2.1         
 858 cananian 1.5             for(Object mhO : callee_hist.keys()){
 859 cananian 1.5                 MethodHole mh = (MethodHole) mhO;
 860 vivien   1.1.2.1             HashSet holes = new HashSet();
 861 vivien   1.1.2.1 
 862 cananian 1.5                 for(Object mh_2O : callee_hist.getValues(mh)){
 863 cananian 1.5                     MethodHole mh_2 = (MethodHole) mh_2O;
 864 vivien   1.1.2.1                 holes.add(map[mh_2.Id()]);
 865 vivien   1.1.2.1             }
 866 vivien   1.1.2.1             new_odi.skippedCSHistory.addAll(map[mh.Id()], holes);
 867 vivien   1.1.2.1         }
 868 vivien   1.1.2.1     }
 869 vivien   1.1.2.1 
 870 vivien   1.1.2.1 
 871 vivien   1.1.2.1     public void update_skippedCSHistorybis(Relation caller_hist,
 872 vivien   1.1.2.1                                         MethodHole[] map,
 873 vivien   1.1.2.1                                         int mapsize,
 874 vivien   1.1.2.1                                         MethodHole hole,
 875 vivien   1.1.2.1                                         Set hole_corresp,
 876 vivien   1.1.2.1                                         ODInformation new_odi,
 877 vivien   1.1.2.1                                         Relation callee_hist)
 878 vivien   1.1.2.1     {
 879 vivien   1.1.2.1         int id1 = -1, id2 = -1;
 880 vivien   1.1.2.1         MethodHole new_mh = null, new_mh_2 = null;
 881 vivien   1.1.2.1         
 882 vivien   1.1.2.1         if(hole==null)
 883 vivien   1.1.2.1             new_odi.skippedCSHistory = (Relation) caller_hist.clone();
 884 vivien   1.1.2.1         else{
 885 cananian 1.5                 for(Object mhO : caller_hist.keys()){
 886 cananian 1.5                     MethodHole mh = (MethodHole) mhO;
 887 vivien   1.1.2.1 
 888 vivien   1.1.2.1                 if (mh!=hole) {
 889 vivien   1.1.2.1                     id1 = mh.Id(); 
 890 vivien   1.1.2.1                     if (id1<0){
 891 vivien   1.1.2.1                         System.err.println("Error in update (1), no available " 
 892 vivien   1.1.2.1                                            + "conversion for method hole");
 893 vivien   1.1.2.1                         System.out.println("Error in update (1), no available " 
 894 vivien   1.1.2.1                                            + "conversion for method hole");
 895 vivien   1.1.2.1                         System.out.println(mh);
 896 vivien   1.1.2.1                         System.out.println(" in " + map);
 897 vivien   1.1.2.1                     }
 898 vivien   1.1.2.1                     new_mh = map[id1];
 899 cananian 1.5                         for(Object mh_2O : caller_hist.getValues(mh)){
 900 cananian 1.5                             MethodHole mh_2 = (MethodHole) mh_2O;
 901 vivien   1.1.2.1 
 902 vivien   1.1.2.1                         if (mh_2!=hole) {
 903 vivien   1.1.2.1                             id2 = mh_2.Id();
 904 vivien   1.1.2.1                             if (id2<0){
 905 vivien   1.1.2.1                                 System.err.println("Error in update (2), no available " 
 906 vivien   1.1.2.1                                                    + "conversion for method hole");
 907 vivien   1.1.2.1                                 System.out.println("Error in update (2), no available " 
 908 vivien   1.1.2.1                                                    + "conversion for method hole");
 909 vivien   1.1.2.1                                 System.out.println(mh_2 + " in " + map);
 910 vivien   1.1.2.1                             }
 911 vivien   1.1.2.1                             
 912 vivien   1.1.2.1                             new_odi.skippedCSHistory.add(new_mh, 
 913 vivien   1.1.2.1                                                          map[id2]);
 914 vivien   1.1.2.1                         }
 915 vivien   1.1.2.1                         else{
 916 vivien   1.1.2.1                             new_odi.skippedCSHistory.addAll(new_mh,hole_corresp);
 917 vivien   1.1.2.1                         }
 918 vivien   1.1.2.1                     }
 919 vivien   1.1.2.1                 }
 920 vivien   1.1.2.1                 else {
 921 cananian 1.5                         for(Object mh_2O : caller_hist.getValues(mh)){
 922 cananian 1.5                             MethodHole mh_2 = (MethodHole) mh_2O;
 923 vivien   1.1.2.1                         
 924 vivien   1.1.2.1                         if (mh_2!=hole) {
 925 vivien   1.1.2.1                             id2 = mh_2.Id();
 926 vivien   1.1.2.1                             if (id2<0){
 927 vivien   1.1.2.1                                 System.err.println("Error in update (3), no available " 
 928 vivien   1.1.2.1                                                    + "conversion for method hole");
 929 vivien   1.1.2.1                                 System.out.println("Error in update (3), no available " 
 930 vivien   1.1.2.1                                                    + "conversion for method hole");
 931 vivien   1.1.2.1                                 System.out.println(mh_2 + " in " + map);
 932 vivien   1.1.2.1                             }
 933 vivien   1.1.2.1                             new_mh_2 = map[mh_2.Id()];
 934 vivien   1.1.2.1                             for(Iterator hole_it=hole_corresp.iterator(); 
 935 vivien   1.1.2.1                                 hole_it.hasNext(); )
 936 vivien   1.1.2.1                                 new_odi.skippedCSHistory.add(hole_it.next(),
 937 vivien   1.1.2.1                                                              new_mh_2);
 938 vivien   1.1.2.1                         }
 939 vivien   1.1.2.1                         else{
 940 vivien   1.1.2.1                             System.err.println("Error in some hole history ");
 941 vivien   1.1.2.1                             System.err.println("a hole precedes itself!");
 942 vivien   1.1.2.1                             System.out.println("Error in some hole history ");
 943 vivien   1.1.2.1                             System.out.println("a hole precedes itself!");
 944 vivien   1.1.2.1                             System.out.println("hole: " + hole);
 945 vivien   1.1.2.1                             System.out.println("history: " + caller_hist);
 946 vivien   1.1.2.1                         }
 947 vivien   1.1.2.1                     }
 948 vivien   1.1.2.1                 }
 949 vivien   1.1.2.1             }
 950 vivien   1.1.2.1         }
 951 vivien   1.1.2.1         
 952 cananian 1.5             for(Object mhO : callee_hist.keys()){
 953 cananian 1.5                 MethodHole mh = (MethodHole) mhO;
 954 vivien   1.1.2.1             id1 = mh.Id(); 
 955 vivien   1.1.2.1             if (id1<0){
 956 vivien   1.1.2.1                 System.err.println("Error in update (4), no available " 
 957 vivien   1.1.2.1                                    + "conversion for method hole");
 958 vivien   1.1.2.1                 System.out.println("Error in update (4), no available " 
 959 vivien   1.1.2.1                                    + "conversion for method hole");
 960 vivien   1.1.2.1                 System.out.println(mh + "\n in " + callee_hist);
 961 vivien   1.1.2.1             }
 962 vivien   1.1.2.1             new_mh = map[mh.Id()];
 963 vivien   1.1.2.1 
 964 cananian 1.5                 for(Object mh_2O : callee_hist.getValues(mh)){
 965 cananian 1.5                     MethodHole mh_2 = (MethodHole) mh_2O;
 966 vivien   1.1.2.1                 id2 = mh_2.Id(); 
 967 vivien   1.1.2.1                 if (id2<0){
 968 vivien   1.1.2.1                     System.err.println("Error in update (5), no available " 
 969 vivien   1.1.2.1                                        + "conversion for method hole");
 970 vivien   1.1.2.1                     System.out.println("Error in update (5), no available " 
 971 vivien   1.1.2.1                                        + "conversion for method hole");
 972 vivien   1.1.2.1                     System.out.println(mh_2 + "\n in " + callee_hist);
 973 vivien   1.1.2.1                 }
 974 vivien   1.1.2.1                 new_odi.skippedCSHistory.add(new_mh, map[id2]);
 975 vivien   1.1.2.1             }
 976 vivien   1.1.2.1         }
 977 vivien   1.1.2.1     }
 978 vivien   1.1.2.1 
 979 vivien   1.1.2.1 
 980 vivien   1.1.2.1     public void update(EdgesNCallees edges_new,
 981 vivien   1.1.2.1                        EdgesNCallees edges_org,
 982 vivien   1.1.2.1                        MethodHole [] map,
 983 vivien   1.1.2.1                        int mapsize,
 984 vivien   1.1.2.1                        Set mh_from_callee_new,
 985 vivien   1.1.2.1                        MethodHole m_hole,
 986 vivien   1.1.2.1                        Set toberemoved)
 987 vivien   1.1.2.1     {
 988 cananian 1.5             for(Object n1O : edges_org.edges.keySet()){
 989 cananian 1.5                 PANode n1 = (PANode) n1O;
 990 vivien   1.1.2.1             if (toberemoved.contains(n1)) {System.out.println("Useful toberemoved"); continue;}
 991 vivien   1.1.2.1             Map n1_map = (Map) edges_org.edges.get(n1);
 992 vivien   1.1.2.1 
 993 cananian 1.5                 for(Object fO : n1_map.keySet()){
 994 cananian 1.5                     String f = (String) fO;
 995 vivien   1.1.2.1                 Relation n1_f = (Relation) n1_map.get(f);
 996 vivien   1.1.2.1 
 997 cananian 1.5                     for(Object n2O : n1_f.keys()){
 998 cananian 1.5                         PANode n2 = (PANode) n2O;
 999 vivien   1.1.2.1                     if (toberemoved.contains(n2)) {System.out.println("Useful toberemoved"); continue;}
1000 vivien   1.1.2.1                     Set holes = n1_f.getValues(n2);
1001 vivien   1.1.2.1                     HashSet newholes = new HashSet();
1002 vivien   1.1.2.1 
1003 cananian 1.5                         for(Object tmp_mhO : holes){
1004 cananian 1.5                             MethodHole tmp_mh = (MethodHole) tmp_mhO;
1005 vivien   1.1.2.1                         if (tmp_mh==m_hole){
1006 vivien   1.1.2.1                             newholes.addAll(mh_from_callee_new);
1007 vivien   1.1.2.1                         }
1008 vivien   1.1.2.1                         else 
1009 vivien   1.1.2.1                             newholes.add(map[tmp_mh.Id()]);
1010 vivien   1.1.2.1                     }
1011 vivien   1.1.2.1                     edges_new.add(n1, f, n2, newholes);
1012 vivien   1.1.2.1                 }
1013 vivien   1.1.2.1             }
1014 vivien   1.1.2.1         }
1015 vivien   1.1.2.1     }
1016 vivien   1.1.2.1 
1017 vivien   1.1.2.1     public void updatebis(EdgesNCallees edges_new,
1018 vivien   1.1.2.1                        EdgesNCallees edges_org,
1019 vivien   1.1.2.1                        MethodHole [] map,
1020 vivien   1.1.2.1                        int mapsize,
1021 vivien   1.1.2.1                        Set mh_from_callee_new,
1022 vivien   1.1.2.1                        MethodHole m_hole,
1023 vivien   1.1.2.1                        Set toberemoved)
1024 vivien   1.1.2.1     {
1025 cananian 1.5             for(Object n1O : edges_org.edges.keySet()){
1026 cananian 1.5                 PANode n1 = (PANode) n1O;
1027 vivien   1.1.2.1             if (toberemoved.contains(n1)) {System.out.println("Useful toberemoved"); continue;}
1028 vivien   1.1.2.1             Map n1_map = (Map) edges_org.edges.get(n1);
1029 vivien   1.1.2.1 
1030 cananian 1.5                 for(Object fO : n1_map.keySet()){
1031 cananian 1.5                     String f = (String) fO;
1032 vivien   1.1.2.1                 Relation n1_f = (Relation) n1_map.get(f);
1033 vivien   1.1.2.1 
1034 cananian 1.5                     for(Object n2O : n1_f.keys()){
1035 cananian 1.5                         PANode n2 = (PANode) n2O;
1036 vivien   1.1.2.1                     if (toberemoved.contains(n2)) {System.out.println("Useful toberemoved"); continue;}
1037 vivien   1.1.2.1                     Set holes = n1_f.getValues(n2);
1038 vivien   1.1.2.1                     HashSet newholes = new HashSet();
1039 vivien   1.1.2.1 
1040 cananian 1.5                         for(Object tmp_mhO : holes){
1041 cananian 1.5                             MethodHole tmp_mh = (MethodHole) tmp_mhO;
1042 vivien   1.1.2.1                         if (tmp_mh==m_hole){
1043 vivien   1.1.2.1                             newholes.addAll(mh_from_callee_new);
1044 vivien   1.1.2.1                         }
1045 vivien   1.1.2.1                         else {
1046 vivien   1.1.2.1                             if (tmp_mh.Id()>=0){
1047 vivien   1.1.2.1                                 newholes.add(map[tmp_mh.Id()]);
1048 vivien   1.1.2.1                             }
1049 vivien   1.1.2.1                             else {
1050 vivien   1.1.2.1                                 System.err.println("Problem: no translation available "
1051 vivien   1.1.2.1                                                    + " in either caller's and callee's "
1052 vivien   1.1.2.1                                                    + "map! (1)" + tmp_mh);
1053 vivien   1.1.2.1                                 System.out.println("Problem: no translation available "
1054 vivien   1.1.2.1                                                    + " in either caller's and callee's "
1055 vivien   1.1.2.1                                                    + "map! (1)\n" + tmp_mh + "\n in "
1056 vivien   1.1.2.1                                                    + map);
1057 vivien   1.1.2.1                             }
1058 vivien   1.1.2.1                         }
1059 vivien   1.1.2.1                     }
1060 vivien   1.1.2.1                     edges_new.add(n1, f, n2, newholes);
1061 vivien   1.1.2.1                 }
1062 vivien   1.1.2.1             }
1063 vivien   1.1.2.1         }
1064 vivien   1.1.2.1     }
1065 vivien   1.1.2.1 
1066 vivien   1.1.2.1     public static void update_and_add(EdgesNCallees edges,
1067 vivien   1.1.2.1                                       EdgesNCallees addenda,
1068 vivien   1.1.2.1                                       MethodHole [] map,
1069 vivien   1.1.2.1                                       MethodHole hole,
1070 vivien   1.1.2.1                                       Set toberemoved)
1071 vivien   1.1.2.1     {
1072 cananian 1.5             for(Object n1O : addenda.edges.keySet()){
1073 cananian 1.5                 PANode n1 = (PANode) n1O;
1074 vivien   1.1.2.1             if (toberemoved.contains(n1)) continue;
1075 vivien   1.1.2.1             Map n1_map = (Map) addenda.edges.get(n1);
1076 vivien   1.1.2.1             
1077 cananian 1.5                 for(Object fO : n1_map.keySet()){
1078 cananian 1.5                     String f = (String) fO; 
1079 vivien   1.1.2.1                 Relation n1_f = (Relation) n1_map.get(f);
1080 cananian 1.5                     for(Object n2O : n1_f.keys()){
1081 cananian 1.5                         PANode n2 = (PANode) n2O;
1082 vivien   1.1.2.1                     if (toberemoved.contains(n2)) continue;
1083 vivien   1.1.2.1                     Set holes = n1_f.getValues(n2);
1084 vivien   1.1.2.1                     // We are not converting the hole we are removing...
1085 vivien   1.1.2.1                     holes.remove(hole);
1086 vivien   1.1.2.1                     HashSet new_holes = new HashSet();
1087 vivien   1.1.2.1                     
1088 cananian 1.5                         for(Object org_mhO : holes){
1089 cananian 1.5                             MethodHole org_mh = (MethodHole) org_mhO;
1090 vivien   1.1.2.1                         new_holes.add(map[org_mh.Id()]);
1091 vivien   1.1.2.1                     }
1092 vivien   1.1.2.1                     edges.add(n1, f, n2, new_holes);
1093 vivien   1.1.2.1                 }
1094 vivien   1.1.2.1             }
1095 vivien   1.1.2.1         }
1096 vivien   1.1.2.1     }
1097 vivien   1.1.2.1 
1098 vivien   1.1.2.1 
1099 vivien   1.1.2.1     public static void update_and_addbis(EdgesNCallees edges,
1100 vivien   1.1.2.1                                       EdgesNCallees addenda,
1101 vivien   1.1.2.1                                       MethodHole [] map,
1102 vivien   1.1.2.1                                       MethodHole hole,
1103 vivien   1.1.2.1                                       Set toberemoved)
1104 vivien   1.1.2.1     {
1105 cananian 1.5             for(Object n1O : addenda.edges.keySet()){
1106 cananian 1.5                 PANode n1 = (PANode) n1O;
1107 vivien   1.1.2.1             if (toberemoved.contains(n1)) continue;
1108 vivien   1.1.2.1             Map n1_map = (Map) addenda.edges.get(n1);
1109 vivien   1.1.2.1             
1110 cananian 1.5                 for(Object fO : n1_map.keySet()){
1111 cananian 1.5                     String f = (String) fO; 
1112 vivien   1.1.2.1                 Relation n1_f = (Relation) n1_map.get(f);
1113 cananian 1.5                     for(Object n2O : n1_f.keys()){
1114 cananian 1.5                         PANode n2 = (PANode) n2O;
1115 vivien   1.1.2.1                     if (toberemoved.contains(n2)) continue;
1116 vivien   1.1.2.1                     Set holes = n1_f.getValues(n2);
1117 vivien   1.1.2.1                     // We are not converting the hole we are removing...
1118 vivien   1.1.2.1                     holes.remove(hole);
1119 vivien   1.1.2.1                     HashSet new_holes = new HashSet();
1120 vivien   1.1.2.1 
1121 cananian 1.5                         for(Object org_mhO : holes){
1122 cananian 1.5                             MethodHole org_mh = (MethodHole) org_mhO;
1123 vivien   1.1.2.1                         if (org_mh.Id()<0){
1124 vivien   1.1.2.1                             System.err.println("BUG: no conversion available");
1125 vivien   1.1.2.1                             System.out.println("BUG: no conversion available");
1126 vivien   1.1.2.1                             System.out.println("hole : " + org_mh);
1127 vivien   1.1.2.1                             System.out.println("mapping : " + map);
1128 vivien   1.1.2.1                         }
1129 vivien   1.1.2.1                         else
1130 vivien   1.1.2.1                             new_holes.add(map[org_mh.Id()]);
1131 vivien   1.1.2.1                     }
1132 vivien   1.1.2.1                     edges.add(n1, f, n2, new_holes);
1133 vivien   1.1.2.1                 }
1134 vivien   1.1.2.1             }
1135 vivien   1.1.2.1         }
1136 vivien   1.1.2.1     }
1137 vivien   1.1.2.1 
1138 vivien   1.1.2.1 
1139 vivien   1.1.2.1 
1140 vivien   1.1.2.1     public static Set update_locks(ODInformation odi_org,
1141 vivien   1.1.2.1                                    ODInformation odi_new,
1142 vivien   1.1.2.1                                    ODInformation odi_callee,
1143 vivien   1.1.2.1                                    Relation  first_mapping,
1144 vivien   1.1.2.1                                    Relation second_mapping,
1145 vivien   1.1.2.1                                    MethodHole [] mh_converter,
1146 vivien   1.1.2.1                                    MethodHole hole,
1147 vivien   1.1.2.1                                    Set hole_substitute)
1148 vivien   1.1.2.1     {
1149 vivien   1.1.2.1         HashSet par_sync = new HashSet();
1150 vivien   1.1.2.1 //      System.out.println("\n\nHole " + hole);
1151 vivien   1.1.2.1 //      System.out.println("\n\nHole substitute");
1152 vivien   1.1.2.1 //      for(Iterator sub_it=hole_substitute.iterator(); sub_it.hasNext(); )
1153 vivien   1.1.2.1 //          System.out.println(sub_it.next());
1154 vivien   1.1.2.1 
1155 vivien   1.1.2.1         
1156 vivien   1.1.2.1 
1157 vivien   1.1.2.1         if(hole==null){
1158 vivien   1.1.2.1             odi_new.locks = (Relation) odi_org.locks.clone();
1159 vivien   1.1.2.1             System.err.println("???????");
1160 vivien   1.1.2.1             System.out.println("???????");
1161 vivien   1.1.2.1         }
1162 vivien   1.1.2.1         else{
1163 vivien   1.1.2.1 //          System.out.println("\n\nLock holes\n\n");
1164 vivien   1.1.2.1 //          for(Iterator it=odi_org.locks.keys().iterator(); it.hasNext(); ){
1165 vivien   1.1.2.1 //              PASync syncro = (PASync) it.next();
1166 vivien   1.1.2.1 //              Set par_holes = odi_org.locks.getValues(syncro);
1167 vivien   1.1.2.1 //              for(Iterator h_it=par_holes.iterator(); h_it.hasNext(); ){
1168 vivien   1.1.2.1 //                  MethodHole mh = (MethodHole) h_it.next();
1169 vivien   1.1.2.1 //                  System.out.println(mh);
1170 vivien   1.1.2.1 //              }
1171 vivien   1.1.2.1 //      }
1172 vivien   1.1.2.1 
1173 cananian 1.5                 for(Object syncroO : odi_org.locks.keys()){
1174 cananian 1.5                     PASync syncro = (PASync) syncroO;
1175 vivien   1.1.2.1                 Set mapped_syncro = syncro.project(second_mapping);
1176 vivien   1.1.2.1                 boolean parallel  = false;
1177 vivien   1.1.2.1                 
1178 vivien   1.1.2.1                 Set par_holes = odi_org.locks.getValues(syncro);
1179 vivien   1.1.2.1                 HashSet new_par_holes = new HashSet();
1180 cananian 1.5                     for(Object mhO : par_holes){
1181 cananian 1.5                         MethodHole mh = (MethodHole) mhO;
1182 vivien   1.1.2.1                     if (mh==hole){
1183 vivien   1.1.2.1                         new_par_holes.addAll(hole_substitute);
1184 vivien   1.1.2.1                         parallel = true;
1185 vivien   1.1.2.1                     }
1186 vivien   1.1.2.1                     else{
1187 vivien   1.1.2.1                         if (mh!=null){
1188 vivien   1.1.2.1                             if(mh.Id()>=0)
1189 vivien   1.1.2.1                                 new_par_holes.add(mh_converter[mh.Id()]);
1190 vivien   1.1.2.1                             else
1191 vivien   1.1.2.1                                 System.out.println("Problems with methods holes...");
1192 vivien   1.1.2.1                         }
1193 vivien   1.1.2.1                         else
1194 vivien   1.1.2.1                             System.out.println("Problems with methods holes...");
1195 vivien   1.1.2.1                     }
1196 vivien   1.1.2.1                 }
1197 vivien   1.1.2.1                 
1198 vivien   1.1.2.1                 if (parallel)
1199 vivien   1.1.2.1                     par_sync.addAll(mapped_syncro);
1200 vivien   1.1.2.1                 
1201 vivien   1.1.2.1                 for(Iterator sync_it=mapped_syncro.iterator(); sync_it.hasNext(); )
1202 vivien   1.1.2.1                     odi_new.locks.addAll(sync_it.next(),new_par_holes);
1203 vivien   1.1.2.1             }
1204 vivien   1.1.2.1         }
1205 vivien   1.1.2.1         
1206 vivien   1.1.2.1 //      System.out.println("\n\nLock holes (2)\n\n");
1207 vivien   1.1.2.1 //      for(Iterator it=odi_new.locks.keys().iterator(); it.hasNext(); ){
1208 vivien   1.1.2.1 //          PASync syncro = (PASync) it.next();
1209 vivien   1.1.2.1 //          Set par_holes = odi_new.locks.getValues(syncro);
1210 vivien   1.1.2.1 //          for(Iterator h_it=par_holes.iterator(); h_it.hasNext(); ){
1211 vivien   1.1.2.1 //              MethodHole mh = (MethodHole) h_it.next();
1212 vivien   1.1.2.1 //              System.out.println(mh);
1213 vivien   1.1.2.1 //          }
1214 vivien   1.1.2.1 //      }
1215 vivien   1.1.2.1 
1216 vivien   1.1.2.1 
1217 vivien   1.1.2.1         
1218 vivien   1.1.2.1         Set holes_b4_callee = odi_org.predecessors(hole);
1219 vivien   1.1.2.1     HashSet new_holes_b4_callee = new HashSet();
1220 cananian 1.5             for(Object temp_mhO : holes_b4_callee){
1221 cananian 1.5                 MethodHole temp_mh = (MethodHole) temp_mhO;
1222 vivien   1.1.2.1             if(temp_mh.Id()<0){
1223 vivien   1.1.2.1                 System.err.println("No conversion available in update_locks");
1224 vivien   1.1.2.1                 System.out.println("No conversion available in update_locks");
1225 vivien   1.1.2.1             }
1226 vivien   1.1.2.1             new_holes_b4_callee.add(mh_converter[temp_mh.Id()]);
1227 vivien   1.1.2.1         }
1228 vivien   1.1.2.1         // Update and add the callee locks
1229 cananian 1.5             for(Object syncroO : odi_callee.locks.keys()){
1230 cananian 1.5                 PASync syncro = (PASync) syncroO;
1231 vivien   1.1.2.1             Set mapped_syncro = syncro.project(first_mapping);
1232 vivien   1.1.2.1             
1233 vivien   1.1.2.1             Set par_holes = odi_callee.locks.getValues(syncro);
1234 vivien   1.1.2.1             HashSet new_par_holes = new HashSet();
1235 vivien   1.1.2.1             new_par_holes.addAll(new_holes_b4_callee);
1236 cananian 1.5                 for(Object temp_mhO : par_holes){
1237 cananian 1.5                     MethodHole temp_mh = (MethodHole) temp_mhO;
1238 vivien   1.1.2.1                 if(temp_mh.Id()<0){
1239 vivien   1.1.2.1                     System.err.println("No conversion available in update_locks (2)");
1240 vivien   1.1.2.1                     System.out.println("No conversion available in update_locks (2)");
1241 vivien   1.1.2.1                 }
1242 vivien   1.1.2.1                 new_par_holes.add(mh_converter[temp_mh.Id()]);
1243 vivien   1.1.2.1             }
1244 vivien   1.1.2.1             for(Iterator sync_it=mapped_syncro.iterator(); sync_it.hasNext(); )
1245 vivien   1.1.2.1                 odi_new.locks.addAll(sync_it.next(), new_par_holes);
1246 vivien   1.1.2.1         }
1247 vivien   1.1.2.1 
1248 vivien   1.1.2.1 
1249 vivien   1.1.2.1 //      System.out.println("\n\nLock holes (3)\n\n");
1250 vivien   1.1.2.1 //      for(Iterator it=odi_new.locks.keys().iterator(); it.hasNext(); ){
1251 vivien   1.1.2.1 //          PASync syncro = (PASync) it.next();
1252 vivien   1.1.2.1 //          Set par_holes = odi_new.locks.getValues(syncro);
1253 vivien   1.1.2.1 //          for(Iterator h_it=par_holes.iterator(); h_it.hasNext(); ){
1254 vivien   1.1.2.1 //              MethodHole mh = (MethodHole) h_it.next();
1255 vivien   1.1.2.1 //              System.out.println(mh);
1256 vivien   1.1.2.1 //          }
1257 vivien   1.1.2.1 //      }
1258 vivien   1.1.2.1 
1259 vivien   1.1.2.1 
1260 vivien   1.1.2.1         return par_sync;
1261 vivien   1.1.2.1     }
1262 vivien   1.1.2.1     
1263 vivien   1.1.2.1 
1264 vivien   1.1.2.1 
1265 cananian 1.2     }