Package com.dragome.compiler.graph

Examples of com.dragome.compiler.graph.Node


      if (stmt instanceof JumpSubRoutine)
      {
        JumpSubRoutine jsr= (JumpSubRoutine) stmt;
        cNode.block.setEndIndex(jsr.getEndIndex());

        Node finallyNode= graph.getNode(jsr.getTargetIndex());

        if (finallyNode == null)
        {

          finallyNode= graph.createNode(jsr.getTargetIndex());

          finallyNode.stack= new ASTNodeStack(new Expression());

        }
        finallyNode.jsrCallers.add(cNode);
        if (cNode.preds().size() == 1 && finallyNode.preds().size() == 0 && cNode.getPred() instanceof TryHeaderNode)
        {

          TryHeaderNode tryHeaderNode= (TryHeaderNode) cNode.getPred();

          tryHeaderNode.setFinallyNode(finallyNode);
        }

      }
      else if (stmt instanceof ConditionalBranch)
      {
        ConditionalBranch cond= (ConditionalBranch) stmt;

        if (bytes.getIndex() == cond.getTargetIndex())
        {

        }
        else
        {
          Node elseNode= graph.getOrCreateNode(bytes.getIndex());

          Node ifNode;
          if (cond.getTargetIndex() <= pc)
          {
            Node[] nodes= graph.getOrSplitNodeAt(cNode, cond.getTargetIndex());
            cNode= nodes[0];
            ifNode= nodes[1];
          }
          else
          {
            ifNode= graph.getOrCreateNode(cond.getTargetIndex());
          }

          BooleanExpression be= new BooleanExpression(cond.getExpression());

          graph.addIfElseEdge(cNode, ifNode, elseNode, be);
          expressionsToVariables(cNode, false);
          cNode= null;

          if (lastJump != null && tryStatements.size() > 0 && (cond.getBeginIndex() - 1 == lastJump.getEndIndex()))
            whileTryProblemDetected= true;

          for (TryStatement tryStatement : tryStatements)
          {
            boolean nextToTryBegining= tryStatement.getBeginIndex() - 1 == cond.getEndIndex();
            boolean sameThanTryBegining= tryStatement.getBeginIndex() == cond.getBeginIndex();
            //      sameThanTryBegining= false; //TODO identificar si es un while!
            if (nextToTryBegining || sameThanTryBegining)
              whileTryProblemDetected= true;
          }

          if (!whileTryProblemDetected)
            for (CodeException codeException : code.getExceptionTable())
            {
              boolean nextToTryBegining= codeException.getEndPC() == cond.getTargetIndex();
              if (nextToTryBegining)
                whileTryProblemDetected= true;
            }

          if (whileTryProblemDetected)
            throw new UnhandledCompilerProblemException();
        }
      }
      else if (stmt instanceof Jump)
      {
        int targetPc= ((Jump) stmt).getTargetIndex();
        lastJump= (Jump) stmt;
        Node targetNode;

        if (!whileTryProblemDetected)
          for (CodeException codeException : code.getExceptionTable())
          {
            boolean nextToTryBegining= codeException.getStartPC() - 1 == lastJump.getEndIndex();
View Full Code Here


      return;

    Iterator iter= nodes.iterator();
    while (iter.hasNext())
    {
      Node node= (Node) iter.next();
      dump(node.stack, node.toString());
    }
  }
View Full Code Here

  private SwitchEdge getOrCreateCaseGroup(Node header, Map<Integer, SwitchEdge> switchEdges, int startPc)
  {
    SwitchEdge switchEdge= switchEdges.get(startPc);
    if (switchEdge == null)
    {
      Node caseGroupNode= graph.createNode(startPc);
      switchEdge= (SwitchEdge) graph.addEdge(header, caseGroupNode, SwitchEdge.class);
      switchEdges.put(startPc, switchEdge);
    }

    return switchEdge;
View Full Code Here

      case Const.TABLESWITCH:

      case Const.LOOKUPSWITCH:
      {

        Node switchNode= graph.createNode(currentIndex);
        switchNode.isSwitchHeader= true;
        graph.addEdge(cNode, switchNode);
        cNode= null;

        int defaultOffset;
        int npairs;
        int offset;
        int remainder= bytes.getIndex() % 4;
        int noPadBytes= (remainder == 0) ? 0 : 4 - remainder;

        for (int i= 0; i < noPadBytes; i++)
        {
          byte b;

          if ((b= bytes.readByte()) != 0)
          {
            logger.warn("Padding byte != 0 in " + instructionType.getName() + ":" + b);
          }
        }

        defaultOffset= bytes.readInt();

        int low= 0;
        if (opcode == Const.LOOKUPSWITCH)
        {
          npairs= bytes.readInt();
          offset= bytes.getIndex() - 8 - noPadBytes - 1;
        }
        else
        {
          low= bytes.readInt();
          int high= bytes.readInt();
          npairs= high - low + 1;
          offset= bytes.getIndex() - 12 - noPadBytes - 1;
        }

        defaultOffset+= offset;

        switchNode.switchExpression= stack.pop();

        TreeMap<Integer, SwitchEdge> caseGroups= new TreeMap<Integer, SwitchEdge>();

        for (int i= 0; i < npairs; i++)
        {
          int key;
          if (opcode == Const.LOOKUPSWITCH)
          {
            key= bytes.readInt();
          }
          else
          {
            key= low + i;
          }

          SwitchEdge switchEdge= getOrCreateCaseGroup(switchNode, caseGroups, offset + bytes.readInt());
          switchEdge.expressions.add(NumberLiteral.create(new Integer(key)));
        }

        try
        {
          Node defaultNode= graph.createNode(defaultOffset);
          graph.addEdge(switchNode, defaultNode);
        }
        catch (Exception e)
        {
          setClassNotReversible(methodDecl);
View Full Code Here

TOP

Related Classes of com.dragome.compiler.graph.Node

Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.