@Override public void visitInvokeInst(Quad q) { ParamListOperand argList = Invoke.getParamList(q); RegisterOperand vo = Invoke.getDest(q); int args = argList.length(); // was args > 1 if (vo != null && args > 0) { Register v = vo.getRegister(); jq_Method meth = Invoke.getMethod(q).getMethod(); jq_Class cl = meth.getDeclaringClass(); if (v.getType().isReferenceType()) { // String mname = meth.getName().toString(); // System.out.println("INewColl inspecting call to " + mname); if (isCollectionType(cl) && !meth.isStatic()) { jq_Type destType = meth.getReturnType(); // System.out.println("INewColl saw call to " + meth + " returning " + destType); if (isCollectionType(destType)) { Register thisObj = Invoke.getParam(q, 0).getRegister(); int iID = domI.indexOf(q); int vID = domV.indexOf(v); int thisID = domV.indexOf(thisObj); super.add(iID, vID, thisID); } } } } }
public void fill() { DomM domM = (DomM) doms[0]; DomV domV = (DomV) doms[1]; DomH domH = (DomH) doms[2]; int numA = domH.getLastA() + 1; for (int hIdx = 1; hIdx < numA; hIdx++) { Quad q = (Quad) domH.get(hIdx); jq_Method m = q.getMethod(); int mIdx = domM.indexOf(m); assert (mIdx >= 0); Operator op = q.getOperator(); RegisterOperand vo; if (op instanceof New) vo = New.getDest(q); else if (op instanceof NewArray) vo = NewArray.getDest(q); else if (op instanceof Invoke) vo = Invoke.getDest(q); else if (op instanceof MultiNewArray) vo = NewArray.getDest(q); else { Messages.fatal("Unknown quad in domain H: " + q); vo = null; } Register v = vo.getRegister(); int vIdx = domV.indexOf(v); if (vIdx >= 0) add(mIdx, vIdx, hIdx); } }