in lucene-directory-v2/src/main/java/jetbrains/exodus/lucene2/XodusDirectory.java [1054:1124]
public int readVInt() throws IOException {
var pageOffset = (int) position & (pageSize - 1);
var pageAddress = fileAddress + position - pageOffset;
long remaining = Math.min(end - position, pageSize - pageOffset);
int positionOffset = 0;
if (5 <= remaining) {
readPageIfNeeded(pageAddress);
try {
pageOffset = (int) position & (pageSize - 1);
remaining = Math.min(end - position, pageSize - pageOffset);
if (remaining < 5) {
return super.readVInt();
}
byte b = page[pageOffset];
positionOffset++;
if (b >= 0) {
return b;
}
pageOffset++;
int i = b & 0x7F;
b = page[pageOffset];
positionOffset++;
i |= (b & 0x7F) << 7;
if (b >= 0) {
return i;
}
pageOffset++;
b = page[pageOffset];
positionOffset++;
i |= (b & 0x7F) << 14;
if (b >= 0) {
return i;
}
pageOffset++;
b = page[pageOffset];
positionOffset++;
i |= (b & 0x7F) << 21;
if (b >= 0) {
return i;
}
pageOffset++;
b = page[pageOffset];
positionOffset++;
// Warning: the next ands use 0x0F / 0xF0 - beware copy/paste errors:
i |= (b & 0x0F) << 28;
if ((b & 0xF0) == 0) {
return i;
}
} finally {
movePosition(positionOffset);
}
throw new IOException("Invalid vInt detected (too many bits)");
} else {
return super.readVInt();
}
}