Avoid local field accesses in nextString(char). This saves a modest 2%.

This commit is contained in:
Jesse Wilson 2011-12-14 06:07:40 +00:00
parent d01d39aa26
commit b7c3e0067c

View File

@ -991,40 +991,50 @@ public class JsonReader implements Closeable {
* malformed. * malformed.
*/ */
private String nextString(char quote) throws IOException { private String nextString(char quote) throws IOException {
// Like nextNonWhitespace, this uses locals 'p' and 'l' to save inner-loop field access.
char[] buffer = this.buffer;
StringBuilder builder = null; StringBuilder builder = null;
do { while (true) {
int p = pos;
int l = limit;
/* the index of the first character not yet appended to the builder. */ /* the index of the first character not yet appended to the builder. */
int start = pos; int start = p;
while (pos < limit) { while (p < l) {
int c = buffer[pos++]; int c = buffer[p++];
if (c == quote) { if (c == quote) {
pos = p;
if (skipping) { if (skipping) {
return "skipped!"; return "skipped!";
} else if (builder == null) { } else if (builder == null) {
return stringPool.get(buffer, start, pos - start - 1); return stringPool.get(buffer, start, p - start - 1);
} else { } else {
builder.append(buffer, start, pos - start - 1); builder.append(buffer, start, p - start - 1);
return builder.toString(); return builder.toString();
} }
} else if (c == '\\') { } else if (c == '\\') {
pos = p;
if (builder == null) { if (builder == null) {
builder = new StringBuilder(); builder = new StringBuilder();
} }
builder.append(buffer, start, pos - start - 1); builder.append(buffer, start, p - start - 1);
builder.append(readEscapeCharacter()); builder.append(readEscapeCharacter());
start = pos; p = pos;
l = limit;
start = p;
} }
} }
if (builder == null) { if (builder == null) {
builder = new StringBuilder(); builder = new StringBuilder();
} }
builder.append(buffer, start, pos - start); builder.append(buffer, start, p - start);
} while (fillBuffer(1)); pos = p;
if (!fillBuffer(1)) {
throw syntaxError("Unterminated string"); throw syntaxError("Unterminated string");
}
}
} }
/** /**