1 cananian 1.1 // LowQuadValueVisitor.java, created Tue Jan 19 21:15:19 1999 by cananian
 2 cananian 1.1 // Copyright (C) 1999 C. Scott Ananian <cananian@alumni.princeton.edu>
 3 cananian 1.1 // Licensed under the terms of the GNU GPL; see COPYING for details.
 4 cananian 1.1 package harpoon.IR.LowQuad;
 5 cananian 1.1 
 6 cananian 1.1 /**
 7 cananian 1.1  * <code>LowQuadValueVisitor</code> is a visitor class for low quads
 8 cananian 1.1  * that returns a parameterized value.
 9 cananian 1.1  * 
10 cananian 1.1  * @author  C. Scott Ananian <cananian@alumni.princeton.edu>
11 cananian 1.1  * @version $Id: LowQuadValueVisitor.java,v 1.1 2002/04/11 04:00:21 cananian Exp $
12 cananian 1.1  */
13 cananian 1.1 public abstract class LowQuadValueVisitor<T>
14 cananian 1.1     extends harpoon.IR.Quads.QuadValueVisitor<T> {
15 cananian 1.1     /** if true, then throw an error if given any quads disallowed in lowquad
16 cananian 1.1      *  form. */
17 cananian 1.1     private final boolean strictLowQuad;
18 cananian 1.1     /** Create a <code>LowQuadValueVisitor</code>. If <code>strictLowQuad</code>
19 cananian 1.1      *  is true (the default), then the visitor will throw an error if
20 cananian 1.1      *  any quads are visited which are disallowed in lowquad form. */
21 cananian 1.1     protected LowQuadValueVisitor(boolean strictLowQuad) {
22 cananian 1.1         this.strictLowQuad = strictLowQuad;
23 cananian 1.1     }
24 cananian 1.1     protected LowQuadValueVisitor() { this(true); }
25 cananian 1.1 
26 cananian 1.1     // DISALLOW certain Quads in LowQuad form.
27 cananian 1.1     /** <code>AGET</code> is disallowed in <code>LowQuad</code> form.
28 cananian 1.1      *  This method throws an <code>Error</code> unless !strictLowQuad. */
29 cananian 1.1     public T visit(harpoon.IR.Quads.AGET q)
30 cananian 1.1     { if (strictLowQuad) error(q); return super.visit(q); }
31 cananian 1.1     /** <code>ASET</code> is disallowed in <code>LowQuad</code> form.
32 cananian 1.1      *  This method throws an <code>Error</code> unless !strictLowQuad. */
33 cananian 1.1     public T visit(harpoon.IR.Quads.ASET q)
34 cananian 1.1     { if (strictLowQuad) error(q); return super.visit(q); }
35 cananian 1.1     /** <code>CALL</code> is disallowed in <code>LowQuad</code> form.
36 cananian 1.1      *  This method throws an <code>Error</code> unless !strictLowQuad. */
37 cananian 1.1     public T visit(harpoon.IR.Quads.CALL q)
38 cananian 1.1     { if (strictLowQuad) error(q); return super.visit(q); }
39 cananian 1.1     /** <code>GET</code> is disallowed in <code>LowQuad</code> form.
40 cananian 1.1      *  This method throws an <code>Error</code> unless !strictLowQuad. */
41 cananian 1.1     public T visit(harpoon.IR.Quads.GET q)
42 cananian 1.1     { if (strictLowQuad) error(q); return super.visit(q); }
43 cananian 1.1     /** <code>HANDLER</code> is disallowed in <code>LowQuad</code> form.
44 cananian 1.1      *  This method throws an <code>Error</code> unless !strictLowQuad. */
45 cananian 1.1     public T visit(harpoon.IR.Quads.HANDLER q)
46 cananian 1.1     { if (strictLowQuad) error(q); return super.visit(q); }
47 cananian 1.1     /** <code>OPER</code> is disallowed in <code>LowQuad</code> form.
48 cananian 1.1      *  This method throws an <code>Error</code> unless !strictLowQuad. */
49 cananian 1.1     public T visit(harpoon.IR.Quads.OPER q)
50 cananian 1.1     { if (strictLowQuad) error(q); return super.visit(q); }
51 cananian 1.1     /** <code>SET</code> is disallowed in <code>LowQuad</code> form.
52 cananian 1.1      *  This method throws an <code>Error</code> unless !strictLowQuad. */
53 cananian 1.1     public T visit(harpoon.IR.Quads.SET q)
54 cananian 1.1     { if (strictLowQuad) error(q); return super.visit(q); }
55 cananian 1.1     // error function.
56 cananian 1.1     private static final void error(harpoon.IR.Quads.Quad q) {
57 cananian 1.1         throw new Error("Illegal LowQuad: "+q);
58 cananian 1.1     }
59 cananian 1.1 
60 cananian 1.1     // Visitor functions for new LowQuads.
61 cananian 1.1     public T visit(LowQuad q)    { return visit((harpoon.IR.Quads.Quad)q); }
62 cananian 1.1     public T visit(POPER q)      { return visit((harpoon.IR.Quads.Quad)q); }
63 cananian 1.1     public T visit(PCALL q)      { return visit((harpoon.IR.Quads.SIGMA)q); }
64 cananian 1.1     public T visit(PGET q)       { return visit((LowQuad)q); }
65 cananian 1.1     public T visit(PSET q)       { return visit((LowQuad)q); }
66 cananian 1.1 
67 cananian 1.1     // PPTR:
68 cananian 1.1     public T visit(PPTR q)       { return visit((LowQuad)q); }
69 cananian 1.1     public T visit(PARRAY q)     { return visit((PPTR)q); }
70 cananian 1.1     public T visit(PFIELD q)     { return visit((PPTR)q); }
71 cananian 1.1     public T visit(PMETHOD q)    { return visit((PPTR)q); }
72 cananian 1.1     // PCONST:
73 cananian 1.1     public T visit(PCONST q)     { return visit((LowQuad)q); }
74 cananian 1.1     public T visit(PAOFFSET q)   { return visit((PCONST)q); }
75 cananian 1.1     public T visit(PFOFFSET q)   { return visit((PCONST)q); }
76 cananian 1.1     public T visit(PMOFFSET q)   { return visit((PCONST)q); }
77 cananian 1.1     public T visit(PFCONST q)    { return visit((PCONST)q); }
78 cananian 1.1     public T visit(PMCONST q)    { return visit((PCONST)q); }
79 cananian 1.1 }