Skip to content

Commit 328db41

Browse files
committed
Refactor: Perform binary search on sorted methods
1 parent 671e7f9 commit 328db41

File tree

1 file changed

+14
-8
lines changed
  • substratevm/src/com.oracle.objectfile/src/com/oracle/objectfile/debugentry

1 file changed

+14
-8
lines changed

substratevm/src/com.oracle.objectfile/src/com/oracle/objectfile/debugentry/ClassEntry.java

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@
3030
import java.util.ArrayList;
3131
import java.util.HashMap;
3232
import java.util.List;
33-
import java.util.ListIterator;
3433
import java.util.Map;
3534

3635
import org.graalvm.compiler.debug.DebugContext;
@@ -340,12 +339,16 @@ public ClassEntry getSuperClass() {
340339

341340
public MethodEntry ensureMethodEntryForDebugRangeInfo(DebugRangeInfo debugRangeInfo, DebugInfoBase debugInfoBase, DebugContext debugContext) {
342341
assert listIsSorted(methods);
343-
ListIterator<MethodEntry> methodIterator = methods.listIterator();
344342
String methodName = debugInfoBase.uniqueDebugString(debugRangeInfo.name());
345343
String paramSignature = debugRangeInfo.paramSignature();
346344
String returnTypeName = debugRangeInfo.valueType();
347-
while (methodIterator.hasNext()) {
348-
MethodEntry methodEntry = methodIterator.next();
345+
/* Since the methods list is sorted we perform a binary search */
346+
int start = 0;
347+
int end = methods.size() - 1;
348+
assert end < (Integer.MAX_VALUE / 2);
349+
while (start <= end) {
350+
int middle = (start + end) / 2;
351+
MethodEntry methodEntry = methods.get(middle);
349352
int comparisonResult = methodEntry.compareTo(methodName, paramSignature, returnTypeName);
350353
if (comparisonResult == 0) {
351354
methodEntry.updateRangeInfo(debugInfoBase, debugRangeInfo);
@@ -354,13 +357,16 @@ public MethodEntry ensureMethodEntryForDebugRangeInfo(DebugRangeInfo debugRangeI
354357
indexLocalFileEntry(methodEntry.fileEntry);
355358
}
356359
return methodEntry;
357-
} else if (comparisonResult > 0) {
358-
methodIterator.previous();
359-
break;
360+
} else if (comparisonResult < 0) {
361+
start = middle + 1;
362+
} else {
363+
end = middle;
360364
}
361365
}
366+
assert start == (end + 1) : start + " != " + end + " + 1";
367+
assert start <= methods.size() : start + " > " + methods.size();
362368
MethodEntry newMethodEntry = processMethod(debugRangeInfo, debugInfoBase, debugContext);
363-
methodIterator.add(newMethodEntry);
369+
methods.add(start, newMethodEntry);
364370
return newMethodEntry;
365371
}
366372

0 commit comments

Comments
 (0)