diff --git a/lib/compiler.js b/lib/compiler.js index 6a14076..ed7bf1d 100644 --- a/lib/compiler.js +++ b/lib/compiler.js @@ -1020,37 +1020,39 @@ PEG.Grammar.Action.prototype.compile = function(resultVar) { var expressionResultVar = PEG.Compiler.generateUniqueIdentifier("result"); - var paramCount = this._expression instanceof PEG.Grammar.Sequence - ? this._expression.getElements().length - : 1; - - var params = PEG.ArrayUtils.map( - PEG.ArrayUtils.range(1, paramCount + 1), - function(n) { return "$" + n; } - ).join(", "); - - var actionFunction = PEG.Compiler.formatCode( - "function(${params}) { ${action} }", - { - params: params, - action: this._action - } - ); - - var invokeFunctionName = this._expression instanceof PEG.Grammar.Sequence - ? "apply" - : "call"; + if (this._expression instanceof PEG.Grammar.Sequence) { + var params = PEG.ArrayUtils.map( + PEG.ArrayUtils.range(1, this._expression.getElements().length + 1), + function(n) { return "$" + n; } + ).join(", "); + + var invocationCode = PEG.Compiler.formatCode( + "(function(${params}) { ${action} }).apply(null, ${expressionResultVar})", + { + params: params, + action: this._action, + expressionResultVar: expressionResultVar + } + ); + } else { + var invocationCode = PEG.Compiler.formatCode( + "(function($1) { ${action} })(${expressionResultVar})", + { + action: this._action, + expressionResultVar: expressionResultVar + } + ); + } return PEG.Compiler.formatCode( "${expressionCode}", "var ${resultVar} = ${expressionResultVar} !== null", - " ? (${actionFunction}).${invokeFunctionName}(this, ${expressionResultVar})", + " ? ${invocationCode}", " : null;", { expressionCode: this._expression.compile(expressionResultVar), expressionResultVar: expressionResultVar, - actionFunction: actionFunction, - invokeFunctionName: invokeFunctionName, + invocationCode: invocationCode, resultVar: resultVar } );