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     }