1 19 20 package edu.umd.cs.findbugs.ba; 21 22 import java.util.IdentityHashMap ; 23 import java.util.LinkedList ; 24 import java.util.List ; 25 26 import org.apache.bcel.generic.CodeExceptionGen; 27 import org.apache.bcel.generic.InstructionHandle; 28 import org.apache.bcel.generic.MethodGen; 29 30 39 public class ExceptionHandlerMap { 40 private IdentityHashMap <InstructionHandle, List <CodeExceptionGen>> codeToHandlerMap; 41 private IdentityHashMap <InstructionHandle, CodeExceptionGen> startInstructionToHandlerMap; 42 43 48 public ExceptionHandlerMap(MethodGen methodGen) { 49 codeToHandlerMap = new IdentityHashMap <InstructionHandle, List <CodeExceptionGen>>(); 50 startInstructionToHandlerMap = new IdentityHashMap <InstructionHandle, CodeExceptionGen>(); 51 build(methodGen); 52 } 53 54 65 public List <CodeExceptionGen> getHandlerList(InstructionHandle handle) { 66 return codeToHandlerMap.get(handle); 67 } 68 69 77 public CodeExceptionGen getHandlerForStartInstruction(InstructionHandle start) { 78 return startInstructionToHandlerMap.get(start); 79 } 80 81 private void build(MethodGen methodGen) { 82 CodeExceptionGen[] handlerList = methodGen.getExceptionHandlers(); 83 84 for (CodeExceptionGen exceptionHandler : handlerList) { 86 startInstructionToHandlerMap.put(exceptionHandler.getHandlerPC(), exceptionHandler); 87 } 88 89 InstructionHandle handle = methodGen.getInstructionList().getStart(); 91 while (handle != null) { 92 int offset = handle.getPosition(); 93 94 handlerLoop: 95 for (CodeExceptionGen exceptionHandler : handlerList) { 96 int startOfRange = exceptionHandler.getStartPC().getPosition(); 97 int endOfRange = exceptionHandler.getEndPC().getPosition(); 98 99 if (offset >= startOfRange && offset <= endOfRange) { 100 addHandler(handle, exceptionHandler); 102 103 if (Hierarchy.isUniversalExceptionHandler(exceptionHandler.getCatchType())) 108 break handlerLoop; 109 } 110 } 111 112 handle = handle.getNext(); 113 } 114 } 115 116 private void addHandler(InstructionHandle handle, CodeExceptionGen exceptionHandler) { 117 List <CodeExceptionGen> handlerList = codeToHandlerMap.get(handle); 118 if (handlerList == null) { 119 handlerList = new LinkedList <CodeExceptionGen>(); 120 codeToHandlerMap.put(handle, handlerList); 121 } 122 handlerList.add(exceptionHandler); 123 } 124 } 125 126 | Popular Tags |