RawParseUtils#lineMap: Simplify by using null sentinel internally

Add an internal lineMapOrNull helper that returns null when the file
is binary.

This is simpler than using an exception for control flow and avoids
having to override fillInStackTrace to avoid a performance regression.

Change-Id: Ib8bb8df6a6bbd60c62cfb3b4c484a962a98b7507
This commit is contained in:
Jonathan Nieder 2018-05-14 08:54:01 -07:00
parent e9e150fdd2
commit 7d9246f163
1 changed files with 11 additions and 13 deletions

View File

@ -637,10 +637,8 @@ public static final int prevLF(final byte[] b, int ptr, final char chrA) {
* array as a single line if a '\0' is found.
*/
public static final IntList lineMap(final byte[] buf, int ptr, int end) {
IntList map;
try {
map = lineMapOrBinary(buf, ptr, end);
} catch (BinaryBlobException e) {
IntList map = lineMapOrNull(buf, ptr, end);
if (map == null) {
map = new IntList(3);
map.add(Integer.MIN_VALUE);
map.add(ptr);
@ -664,6 +662,14 @@ public static final IntList lineMap(final byte[] buf, int ptr, int end) {
*/
public static final IntList lineMapOrBinary(final byte[] buf, int ptr, int end)
throws BinaryBlobException {
IntList map = lineMapOrNull(buf, ptr, end);
if (map == null) {
throw new BinaryBlobException();
}
return map;
}
private static @Nullable IntList lineMapOrNull(byte[] buf, int ptr, int end) {
// Experimentally derived from multiple source repositories
// the average number of bytes/line is 36. Its a rough guess
// to initially size our map close to the target.
@ -676,15 +682,7 @@ public static final IntList lineMapOrBinary(final byte[] buf, int ptr, int end)
}
if (buf[ptr] == '\0') {
throw new BinaryBlobException() {
private static final long serialVersionUID = 1L;
@Override
public Throwable fillInStackTrace() {
return this;
}
};
return null;
}
foundLF = (buf[ptr] == '\n');