View Javadoc

1   /* Soot - a J*va Optimization Framework
2    * Copyright (C) 1999 Patrick Lam
3    * Copyright (C) 2004 Ondrej Lhotak
4    *
5    * This library is free software; you can redistribute it and/or
6    * modify it under the terms of the GNU Lesser General Public
7    * License as published by the Free Software Foundation; either
8    * version 2.1 of the License, or (at your option) any later version.
9    *
10   * This library is distributed in the hope that it will be useful,
11   * but WITHOUT ANY WARRANTY; without even the implied warranty of
12   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13   * Lesser General Public License for more details.
14   *
15   * You should have received a copy of the GNU Lesser General Public
16   * License along with this library; if not, write to the
17   * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18   * Boston, MA 02111-1307, USA.
19   */
20  
21  /*
22   * Modified by the Sable Research Group and others 1997-1999.  
23   * See the 'credits' file distributed with Soot for the complete list of
24   * contributors.  (Soot is distributed at http://www.sable.mcgill.ca/soot)
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()  // NOPMD by amuller on 11/16/06 4:21 PM
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