1 marinov 1.1.2.1 // ClassCone.java, created Mon Nov 23 22:26:40 1998 by marinov 2 cananian 1.1.2.3 // Copyright (C) 1998 Darko Marinov <marinov@lcs.mit.edu> 3 cananian 1.1.2.3 // Licensed under the terms of the GNU GPL; see COPYING for details. 4 marinov 1.1.2.1 package harpoon.Analysis.TypeInference; 5 marinov 1.1.2.1 6 cananian 1.1.2.4 import harpoon.Analysis.ClassHierarchy; 7 cananian 1.1.2.5 import harpoon.ClassFile.HClass; 8 marinov 1.1.2.1 import harpoon.Util.Worklist; 9 cananian 1.1.2.8 import harpoon.Util.Collections.WorkSet; 10 marinov 1.1.2.1 import harpoon.Util.HClassUtil; 11 cananian 1.1.2.7 import harpoon.Util.Util; 12 cananian 1.1.2.4 13 cananian 1.1.2.6 import java.util.HashMap; 14 cananian 1.1.2.6 import java.util.Map; 15 cananian 1.1.2.6 import java.util.Set; 16 cananian 1.1.2.4 import java.util.Iterator; 17 marinov 1.1.2.1 /** 18 marinov 1.1.2.1 * <code>ClassCone</code> 19 marinov 1.1.2.1 * 20 marinov 1.1.2.1 * @author Darko Marinov <marinov@lcs.mit.edu> 21 cananian 1.4 * @version $Id: ClassCone.java,v 1.4 2002/04/10 03:02:11 cananian Exp $ 22 marinov 1.1.2.1 */ 23 marinov 1.1.2.1 24 marinov 1.1.2.1 public class ClassCone { 25 marinov 1.1.2.1 26 marinov 1.1.2.1 /** Creates a <code>ClassCone</code>. */ 27 marinov 1.1.2.1 public ClassCone(ClassHierarchy ch) { this.ch = ch; } 28 marinov 1.1.2.1 29 marinov 1.1.2.1 static ClassHierarchy ch; 30 cananian 1.1.2.6 static Map map = new HashMap(); 31 marinov 1.1.2.1 static SetHClass cone(HClass c) { 32 marinov 1.1.2.1 /* ??? it might be better not to expand the cone immediately 33 marinov 1.1.2.1 */ 34 marinov 1.1.2.1 SetHClass s = (SetHClass)map.get(c); 35 marinov 1.1.2.1 if (s==null) { 36 marinov 1.1.2.1 s = new SetHClass(); 37 marinov 1.1.2.1 int dims = HClassUtil.dims(c); 38 cananian 1.1.2.6 Worklist wl = new WorkSet(); 39 marinov 1.1.2.1 wl.push(HClassUtil.baseClass(c)); 40 marinov 1.1.2.1 while (!wl.isEmpty()) { 41 marinov 1.1.2.1 HClass cl = (HClass)wl.pull(); 42 cananian 1.3.2.1 assert !c.isPrimitive() : "CSA: c.getLinker() hack below"+ 43 cananian 1.3.2.1 " is not going to work if c can be primitive."; 44 cananian 1.1.2.7 s.add(HClassUtil.arrayClass(c.getLinker(), cl, dims)); 45 cananian 1.1.2.4 for (Iterator it=ch.children(cl).iterator(); it.hasNext(); ) 46 cananian 1.1.2.4 wl.push(it.next()); 47 marinov 1.1.2.1 } 48 marinov 1.1.2.1 map.put(c, s); 49 marinov 1.1.2.1 } 50 marinov 1.1.2.1 return s.copy(); 51 marinov 1.1.2.1 } 52 marinov 1.1.2.1 53 cananian 1.2 }