Esempio n. 1
0
  private void connectBranches(int noOfComponents, int unusedNodes) {
    if (noOfComponents > 1) {
      int destinationToRemove = random.nextInt(2);
      for (int i = 0; i < disconnectedBranches.size() - 3; i = i + 2) {
        if (random.nextBoolean()) {
          int sourceID = disconnectedBranches.get(i);
          int destinationRemovedID;
          if (destinationToRemove == 0) {
            destinationRemovedID =
                cfg.getVertex(sourceID).getNthSuccessor(destinationToRemove).getVertexID();
          } else {
            destinationRemovedID = disconnectedBranches.get(i + 1);
          }
          Debug.debugMessage(
              getClass(), "Removing edge " + sourceID + "=>" + destinationRemovedID, 4);
          cfg.removeEdge(sourceID, destinationRemovedID);

          int newDestinationID = disconnectedBranches.get(i + 2);
          Debug.debugMessage(getClass(), "Adding edge " + sourceID + "=>" + newDestinationID, 4);
          cfg.addEdge(sourceID, newDestinationID, BranchType.TAKEN);

          sourceID = disconnectedBranches.get(i + 3);
          Debug.debugMessage(
              getClass(), "Adding edge " + sourceID + "=>" + destinationRemovedID, 4);
          cfg.addEdge(sourceID, destinationRemovedID, BranchType.TAKEN);

        } else {
          Debug.debugMessage(
              getClass(),
              "Adding edge "
                  + disconnectedBranches.get(i + 1)
                  + "=>"
                  + disconnectedBranches.get(i + 2),
              4);
          cfg.addEdge(
              disconnectedBranches.get(i + 1), disconnectedBranches.get(i + 2), BranchType.TAKEN);
        }
      }
    }

    if (unusedNodes > 0) {
      addNonBranchComponents(unusedNodes);
      Debug.debugMessage(
          getClass(),
          "Adding edge "
              + disconnectedBranches.get(disconnectedBranches.size() - 1)
              + "=>"
              + disconnectedVertices.get(0),
          4);
      cfg.addEdge(
          disconnectedBranches.get(disconnectedBranches.size() - 1),
          disconnectedVertices.get(0),
          BranchType.TAKEN);
    }
  }
Esempio n. 2
0
  private void connectLoops() {
    for (int i = disconnectedLoops.getHeight() - 1; i > 0; --i) {
      Iterator<TreeVertex> it = disconnectedLoops.levelIterator(i);

      int childID = it.next().getVertexID();
      int parentID = disconnectedLoops.getVertex(childID).getParentID();

      Debug.debugMessage(getClass(), "Adding edge " + parentID + "=>" + childID, 4);
      cfg.addEdge(parentID, childID, BranchType.TAKEN);
      Debug.debugMessage(
          getClass(),
          "Adding edge "
              + childID
              + "=>"
              + cfg.getVertex(parentID).getNthSuccessor(0).getVertexID(),
          4);
      cfg.addEdge(
          childID, cfg.getVertex(parentID).getNthSuccessor(0).getVertexID(), BranchType.TAKEN);
      Debug.debugMessage(
          getClass(),
          "Removing edge "
              + parentID
              + "=>"
              + cfg.getVertex(parentID).getNthSuccessor(0).getVertexID(),
          4);
      cfg.removeEdge(parentID, cfg.getVertex(parentID).getNthSuccessor(0).getVertexID());

      while (it.hasNext()) {
        int nextChildID = it.next().getVertexID();
        int nextParentID = disconnectedLoops.getVertex(nextChildID).getParentID();

        if (parentID == nextParentID) {
          Debug.debugMessage(getClass(), "Adding edge " + parentID + "=>" + nextChildID, 4);
          cfg.addEdge(parentID, nextChildID, BranchType.TAKEN);
          Debug.debugMessage(getClass(), "Adding edge " + nextChildID + "=>" + childID, 4);
          cfg.addEdge(nextChildID, childID, BranchType.TAKEN);
          Debug.debugMessage(getClass(), "Removing edge " + parentID + "=>" + childID, 4);
          cfg.removeEdge(parentID, childID);
        } else {
          Debug.debugMessage(getClass(), "Adding edge " + nextParentID + "=>" + nextChildID, 4);
          cfg.addEdge(nextParentID, nextChildID, BranchType.TAKEN);
          Debug.debugMessage(
              getClass(),
              "Adding edge "
                  + nextChildID
                  + "=>"
                  + cfg.getVertex(nextParentID).getNthSuccessor(0).getVertexID(),
              4);
          cfg.addEdge(
              nextChildID,
              cfg.getVertex(nextParentID).getNthSuccessor(0).getVertexID(),
              BranchType.TAKEN);
          Debug.debugMessage(
              getClass(),
              "Removing edge "
                  + nextParentID
                  + "=>"
                  + cfg.getVertex(nextParentID).getNthSuccessor(0).getVertexID(),
              4);
          cfg.removeEdge(
              nextParentID, cfg.getVertex(nextParentID).getNthSuccessor(0).getVertexID());
          parentID = nextParentID;
        }
        childID = nextChildID;
      }
    }
  }