1 cananian 1.1.2.1 // Code.java, created Fri Jan 22 17:00:41 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.IR.LowQuad; 5 cananian 1.1.2.1 6 cananian 1.1.2.12 import harpoon.Analysis.Maps.Derivation; 7 cananian 1.1.2.12 import harpoon.Analysis.Maps.Derivation.DList; 8 cananian 1.1.2.2 import harpoon.Analysis.Maps.TypeMap; 9 duncan 1.1.2.8 import harpoon.ClassFile.HClass; 10 cananian 1.1.2.15 import harpoon.ClassFile.HCodeAndMaps; 11 cananian 1.1.2.7 import harpoon.ClassFile.HCodeElement; 12 cananian 1.1.2.1 import harpoon.ClassFile.HMethod; 13 cananian 1.1.2.1 import harpoon.IR.Quads.Quad; 14 cananian 1.1.2.1 import harpoon.Temp.Temp; 15 cananian 1.1.2.1 import harpoon.Temp.TempFactory; 16 cananian 1.1.2.1 17 cananian 1.1.2.1 import java.util.Hashtable; 18 cananian 1.1.2.15 import java.util.Iterator; 19 cananian 1.1.2.1 /** 20 cananian 1.1.2.10 * <code>LowQuad.Code</code> is an abstract superclass of codeviews 21 cananian 1.1.2.10 * using the components in <code>IR.LowQuad</code>. It implements 22 cananian 1.1.2.10 * shared methods for the various codeviews using <code>LowQuad</code>s. 23 cananian 1.1.2.1 * 24 cananian 1.1.2.1 * @author C. Scott Ananian <cananian@alumni.princeton.edu> 25 cananian 1.3 * @version $Id: Code.java,v 1.3 2003/03/10 22:19:13 cananian Exp $ 26 cananian 1.1.2.1 */ 27 duncan 1.1.2.5 public abstract class Code extends harpoon.IR.Quads.Code 28 cananian 1.1.2.1 { 29 cananian 1.1.2.1 /** Make the quad factory. */ 30 cananian 1.1.2.1 protected harpoon.IR.Quads.QuadFactory newQF(final HMethod parent) { 31 cananian 1.1.2.1 final String scope = parent.getDeclaringClass().getName() + "." + 32 cananian 1.1.2.1 parent.getName() + parent.getDescriptor() + "/" + getName(); 33 cananian 1.1.2.13 abstract class SerializableLowQuadFactory extends LowQuadFactory 34 cananian 1.1.2.13 implements java.io.Serializable { /* only declare inheritance */ } 35 cananian 1.1.2.13 return new SerializableLowQuadFactory() { 36 cananian 1.1.2.1 private final TempFactory tf = Temp.tempFactory(scope); 37 cananian 1.1.2.1 private int id=0; 38 cananian 1.1.2.1 public TempFactory tempFactory() { return tf; } 39 cananian 1.1.2.1 public harpoon.IR.Quads.Code getParent() { return Code.this; } 40 cananian 1.1.2.1 public synchronized int getUniqueID() { return id++; } 41 cananian 1.1.2.1 }; 42 cananian 1.1.2.1 } 43 duncan 1.1.2.5 44 duncan 1.1.2.4 protected Code(HMethod parent, Quad quads) { 45 cananian 1.1.2.1 super(parent, quads); 46 cananian 1.1.2.1 } 47 cananian 1.1.2.1 48 cananian 1.1.2.14 // Provide access to derivation information. 49 cananian 1.3 private Derivation<Quad> m_derivation = null; 50 cananian 1.1.2.14 /** Return a <code>Derivation</code> object for this 51 cananian 1.1.2.14 * <code>LowQuad.Code</code>. */ 52 cananian 1.3 public Derivation<Quad> getDerivation() { return m_derivation; } 53 cananian 1.1.2.14 /** Allow subclasses to initialize the <code>Derivation</code> for 54 cananian 1.1.2.14 * this <code>LowQuad.Code</code>. */ 55 cananian 1.3 protected void setDerivation(Derivation<Quad> deriv){ m_derivation=deriv; } 56 cananian 1.1.2.15 57 cananian 1.1.2.15 // clone derivation information, too. 58 cananian 1.3 protected HCodeAndMaps<Quad> cloneHelper(harpoon.IR.Quads.Code _this, 59 cananian 1.3 harpoon.IR.Quads.Code qc) { 60 cananian 1.1.2.15 final HCodeAndMaps hcam = super.cloneHelper(_this, qc); 61 cananian 1.1.2.15 if (_this.getDerivation()!=null) 62 cananian 1.1.2.15 ((Code)qc).setDerivation(cloneDerivation(hcam)); 63 cananian 1.1.2.15 return hcam; 64 cananian 1.1.2.15 } 65 cananian 1.3 private static Derivation<Quad> cloneDerivation(HCodeAndMaps<Quad> hcam) { 66 cananian 1.1.2.15 Code ocode = (Code) hcam.ancestorHCode(); 67 cananian 1.3 Derivation<Quad> oderiv = ocode.getDerivation(); 68 cananian 1.3 DerivationMap<Quad> nderiv = new DerivationMap<Quad>(); 69 cananian 1.3 for (Iterator<Quad> it=ocode.getElementsI(); it.hasNext(); ) { 70 cananian 1.3 Quad ohce = it.next(); 71 cananian 1.3 Quad nhce = hcam.elementMap().get(ohce); 72 cananian 1.3 nderiv.transfer(nhce, ohce, ohce.def(), 73 cananian 1.1.2.15 hcam.tempMap(), oderiv); 74 cananian 1.1.2.15 } 75 cananian 1.1.2.15 return nderiv; 76 cananian 1.1.2.15 } 77 cananian 1.2 }