summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPatrick Hiesel <hiesel@google.com>2020-01-09 10:23:12 +0100
committerMatthias Sohn <matthias.sohn@sap.com>2020-01-09 18:38:02 +0100
commit6185db3d776f1064af1972b4ba2175a917c35ab3 (patch)
treeb639add2aeb235dd35db6135f49295bceec87f99
parent2b9dd32a828577bc1026ad53ec4f735a9b219022 (diff)
downloadjgit-6185db3d776f1064af1972b4ba2175a917c35ab3.tar.gz
jgit-6185db3d776f1064af1972b4ba2175a917c35ab3.zip
Replace usage of ArrayIndexOutOfBoundsException in treewalk
Using exceptions during normal operations - for example with the desire of expanding an array in the failure case - can have a severe performance impact. When exceptions are instantiated, a stack trace is collected. Generating stack trace can be expensive. Compared to that, checking an array for length - even if done many times - is cheap since this is a check that can run in just a handful of CPU cycles. Change-Id: Ifaf10623f6a876c9faecfa44654c9296315adfcb Signed-off-by: Patrick Hiesel <hiesel@google.com> Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/treewalk/AbstractTreeIterator.java6
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/treewalk/CanonicalTreeParser.java9
2 files changed, 6 insertions, 9 deletions
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/AbstractTreeIterator.java b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/AbstractTreeIterator.java
index 335abe1b5b..a3c93cf87a 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/AbstractTreeIterator.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/AbstractTreeIterator.java
@@ -239,12 +239,10 @@ public abstract class AbstractTreeIterator {
path = p.path;
pathOffset = p.pathLen + 1;
- try {
- path[pathOffset - 1] = '/';
- } catch (ArrayIndexOutOfBoundsException e) {
+ if (pathOffset > path.length) {
growPath(p.pathLen);
- path[pathOffset - 1] = '/';
}
+ path[pathOffset - 1] = '/';
}
/**
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/CanonicalTreeParser.java b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/CanonicalTreeParser.java
index 019968875d..b2d8fc3aa8 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/CanonicalTreeParser.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/CanonicalTreeParser.java
@@ -387,14 +387,13 @@ public class CanonicalTreeParser extends AbstractTreeIterator {
tmp = pathOffset;
for (;; tmp++) {
c = raw[ptr++];
- if (c == 0)
+ if (c == 0) {
break;
- try {
- path[tmp] = c;
- } catch (ArrayIndexOutOfBoundsException e) {
+ }
+ if (tmp >= path.length) {
growPath(tmp);
- path[tmp] = c;
}
+ path[tmp] = c;
}
pathLen = tmp;
nextPtr = ptr + OBJECT_ID_LENGTH;