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 }