Removes the range between start and end from the Handler list that begins with the given element. @param firstHandler the beginning of a Handler list. May be null . @param start the start of the range to be removed. @param end the end of the range to be removed. Maybe null . @return
(final Handler firstHandler, final Label start, final Label end)
| 117 | * @return the exception handler list with the start-end range removed. |
| 118 | */ |
| 119 | static Handler removeRange(final Handler firstHandler, final Label start, final Label end) { |
| 120 | if (firstHandler == null) { |
| 121 | return null; |
| 122 | } else { |
| 123 | firstHandler.nextHandler = removeRange(firstHandler.nextHandler, start, end); |
| 124 | } |
| 125 | int handlerStart = firstHandler.startPc.bytecodeOffset; |
| 126 | int handlerEnd = firstHandler.endPc.bytecodeOffset; |
| 127 | int rangeStart = start.bytecodeOffset; |
| 128 | int rangeEnd = end == null ? Integer.MAX_VALUE : end.bytecodeOffset; |
| 129 | // Return early if [handlerStart,handlerEnd[ and [rangeStart,rangeEnd[ don't intersect. |
| 130 | if (rangeStart >= handlerEnd || rangeEnd <= handlerStart) { |
| 131 | return firstHandler; |
| 132 | } |
| 133 | if (rangeStart <= handlerStart) { |
| 134 | if (rangeEnd >= handlerEnd) { |
| 135 | // If [handlerStart,handlerEnd[ is included in [rangeStart,rangeEnd[, remove firstHandler. |
| 136 | return firstHandler.nextHandler; |
| 137 | } else { |
| 138 | // [handlerStart,handlerEnd[ - [rangeStart,rangeEnd[ = [rangeEnd,handlerEnd[ |
| 139 | return new Handler(firstHandler, end, firstHandler.endPc); |
| 140 | } |
| 141 | } else if (rangeEnd >= handlerEnd) { |
| 142 | // [handlerStart,handlerEnd[ - [rangeStart,rangeEnd[ = [handlerStart,rangeStart[ |
| 143 | return new Handler(firstHandler, firstHandler.startPc, start); |
| 144 | } else { |
| 145 | // [handlerStart,handlerEnd[ - [rangeStart,rangeEnd[ = |
| 146 | // [handlerStart,rangeStart[ + [rangeEnd,handerEnd[ |
| 147 | firstHandler.nextHandler = new Handler(firstHandler, end, firstHandler.endPc); |
| 148 | return new Handler(firstHandler, firstHandler.startPc, start); |
| 149 | } |
| 150 | } |
| 151 | |
| 152 | /** |
| 153 | * Returns the number of elements of the Handler list that begins with the given element. |