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