View Javadoc

1   /* Soot - a J*va Optimization Framework
2    * Copyright (C) 1999 Patrick Lam
3    *
4    * This library is free software; you can redistribute it and/or
5    * modify it under the terms of the GNU Lesser General Public
6    * License as published by the Free Software Foundation; either
7    * version 2.1 of the License, or (at your option) any later version.
8    *
9    * This library is distributed in the hope that it will be useful,
10   * but WITHOUT ANY WARRANTY; without even the implied warranty of
11   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12   * Lesser General Public License for more details.
13   *
14   * You should have received a copy of the GNU Lesser General Public
15   * License along with this library; if not, write to the
16   * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17   * Boston, MA 02111-1307, USA.
18   */
19  
20  /*
21   * Modified by the Sable Research Group and others 1997-1999.  
22   * See the 'credits' file distributed with Soot for the complete list of
23   * contributors.  (Soot is distributed at http://www.sable.mcgill.ca/soot)
24   */
25  
26  package org.kit.furia.fragment.soot.representation.internal;
27  
28  import org.kit.furia.fragment.soot.representation.Frimp;
29  import org.kit.furia.fragment.soot.representation.Precedence;
30  import org.kit.furia.fragment.soot.representation.Qable;
31  
32  import soot.*;
33  
34  import soot.jimple.*;
35  import soot.jimple.internal.*;
36  
37  abstract public class AbstractFrimpIntBinopExpr extends AbstractIntBinopExpr
38  		implements Precedence, Qable {
39  	public AbstractFrimpIntBinopExpr(Value op1, Value op2) {
40  		this(Frimp.v().newArgBox(op1), Frimp.v().newArgBox(op2));
41  	}
42  
43  	protected AbstractFrimpIntBinopExpr(ValueBox op1Box, ValueBox op2Box) {
44  		this.op1Box = op1Box;
45  		this.op2Box = op2Box;
46  	}
47  
48  	abstract public int getPrecedence();
49  
50  	private String toString(Value op1, Value op2, String leftOp, // NOPMD by amuller on 11/16/06 4:08 PM
51  			String rightOp, String symbol) { // NOPMD by amuller on 11/16/06 4:08 PM
52  		if (op1 instanceof Precedence
53  				&& ((Precedence) op1).getPrecedence() < getPrecedence())
54  			leftOp = "(" + leftOp + ")";
55  
56  		if (op2 instanceof Precedence) {
57  			int opPrec = ((Precedence) op2).getPrecedence(), myPrec = getPrecedence();
58  			// TODO check the following conditions, doesn't seem to be very
59  			// important
60  			if ((opPrec < myPrec)
61  					|| ((opPrec == myPrec) && ((this instanceof SubExpr)
62  							|| (this instanceof DivExpr)
63  							|| (this instanceof FCmpExpr)
64  							|| (this instanceof FCmpgExpr) || (this instanceof FCmplExpr))))
65  
66  				rightOp = "(" + rightOp + ")";
67  		}
68  		return leftOp + symbol + rightOp;
69  		//return "(" + leftOp + ")" + symbol + "(" + rightOp + ")";
70  	}
71  
72  	public String toString() {
73  		Value op1 = op1Box.getValue(), op2 = op2Box.getValue();
74  		String leftOp = op1.toString(), rightOp = op2.toString();
75  
76  		return toString(op1, op2, leftOp, rightOp, getSymbol());
77  	}
78  
79  	public String toQ() throws Exception {
80  		Value op1 = op1Box.getValue(), op2 = op2Box.getValue();
81  		String leftOp = Frimp.toQ(op1), rightOp = Frimp.toQ(op2);
82  
83  		// return toString(op1, op2, leftOp, rightOp, getQSymbol());
84  		return getQSymbol() + "(" + leftOp  + "," +  rightOp + ")"; 
85  	}
86  
87  	public abstract String getQSymbol();
88  }