diff --git a/lib/compiler/passes/generate-javascript.js b/lib/compiler/passes/generate-javascript.js index fb159e7..10b0f77 100644 --- a/lib/compiler/passes/generate-javascript.js +++ b/lib/compiler/passes/generate-javascript.js @@ -887,8 +887,7 @@ function generateJavascript(ast, options) { '', ' peg$currPos = 0,', ' peg$savedPos = 0,', - ' peg$cachedPos = 0,', - ' peg$cachedPosDetails = { line: 1, column: 1, seenCR: false },', + ' peg$posDetailsCache = [{ line: 1, column: 1, seenCR: false }],', ' peg$maxFailPos = 0,', ' peg$maxFailExpected = [],', ' peg$silentFails = 0,', // 0 = report failures, > 0 = silence failures @@ -979,10 +978,25 @@ function generateJavascript(ast, options) { ' }', '', ' function peg$computePosDetails(pos) {', - ' function advance(details, startPos, endPos) {', - ' var p, ch;', + ' var details = peg$posDetailsCache[pos],', + ' p, ch;', '', - ' for (p = startPos; p < endPos; p++) {', + ' if (details) {', + ' return details;', + ' } else {', + ' p = pos - 1;', + ' while (!peg$posDetailsCache[p]) {', + ' p--;', + ' }', + '', + ' details = peg$posDetailsCache[p];', + ' details = {', + ' line: details.line,', + ' column: details.column,', + ' seenCR: details.seenCR', + ' };', + '', + ' while (p < pos) {', ' ch = input.charAt(p);', ' if (ch === "\\n") {', ' if (!details.seenCR) { details.line++; }', @@ -996,23 +1010,13 @@ function generateJavascript(ast, options) { ' details.column++;', ' details.seenCR = false;', ' }', - ' }', - ' }', '', - ' if (peg$cachedPos !== pos) {', - ' if (peg$cachedPos > pos) {', - ' peg$cachedPos = 0;', - ' peg$cachedPosDetails = { line: 1, column: 1, seenCR: false };', + ' p++', ' }', - ' advance(peg$cachedPosDetails, peg$cachedPos, pos);', - ' peg$cachedPos = pos;', - ' }', '', - ' return {', - ' line: peg$cachedPosDetails.line,', - ' column: peg$cachedPosDetails.column,', - ' seenCR: peg$cachedPosDetails.seenCR', - ' };', + ' peg$posDetailsCache[pos] = details;', + ' return details', + ' }', ' }', '', ' function peg$computeLocation(startPos, endPos) {', diff --git a/lib/parser.js b/lib/parser.js index 290c013..22cf052 100644 --- a/lib/parser.js +++ b/lib/parser.js @@ -375,8 +375,7 @@ module.exports = (function() { peg$currPos = 0, peg$savedPos = 0, - peg$cachedPos = 0, - peg$cachedPosDetails = { line: 1, column: 1, seenCR: false }, + peg$posDetailsCache = [{ line: 1, column: 1, seenCR: false }], peg$maxFailPos = 0, peg$maxFailExpected = [], peg$silentFails = 0, @@ -418,10 +417,25 @@ module.exports = (function() { } function peg$computePosDetails(pos) { - function advance(details, startPos, endPos) { - var p, ch; + var details = peg$posDetailsCache[pos], + p, ch; - for (p = startPos; p < endPos; p++) { + if (details) { + return details; + } else { + p = pos - 1; + while (!peg$posDetailsCache[p]) { + p--; + } + + details = peg$posDetailsCache[p]; + details = { + line: details.line, + column: details.column, + seenCR: details.seenCR + }; + + while (p < pos) { ch = input.charAt(p); if (ch === "\n") { if (!details.seenCR) { details.line++; } @@ -435,23 +449,13 @@ module.exports = (function() { details.column++; details.seenCR = false; } - } - } - if (peg$cachedPos !== pos) { - if (peg$cachedPos > pos) { - peg$cachedPos = 0; - peg$cachedPosDetails = { line: 1, column: 1, seenCR: false }; + p++ } - advance(peg$cachedPosDetails, peg$cachedPos, pos); - peg$cachedPos = pos; - } - return { - line: peg$cachedPosDetails.line, - column: peg$cachedPosDetails.column, - seenCR: peg$cachedPosDetails.seenCR - }; + peg$posDetailsCache[pos] = details; + return details + } } function peg$computeLocation(startPos, endPos) {