Пример #1
0
  @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);
   }
 }