1 20 21 26 27 28 29 30 31 32 package soot.grimp.internal; 33 34 import soot.*; 35 import soot.grimp.*; 36 import soot.jimple.internal.*; 37 import soot.jimple.*; 38 import soot.grimp.*; 39 import soot.jimple.internal.*; 40 import soot.util.*; 41 import java.util.*; 42 43 public class GSpecialInvokeExpr extends AbstractSpecialInvokeExpr 44 implements Precedence 45 { 46 public GSpecialInvokeExpr(Value base, SootMethodRef methodRef, List args) 47 { 48 super((ExprBox)Grimp.v().newObjExprBox(base), methodRef, 49 (ExprBox[]) new ExprBox[args.size()]); 50 51 for(int i = 0; i < args.size(); i++) 52 this.argBoxes[i] = Grimp.v().newExprBox((Value) args.get(i)); 53 } 54 55 public int getPrecedence() { return 950; } 56 57 private String toString(Value op, String opString, String rightString) 58 { 59 String leftOp = opString; 60 61 if (getBase() instanceof Precedence && 62 ((Precedence)getBase()).getPrecedence() < getPrecedence()) 63 leftOp = "(" + leftOp + ")"; 64 return leftOp + rightString; 65 } 66 67 public String toString() 68 { 69 StringBuffer buffer = new StringBuffer (); 70 71 buffer.append("." + methodRef.getSignature() + "("); 72 73 for(int i = 0; i < argBoxes.length; i++) 74 { 75 if(i != 0) 76 buffer.append(", "); 77 78 buffer.append(argBoxes[i].getValue().toString()); 79 } 80 81 buffer.append(")"); 82 83 return toString(getBase(), getBase().toString(), 84 buffer.toString()); 85 } 86 87 public void toString(UnitPrinter up) 88 { 89 if( PrecedenceTest.needsBrackets( baseBox, this ) ) up.literal("("); 90 baseBox.toString(up); 91 if( PrecedenceTest.needsBrackets( baseBox, this ) ) up.literal(")"); 92 up.literal("."); 93 up.methodRef(methodRef); 94 up.literal("("); 95 96 for(int i = 0; i < argBoxes.length; i++) 97 { 98 if(i != 0) 99 up.literal(", "); 100 101 argBoxes[i].toString(up); 102 } 103 104 up.literal(")"); 105 } 106 107 108 public Object clone() 109 { 110 ArrayList clonedArgs = new ArrayList(getArgCount()); 111 112 for(int i = 0; i < getArgCount(); i++) { 113 clonedArgs.add(i, Grimp.cloneIfNecessary(getArg(i))); 114 } 115 116 return new GSpecialInvokeExpr(Grimp.cloneIfNecessary(getBase()), 117 methodRef, clonedArgs); 118 } 119 } 120 121 | Popular Tags |