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
28
29
30
31
32 package org.kit.furia.fragment.soot.representation.internal;
33
34 import soot.*;
35 import org.kit.furia.fragment.soot.representation.*;
36 import soot.jimple.internal.*;
37 import java.util.*;
38
39 public class FSpecialInvokeExpr extends AbstractSpecialInvokeExpr
40 implements Precedence , Qable, SpecialConstructContainer
41 {
42
43
44
45 private static final long serialVersionUID = 2990166238108949697L;
46
47 public FSpecialInvokeExpr(Value base, SootMethodRef methodRef, List args)
48 {
49 super((FExprBox)Frimp.v().newObjExprBox(base), methodRef,
50 (FExprBox[]) new FExprBox[args.size()]);
51
52 for(int i = 0; i < args.size(); i++)
53 this.argBoxes[i] = Frimp.v().newExprBox((Value) args.get(i));
54 }
55
56 public int getPrecedence() { return 950; }
57
58 private String toString(Value op, String opString, String rightString)
59 {
60 String leftOp = opString;
61
62 if (getBase() instanceof Precedence &&
63 ((Precedence)getBase()).getPrecedence() < getPrecedence())
64 leftOp = "(" + leftOp + ")";
65 return leftOp + rightString;
66 }
67
68 public String toString()
69 {
70 StringBuffer buffer = new StringBuffer();
71
72 buffer.append("." + methodRef.getSignature() + "(");
73
74 for(int i = 0; i < argBoxes.length; i++)
75 {
76 if(i != 0)
77 buffer.append(", ");
78
79 buffer.append(argBoxes[i].getValue().toString());
80 }
81
82 buffer.append(")");
83
84 return toString(getBase(), getBase().toString(),
85 buffer.toString());
86 }
87
88 public void toString(UnitPrinter up)
89 {
90 if( PrecedenceTest.needsBrackets( baseBox, this ) ) up.literal("(");
91 baseBox.toString(up);
92 if( PrecedenceTest.needsBrackets( baseBox, this ) ) up.literal(")");
93 up.literal(".");
94 up.methodRef(methodRef);
95 up.literal("(");
96
97 for(int i = 0; i < argBoxes.length; i++)
98 {
99 if(i != 0)
100 up.literal(", ");
101
102 argBoxes[i].toString(up);
103 }
104
105 up.literal(")");
106 }
107
108
109 public Object clone()
110 {
111 ArrayList clonedArgs = new ArrayList(getArgCount());
112
113 for(int i = 0; i < getArgCount(); i++) {
114 clonedArgs.add(i, Frimp.cloneIfNecessary(getArg(i)));
115 }
116
117 return new FSpecialInvokeExpr(Frimp.cloneIfNecessary(getBase()),
118 methodRef, clonedArgs);
119 }
120
121 public String toQ() throws Exception {
122 StringBuffer buffer = new StringBuffer();
123
124 buffer.append(FuriaConstructDefinitions.FURIA_fspecialInvoke + "(" + Frimp.toQ(methodRef)+ "," + Frimp.toQ(getBase()));
125
126 for(int i = 0; i < argBoxes.length; i++)
127 {
128
129 buffer.append(",");
130
131 buffer.append(Frimp.toQ(argBoxes[i].getValue()));
132 }
133
134 buffer.append(")");
135
136 return buffer.toString();
137
138 }
139
140 public List getContainedSpecialConstructs() {
141 List res = new LinkedList();
142 res.add(methodRef);
143 return res;
144 }
145 }
146