Skip to content
Snippets Groups Projects
Commit 0e137c4d authored by Shawn Pearce's avatar Shawn Pearce
Browse files

Micro-optimize CanonicalTreeParser next() for ObjectWalk


ObjectWalk is invoking next() for each record we consider in a tree.
Rather than doing several method calls against the current parser,
and testing if we are at eof() at least twice per next() invocation,
do it only once and inline the logic to move the parser forward.

Change-Id: If5938f5d7b3ca24f500a184c9bd2ef193015414e
Signed-off-by: default avatarShawn O. Pearce <spearce@spearce.org>
parent db54736e
No related branches found
No related tags found
No related merge requests found
/*
* Copyright (C) 2008-2009, Google Inc.
* Copyright (C) 2008-2010, Google Inc.
* Copyright (C) 2008, Shawn O. Pearce <spearce@spearce.org>
* and other copyright owners as documented in the project's IP log.
*
......@@ -122,7 +122,9 @@ public void reset(final byte[] treeData) {
raw = treeData;
prevPtr = -1;
currPtr = 0;
if (!eof())
if (eof())
nextPtr = 0;
else
parseEntry();
}
......@@ -159,15 +161,19 @@ public CanonicalTreeParser resetRoot(final Repository repo,
public CanonicalTreeParser next() {
CanonicalTreeParser p = this;
for (;;) {
p.next(1);
if (p.eof() && p.parent != null) {
// Parent was left pointing at the entry for us; advance
// the parent to the next entry, possibly unwinding many
// levels up the tree.
//
if (p.nextPtr == p.raw.length) {
// This parser has reached EOF, return to the parent.
if (p.parent == null) {
p.currPtr = p.nextPtr;
return p;
}
p = (CanonicalTreeParser) p.parent;
continue;
}
p.prevPtr = p.currPtr;
p.currPtr = p.nextPtr;
p.parseEntry();
return p;
}
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment