Package com.dragome.compiler.ast

Examples of com.dragome.compiler.ast.TryStatement


  private TryStatement selectTryStatement(Node node)
  {
    int pc= node.getInitialPc();
    for (int i= 0; i < tryStatements.size(); i++)
    {
      TryStatement tryStmt= (TryStatement) tryStatements.get(i);
      Block block= tryStmt.getTryBlock();
      if (pc >= block.getBeginIndex() && pc <= block.getEndIndex())
        return tryStmt;
    }
    return null;
  }
View Full Code Here


  private void processTrys()
  {
    for (int i= 0; i < tryStatements.size(); i++)
    {
      TryStatement stmt= (TryStatement) tryStatements.get(i);
      TryHeaderNode header= stmt.header;
      Node tryNode= header.getTryBody();

      if (tryNode == sourceNode)
      {
        //    if (tryNode.getInEdges().size() > 1)
        //    {
        //        problemCounter++;
        //        throw new WhileTryProblemException();
        //    }
        //    else
        sourceNode= header;
      }

      for (Edge edge : new ArrayList<Edge>(tryNode.getInEdges()))
      {
        int pc= edge.source.getInitialPc();
        if (pc >= stmt.getBeginIndex() && pc <= stmt.getEndIndex())
          continue;
        if (edge.source == header)
          continue;
        edge.redirect(header);
      }
View Full Code Here

  private void processTrys2()
  {
    for (Node node : nodesByPc.values())
    {
      TryStatement sourceTry= selectTryStatement(node);
      if (sourceTry == null)
        continue;

      for (Edge edge : node.getOutEdges())
      {
        if (edge.target.getInEdges().size() != 1)
        {
          continue;
        }
        TryStatement targetTry= selectTryStatement(edge.target);
        if (targetTry == null || targetTry != sourceTry)
        {
          edge.reroot(sourceTry.header);
        }
      }
View Full Code Here

  private void processTrys1()
  {
    for (int i= 0; i < tryStatements.size(); i++)
    {
      TryStatement stmt= (TryStatement) tryStatements.get(i);
      TryHeaderNode header= stmt.header;
      Node finallyNode= header.getFinallyNode();
      if (finallyNode == null)
        continue;
View Full Code Here

  void rollOut_(Block block)
  {
    TryHeaderNode head= (TryHeaderNode) header;

    TryStatement stmt= head.getTryStatement();
    block.appendChild(stmt);

    graph.rollOut(tryBodyNode, stmt.getTryBlock());

    if (finallyNode != null)
    {
      stmt.setFinallyBlock(new Block());
      graph.rollOut(finallyNode, stmt.getFinallyBlock());
    }

    CatchClause cc= (CatchClause) stmt.getCatchStatements().getFirstChild();
    Iterator iter= catchNodes.iterator();
    while (iter.hasNext())
    {
      Node catchNode= (Node) iter.next();
      graph.rollOut(catchNode, cc);
View Full Code Here

  private void makeTryFrames()
  {
    for (int i= 0; i < tryStatements.size(); i++)
    {
      TryStatement tryStmt= tryStatements.get(i);
      makeTryFrame(tryStmt);
    }
  }
View Full Code Here

    {
      boolean hasFinally= false;
      int start= handle.getStartPC();
      int end= handle.getEndPC();

      TryStatement tryStmt= new TryStatement();
      tryStmt.header= (TryHeaderNode) graph.createNode(TryHeaderNode.class);
      tryStmt.header.tryStmt= tryStmt;

      Block tryBlock= new Block(start, end);
      tryStmt.setTryBlock(tryBlock);

      // tryStmt.setBeginIndex(start);

      tryStatements.add(tryStmt);

      CatchClause cStmt= null;

      // Collect all non-default handlers. The range of each handler is
      // from the 'store'-instruction to the beginning of the next
      // handler.
      while (handle != null && !handle.isDefault() && handle.getStartPC() == start && handle.getEndPC() == end)
      {
        if (cStmt != null)
        {
          cStmt.setEndIndex(handle.getHandlerPC() - 1);
        }
        cStmt= createCatchClause(tryStmt, handle);
        handle= handleIterator.hasNext() ? handleIterator.next() : null;
      }

      int foo= -1;
      if (handle != null && handle.isDefault() && handle.getStartPC() == start)
      {
        // Collect first default handler.
        hasFinally= true;
        if (cStmt != null)
        {
          cStmt.setEndIndex(handle.getHandlerPC() - 1);
          tryStmt.setEndIndex(handle.getHandlerPC() - 1);
          // Warning: We only set a lower bound for the end index. The
          // correct index is set later
          // when the finally statement is analysed.
        }
        cStmt= createCatchClause(tryStmt, handle);
        foo= handle.getHandlerPC();
        handle= handleIterator.hasNext() ? handleIterator.next() : null;
      }

      // Last catch stmt has no endIndex, yet!

      while (handle != null && handle.isDefault() && (handle.getHandlerPC() == foo))
      {
        // Skip all remaining default handlers.
        throw new RuntimeException("remaining default handlers");
        // handle = handleIterator.hasNext()?handleIterator.next():null;
      }

      Block catches= tryStmt.getCatchStatements();
      if (catches.getChildCount() == 0)
      {
        throw new ParseException("A try clause must have at least one (possibly default) catch clause", tryStmt);
      }
      cStmt= (CatchClause) catches.getChildAt(0);
      tryBlock.setEndIndex(cStmt.getBeginIndex() - 1);
      cStmt= (CatchClause) catches.getLastChild();
      if (cStmt.getEndIndex() == Integer.MIN_VALUE)
      {
        cStmt.setEndIndex(cStmt.getBeginIndex() + 1);
      }
      tryStmt.setEndIndex(cStmt.getEndIndex());

      if (hasFinally)
      {
        // Can't say yet where finally block is located.
      }
View Full Code Here

TOP

Related Classes of com.dragome.compiler.ast.TryStatement

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.