From f47da5c6828ac072646b89c99e6398006a434628 Mon Sep 17 00:00:00 2001 From: David Majda Date: Tue, 6 Mar 2012 08:46:28 +0100 Subject: [PATCH] Fix a bug in param name fixup code for sequences --- src/passes.js | 2 +- test/passes-test.js | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/passes.js b/src/passes.js index 4cd19cf..773c40f 100644 --- a/src/passes.js +++ b/src/passes.js @@ -364,7 +364,7 @@ PEG.compiler.passes = { function fixup(name) { each(pluck(node.elements, "resultVar"), function(resultVar, i) { - if (env[name].substr(0, resultVar.length) === resultVar) { + if ((new RegExp("^" + resultVar + "(\\[\\d+\\])*$")).test(env[name])) { env[name] = node.resultVar + "[" + i + "]" + env[name].substr(resultVar.length); } diff --git a/test/passes-test.js b/test/passes-test.js index 46ab528..9e9104b 100644 --- a/test/passes-test.js +++ b/test/passes-test.js @@ -579,6 +579,16 @@ test("computes params", function() { d: "result0[1][2]", e: "result0[2]" } + }, + /* + * Regression tests for a bug where e.g. resultVar names like |result10| + * were incorrectly treated as names derived from |result1|, leading to + * incorrect substitution. + */ + { + grammar: 'start = ("a" "b" "c" "d" "e" "f" "g" "h" "i" j:"j" { })*', + extractor: extractExpression, + params: { j: "result1[9]" } // Buggy code put "result1[0]0" here. } ];