Пример #1
0
 private static FatBlock newFatBlock(int startNodeIndex, int endNodeIndex) {
   FatBlock fb = new FatBlock();
   fb.realBlock = new Block(startNodeIndex, endNodeIndex);
   return fb;
 }
Пример #2
0
  private static Block[] buildBlocks(Node[] statementNodes) {
    // a mapping from each target node to the block it begins
    Map<Node, FatBlock> theTargetBlocks = new HashMap<Node, FatBlock>();
    ObjArray theBlocks = new ObjArray();

    // there's a block that starts at index 0
    int beginNodeIndex = 0;

    for (int i = 0; i < statementNodes.length; i++) {
      switch (statementNodes[i].getType()) {
        case Token.TARGET:
          {
            if (i != beginNodeIndex) {
              FatBlock fb = newFatBlock(beginNodeIndex, i - 1);
              if (statementNodes[beginNodeIndex].getType() == Token.TARGET)
                theTargetBlocks.put(statementNodes[beginNodeIndex], fb);
              theBlocks.add(fb);
              // start the next block at this node
              beginNodeIndex = i;
            }
          }
          break;
        case Token.IFNE:
        case Token.IFEQ:
        case Token.GOTO:
          {
            FatBlock fb = newFatBlock(beginNodeIndex, i);
            if (statementNodes[beginNodeIndex].getType() == Token.TARGET)
              theTargetBlocks.put(statementNodes[beginNodeIndex], fb);
            theBlocks.add(fb);
            // start the next block at the next node
            beginNodeIndex = i + 1;
          }
          break;
      }
    }

    if (beginNodeIndex != statementNodes.length) {
      FatBlock fb = newFatBlock(beginNodeIndex, statementNodes.length - 1);
      if (statementNodes[beginNodeIndex].getType() == Token.TARGET)
        theTargetBlocks.put(statementNodes[beginNodeIndex], fb);
      theBlocks.add(fb);
    }

    // build successor and predecessor links

    for (int i = 0; i < theBlocks.size(); i++) {
      FatBlock fb = (FatBlock) (theBlocks.get(i));

      Node blockEndNode = statementNodes[fb.realBlock.itsEndNodeIndex];
      int blockEndNodeType = blockEndNode.getType();

      if ((blockEndNodeType != Token.GOTO) && (i < (theBlocks.size() - 1))) {
        FatBlock fallThruTarget = (FatBlock) (theBlocks.get(i + 1));
        fb.addSuccessor(fallThruTarget);
        fallThruTarget.addPredecessor(fb);
      }

      if ((blockEndNodeType == Token.IFNE)
          || (blockEndNodeType == Token.IFEQ)
          || (blockEndNodeType == Token.GOTO)) {
        Node target = ((Jump) blockEndNode).target;
        FatBlock branchTargetBlock = theTargetBlocks.get(target);
        target.putProp(Node.TARGETBLOCK_PROP, branchTargetBlock.realBlock);
        fb.addSuccessor(branchTargetBlock);
        branchTargetBlock.addPredecessor(fb);
      }
    }

    Block[] result = new Block[theBlocks.size()];

    for (int i = 0; i < theBlocks.size(); i++) {
      FatBlock fb = (FatBlock) (theBlocks.get(i));
      Block b = fb.realBlock;
      b.itsSuccessors = fb.getSuccessors();
      b.itsPredecessors = fb.getPredecessors();
      b.itsBlockID = i;
      result[i] = b;
    }

    return result;
  }