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 }