1 cananian 1.1.2.1 // CachingCodeFactory.java, created Sun Jan 31 16:45:26 1999 by cananian
 2 cananian 1.1.2.1 // Copyright (C) 1999 C. Scott Ananian <cananian@alumni.princeton.edu>
 3 cananian 1.1.2.1 // Licensed under the terms of the GNU GPL; see COPYING for details.
 4 cananian 1.1.2.1 package harpoon.ClassFile;
 5 cananian 1.1.2.1 
 6 cananian 1.1.2.3 import java.util.HashMap;
 7 cananian 1.1.2.3 import java.util.Map;
 8 cananian 1.1.2.1 
 9 cananian 1.1.2.1 /**
10 cananian 1.1.2.1  * A <code>CachingCodeFactory</code> caches the conversions performed by
11 cananian 1.1.2.4  * a parent <code>HCodeFactory</code>; the cache can also be directly
12 cananian 1.1.2.4  * modified in order to add or replace method implementations.
13 cananian 1.1.2.1  * 
14 cananian 1.1.2.1  * @author  C. Scott Ananian <cananian@alumni.princeton.edu>
15 salcianu 1.4      * @version $Id: CachingCodeFactory.java,v 1.4 2002/04/24 23:48:22 salcianu Exp $
16 cananian 1.1.2.1  */
17 cananian 1.1.2.2 public class CachingCodeFactory implements SerializableCodeFactory {
18 cananian 1.1.2.1     /** Parent code factory. Creates the representations this
19 cananian 1.1.2.2      *  <code>CachingCodeFactory</code> caches.
20 cananian 1.1.2.2      * @serial */
21 cananian 1.1.2.1     public final HCodeFactory parent;
22 cananian 1.1.2.1     /** Representation cache. */
23 cananian 1.1.2.5     private final Map h = new HashMap(); // map impl must support null vals
24 cananian 1.1.2.5     /** Flush the representation cache before being saving to disk? */
25 cananian 1.1.2.5     private final boolean flushBeforeSave;
26 cananian 1.1.2.1 
27 cananian 1.1.2.1     /** Creates a <code>CachingCodeFactory</code> using the conversions
28 cananian 1.1.2.5      *  performed by <code>parent</code>.  Cached <code>HCode</code>s
29 cananian 1.1.2.5      *  will be flushed before this code factory is serialized. */
30 cananian 1.1.2.1     public CachingCodeFactory(HCodeFactory parent) {
31 cananian 1.1.2.5         this(parent, false);
32 cananian 1.1.2.5     }
33 cananian 1.1.2.5     /** Creates a <code>CachingCodeFactory</code> using the conversions
34 cananian 1.1.2.5      *  performed by <code>parent</code>.  If <code>saveCode</code> is
35 cananian 1.1.2.5      *  <code>true</code>, cached <code>HCode</code>s will *not* be
36 cananian 1.1.2.5      *  flushed before serialization. */
37 cananian 1.1.2.5     public CachingCodeFactory(HCodeFactory parent, boolean saveCode) {
38 cananian 1.1.2.1         this.parent = parent;
39 cananian 1.1.2.5         this.flushBeforeSave = !saveCode;
40 cananian 1.1.2.1     }
41 cananian 1.1.2.3     /** Serializable interface. */
42 cananian 1.1.2.5     private void writeObject(java.io.ObjectOutputStream out)
43 cananian 1.1.2.5         throws java.io.IOException {
44 cananian 1.1.2.5         if (flushBeforeSave) h.clear();
45 cananian 1.1.2.5         out.defaultWriteObject();
46 cananian 1.1.2.3     }
47 cananian 1.1.2.1     /** Returns the name of the <code>HCode</code>s generated by this
48 cananian 1.1.2.1      *  <code>CachingCodeFactory</code>.  Returns the same name as
49 cananian 1.1.2.1      *  <code>parent</code> does. */
50 cananian 1.1.2.1     public String getCodeName() { return parent.getCodeName(); }
51 cananian 1.1.2.1     /** Convert a method to an <code>HCode</code>, caching the result.
52 cananian 1.1.2.1      *  Cached representations of <code>m</code> in <code>parent</code> are
53 cananian 1.1.2.1      *  cleared when this <code>CachingCodeFactory</code> adds the
54 cananian 1.1.2.1      *  converted representation of <code>m</code> to its cache. */
55 cananian 1.1.2.1     public HCode convert(HMethod m) {
56 cananian 1.1.2.3         if (h.containsKey(m)) return (HCode) h.get(m); // even if get()==null.
57 cananian 1.1.2.1 
58 cananian 1.1.2.1         HCode hc = parent.convert(m);
59 cananian 1.1.2.1         put(m, hc);
60 cananian 1.1.2.1         return hc;
61 cananian 1.1.2.1     }
62 cananian 1.1.2.1     /** Remove the cached representation of <code>m</code> from this
63 cananian 1.1.2.1      *  <code>CachingCodeFactory</code> and its <code>parent</code>.
64 cananian 1.1.2.1      */
65 cananian 1.1.2.1     public void clear(HMethod m) {
66 cananian 1.1.2.1         h.remove(m);
67 cananian 1.1.2.1         parent.clear(m);
68 cananian 1.1.2.1     }
69 cananian 1.1.2.1     /** Add or replace a representation for <code>m</code> to this
70 cananian 1.1.2.1      *  <code>CachingCodeFactory</code>.  This can be used to update
71 cananian 1.1.2.1      *  the representation of a method with an optimized or otherwise
72 cananian 1.1.2.1      *  modified version.  As a side-effect, clears any cached representations
73 cananian 1.1.2.1      *  of <code>m</code> from <code>parent</code>. */
74 cananian 1.1.2.1     public void put(HMethod m, HCode hc) {
75 cananian 1.1.2.3         h.put(m, hc); // works even if hc==null
76 salcianu 1.4             // [AS] do we really need this?
77 salcianu 1.4             parent.clear(m);
78 cananian 1.1.2.1     }
79 cananian 1.2     }