Rename and generalize |generateCache{Header,Footer}|

Rename |generateCache{Header,Footer}| to |generateRule{Header,Footer}|
and change their responsibility to generate overall header/footer of a
rule function (when optimizing for speed) or the |peg$parseRule|
function (when optimizing for speed). This creates a natural place where
to generate tracing code (coming soon).
redux
David Majda 9 years ago
parent fb5f6c6ee9
commit 675561f085

@ -37,24 +37,40 @@ function generateJavascript(ast, options) {
} }
} }
function generateCacheHeader(ruleIndexCode) { function generateRuleHeader(ruleIndexCode) {
return [ if (options.cache) {
'var key = peg$currPos * ' + ast.rules.length + ' + ' + ruleIndexCode + ',', return [
' cached = peg$cache[key];', '',
'', 'var key = peg$currPos * ' + ast.rules.length + ' + ' + ruleIndexCode + ',',
'if (cached) {', ' cached = peg$cache[key];',
' peg$currPos = cached.nextPos;', '',
' return cached.result;', 'if (cached) {',
'}', ' peg$currPos = cached.nextPos;',
'' ' return cached.result;',
].join('\n'); '}',
''
].join('\n');
} else {
return '';
}
} }
function generateCacheFooter(resultCode) { function generateRuleFooter(resultCode) {
return [ var parts = [];
if (options.cache) {
parts.push([
'',
'peg$cache[key] = { nextPos: peg$currPos, result: ' + resultCode + ' };'
].join('\n'));
}
parts.push([
'', '',
'peg$cache[key] = { nextPos: peg$currPos, result: ' + resultCode + ' };' 'return ' + resultCode + ';'
].join('\n'); ].join('\n'));
return parts.join('\n');
} }
function generateInterpreter() { function generateInterpreter() {
@ -140,12 +156,9 @@ function generateJavascript(ast, options) {
' ends = [],', ' ends = [],',
' stack = [],', ' stack = [],',
' params, i;', ' params, i;',
''
].join('\n')); ].join('\n'));
if (options.cache) { parts.push(indent2(generateRuleHeader('index')));
parts.push(indent2(generateCacheHeader('index')));
}
parts.push([ parts.push([
/* /*
@ -324,15 +337,8 @@ function generateJavascript(ast, options) {
' }' ' }'
].join('\n')); ].join('\n'));
if (options.cache) { parts.push(indent2(generateRuleFooter('stack[0]')));
parts.push(indent2(generateCacheFooter('stack[0]'))); parts.push('}');
}
parts.push([
'',
' return stack[0];',
'}'
].join('\n'));
return parts.join('\n'); return parts.join('\n');
} }
@ -649,26 +655,13 @@ function generateJavascript(ast, options) {
parts.push([ parts.push([
'function peg$parse' + rule.name + '() {', 'function peg$parse' + rule.name + '() {',
' var ' + arrays.map(arrays.range(0, stack.maxSp + 1), s).join(', ') + ';', ' var ' + arrays.map(arrays.range(0, stack.maxSp + 1), s).join(', ') + ';',
''
].join('\n')); ].join('\n'));
if (options.cache) { parts.push(indent2(generateRuleHeader(asts.indexOfRule(ast, rule.name))));
parts.push(indent2(
generateCacheHeader(asts.indexOfRule(ast, rule.name))
));
}
parts.push(indent2(code)); parts.push(indent2(code));
parts.push(indent2(generateRuleFooter(s(0))));
if (options.cache) { parts.push('}');
parts.push(indent2(generateCacheFooter(s(0))));
}
parts.push([
'',
' return ' + s(0) + ';',
'}'
].join('\n'));
return parts.join('\n'); return parts.join('\n');
} }

Loading…
Cancel
Save