Package com.android.dx.dex.code

Examples of com.android.dx.dex.code.CatchTable


    DalvInsnList instructions= code.getInsns();
    codeElement.setAttribute("register-size", String.valueOf(instructions.getRegistersSize()));
    processLocals(instructions.getRegistersSize(), isStatic, parseClassName(cf.getThisClass().getClassType().getClassName()).toString(), meth.getPrototype().getParameterTypes(), codeElement);
    Map<Integer, SwitchData> switchDataBlocks= extractSwitchData(instructions);
    Map<Integer, ArrayData> arrayData= extractArrayData(instructions);
    CatchTable catches= code.getCatches();
    processCatchTable(catches, codeElement);
    Map<Integer, Target> targets= extractTargets(instructions, catches);

    // For each entry in the catch table, we create a try-catch element,
    // including the try and all the catch children and append it to the
    // code element. We store the try elements in a list, in order to
    // append the matching instructions to them as they are processed.
    List<Element> tryElements= new ArrayList<Element>();
    Map<Integer, Element> tryCatchElements= new HashMap<Integer, Element>();
    for (int i= 0; i < catches.size(); ++i)
    {
      Element tryCatchElement= new Element("try-catch", NS_DEX);
      Element tryElement= new Element("try", NS_DEX);
      tryCatchElement.addContent(tryElement);
      tryElements.add(tryElement);

      // For each handler create a catch element as the child of the
      // try-catch element.
      CatchHandlerList handlers= catches.get(i).getHandlers();
      for (int j= 0; j < handlers.size(); ++j)
      {
        String exceptionType= handlers.get(j).getExceptionType().toHuman();

        // We can remove the exception because a red type exception
        // will never be created or thrown.
        // This change is in sync with the one in processCatchTable
        if (!isRedType(exceptionType))
        {
          Element catchElement= new Element("catch", NS_DEX);
          catchElement.setAttribute("exception-type", exceptionType);
          catchElement.setAttribute("target", String.valueOf(handlers.get(j).getHandler()));
          tryCatchElement.addContent(catchElement);
        }
      }
      tryCatchElements.put(catches.get(i).getStart(), tryCatchElement);
    }

    Element lastTryCatchElement= null;

    // Used inside processInstruction to mark source file lines as
    // already added, so they don't get added twice.
    List<Integer> sourceLinesAlreadyPut= new ArrayList<Integer>();
    // Process every single instruction of this method. Either add it do
    // the main code element, or to a try-catch block.
    for (int i= 0; i < instructions.size(); ++i)
    {
      Element instructionParent= codeElement;
      DalvInsn instruction= instructions.get(i);
      int address= instruction.getAddress();

      // Determine whether to add the next instruction to the
      // codeElement or to a try block.
      Entry currentCatch= null;
      int tryElementIndex= 0;
      for (tryElementIndex= 0; tryElementIndex < catches.size(); ++tryElementIndex)
      {
        if (isInstructionInCatchRange(instruction, catches.get(tryElementIndex)))
        {
          instructionParent= tryElements.get(tryElementIndex);
          currentCatch= catches.get(tryElementIndex);
          break;
        }
      }

      // Adds a label element for each target we extracted earlier.
View Full Code Here

TOP

Related Classes of com.android.dx.dex.code.CatchTable

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.