From 002fd53e8e8682ec519dcbbd0a50f826e2026d79 Mon Sep 17 00:00:00 2001 From: Havoc Pennington Date: Tue, 6 Dec 2011 15:11:17 -0500 Subject: [PATCH] in tokenizer precompute the lineOrigin We know we need it on every line now because we use it for the newline token. So no advantage to doing it on-demand. Better to share among all tokens on the line. --- .../com/typesafe/config/impl/Tokenizer.java | 28 +++++++++---------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/config/src/main/java/com/typesafe/config/impl/Tokenizer.java b/config/src/main/java/com/typesafe/config/impl/Tokenizer.java index 83464c65..b90cba92 100644 --- a/config/src/main/java/com/typesafe/config/impl/Tokenizer.java +++ b/config/src/main/java/com/typesafe/config/impl/Tokenizer.java @@ -111,20 +111,22 @@ final class Tokenizer { } } - final private ConfigOrigin origin; + final private SimpleConfigOrigin origin; final private Reader input; final private LinkedList buffer; private int lineNumber; + private ConfigOrigin lineOrigin; final private Queue tokens; final private WhitespaceSaver whitespaceSaver; final private boolean allowComments; TokenIterator(ConfigOrigin origin, Reader input, boolean allowComments) { - this.origin = origin; + this.origin = (SimpleConfigOrigin) origin; this.input = input; this.allowComments = allowComments; this.buffer = new LinkedList(); lineNumber = 1; + lineOrigin = this.origin.setLineNumber(lineNumber); tokens = new LinkedList(); tokens.add(Tokens.START); whitespaceSaver = new WhitespaceSaver(); @@ -233,12 +235,12 @@ final class Tokenizer { } private ProblemException problem(String what, String message, Throwable cause) { - return problem(lineOrigin(), what, message, cause); + return problem(lineOrigin, what, message, cause); } private ProblemException problem(String what, String message, boolean suggestQuotes, Throwable cause) { - return problem(lineOrigin(), what, message, suggestQuotes, cause); + return problem(lineOrigin, what, message, suggestQuotes, cause); } private static ProblemException problem(ConfigOrigin origin, String what, @@ -260,10 +262,6 @@ final class Tokenizer { return problem(origin, "", message, null); } - private ConfigOrigin lineOrigin() { - return lineOrigin(origin, lineNumber); - } - private static ConfigOrigin lineOrigin(ConfigOrigin baseOrigin, int lineNumber) { return ((SimpleConfigOrigin) baseOrigin).setLineNumber(lineNumber); @@ -281,7 +279,7 @@ final class Tokenizer { // that parses as JSON is treated the JSON way and otherwise // we assume it's a string and let the parser sort it out. private Token pullUnquotedText() { - ConfigOrigin origin = lineOrigin(); + ConfigOrigin origin = lineOrigin; StringBuilder sb = new StringBuilder(); int c = nextCharSkippingComments(); while (true) { @@ -338,11 +336,10 @@ final class Tokenizer { try { if (containedDecimalOrE) { // force floating point representation - return Tokens.newDouble(lineOrigin(), - Double.parseDouble(s), s); + return Tokens.newDouble(lineOrigin, Double.parseDouble(s), s); } else { // this should throw if the integer is too large for Long - return Tokens.newLong(lineOrigin(), Long.parseLong(s), s); + return Tokens.newLong(lineOrigin, Long.parseLong(s), s); } } catch (NumberFormatException e) { throw problem(s, "Invalid number: '" + s + "'", true /* suggestQuotes */, e); @@ -426,12 +423,12 @@ final class Tokenizer { sb.appendCodePoint(c); } } while (c != '"'); - return Tokens.newString(lineOrigin(), sb.toString()); + return Tokens.newString(lineOrigin, sb.toString()); } private Token pullSubstitution() throws ProblemException { // the initial '$' has already been consumed - ConfigOrigin origin = lineOrigin(); + ConfigOrigin origin = lineOrigin; int c = nextCharSkippingComments(); if (c != '{') { throw problem(asString(c), "'$' not followed by {, '" + asString(c) @@ -479,8 +476,9 @@ final class Tokenizer { return Tokens.END; } else if (c == '\n') { // newline tokens have the just-ended line number - Token line = Tokens.newLine(lineOrigin()); // uses lineNumber + Token line = Tokens.newLine(lineOrigin); lineNumber += 1; + lineOrigin = origin.setLineNumber(lineNumber); return line; } else { Token t = null;