1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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,
51 String rightOp, String symbol) {
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
59
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
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
84 return getQSymbol() + "(" + leftOp + "," + rightOp + ")";
85 }
86
87 public abstract String getQSymbol();
88 }