Speed-up generation of debug information

This commit is contained in:
Alexey Andreev 2015-03-06 13:07:37 +04:00
parent 852589a4dd
commit 8d2e012f79

View File

@ -386,7 +386,7 @@ public class DebugInformation {
} }
private int indexByKey(RecordArray mapping, GeneratedLocation location) { private int indexByKey(RecordArray mapping, GeneratedLocation location) {
int index = Collections.binarySearch(new LocationList(mapping), location); int index = binarySearchLocation(mapping, location.getLine(), location.getColumn());
return index >= 0 ? index : -index - 2; return index >= 0 ? index : -index - 2;
} }
@ -598,7 +598,33 @@ public class DebugInformation {
return new GeneratedLocation(record.get(0), record.get(1)); return new GeneratedLocation(record.get(0), record.get(1));
} }
static class LocationList extends AbstractList<GeneratedLocation> { private int binarySearchLocation(RecordArray array, int row, int column) {
int l = 0;
int u = array.size() - 1;
while (true) {
int i = (l + u) / 2;
RecordArray.Record e = array.get(i);
int cmp = Integer.compare(row, e.get(0));
if (cmp == 0) {
cmp = Integer.compare(column, e.get(1));
}
if (cmp == 0) {
return i;
} else if (cmp < 0) {
u = i - 1;
if (u < l) {
return -i - 1;
}
} else {
l = i + 1;
if (l > u) {
return -i - 2;
}
}
}
}
static class LocationList extends AbstractList<GeneratedLocation> implements RandomAccess {
private RecordArray recordArray; private RecordArray recordArray;
public LocationList(RecordArray recordArray) { public LocationList(RecordArray recordArray) {