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
27 package org.kit.furia.fragment.soot.representation.internal;
28
29 import org.kit.furia.fragment.soot.representation.Frimp;
30 import org.kit.furia.fragment.soot.representation.Precedence;
31 import org.kit.furia.fragment.soot.representation.Qable;
32
33 import soot.*;
34
35 import soot.jimple.*;
36 import soot.jimple.internal.*;
37
38 abstract public class AbstractFrimpIntLongBinopExpr
39 extends AbstractIntLongBinopExpr implements Precedence, Qable
40 {
41 AbstractFrimpIntLongBinopExpr(Value op1, Value op2)
42 {
43 this(Frimp.v().newArgBox(op1),
44 Frimp.v().newArgBox(op2));
45 }
46
47 protected AbstractFrimpIntLongBinopExpr(ValueBox op1Box, ValueBox op2Box)
48 {
49 this.op1Box = op1Box;
50 this.op2Box = op2Box;
51 }
52
53 abstract public int getPrecedence();
54
55 private String toString(Value op1, Value op2,
56 String leftOp, String rightOp, String symbol)
57 {
58 if (op1 instanceof Precedence &&
59 ((Precedence)op1).getPrecedence() < getPrecedence())
60 leftOp = "(" + leftOp + ")";
61
62 if (op2 instanceof Precedence) {
63 int opPrec = ((Precedence) op2).getPrecedence(),
64 myPrec = getPrecedence();
65
66 if ((opPrec < myPrec) ||
67 ((opPrec == myPrec) && ((this instanceof SubExpr) || (this instanceof DivExpr))))
68 rightOp = "(" + rightOp + ")";
69 }
70
71 return leftOp + symbol + rightOp;
72 }
73
74 public String toString()
75 {
76 Value op1 = op1Box.getValue(), op2 = op2Box.getValue();
77 String leftOp = op1.toString(), rightOp = op2.toString();
78
79 return toString(op1, op2, leftOp, rightOp, getSymbol());
80 }
81
82 public String toQ() throws Exception {
83 Value op1 = op1Box.getValue(), op2 = op2Box.getValue();
84 String leftOp = Frimp.toQ(op1), rightOp = Frimp.toQ(op2);
85
86
87 return getQSymbol() + "(" + leftOp + "," + rightOp + ")";
88 }
89
90 public abstract String getQSymbol();
91 }