Skip to content

Commit 668d2fa

Browse files
committed
Simplify helper wrapper
This improves performance slightly and gives the wrapper function a more descriptive name to help with debugging/profiling.
1 parent e914d60 commit 668d2fa

File tree

3 files changed

+31
-35
lines changed

3 files changed

+31
-35
lines changed

lib/handlebars/helpers.js

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,3 +25,32 @@ export function moveHelperToHooks(instance, helperName, keepHelper) {
2525
}
2626
}
2727
}
28+
29+
export function mergeHelpers(env, options, container) {
30+
const mergedHelpers = {};
31+
addHelpers(mergedHelpers, env.helpers, container);
32+
addHelpers(mergedHelpers, options.helpers, container);
33+
return mergedHelpers;
34+
}
35+
36+
function addHelpers(mergedHelpers, helpers, container) {
37+
if (!helpers) return;
38+
Object.keys(helpers).forEach(helperName => {
39+
const helper = helpers[helperName];
40+
mergedHelpers[helperName] = passLookupPropertyOption(helper, container);
41+
});
42+
}
43+
44+
function passLookupPropertyOption(helper, container) {
45+
if (typeof helper !== 'function') {
46+
// This should not happen, but apparently it does in https://github.com/wycats/handlebars.js/issues/1639
47+
// We try to make the wrapper least-invasive by not wrapping it, if the helper is not a function.
48+
return helper;
49+
}
50+
const lookupProperty = container.lookupProperty;
51+
return function invokeHelper(/* dynamic arguments */) {
52+
const options = arguments[arguments.length - 1];
53+
options.lookupProperty = lookupProperty;
54+
return helper.apply(this, arguments);
55+
};
56+
}

lib/handlebars/internal/wrapHelper.js

Lines changed: 0 additions & 13 deletions
This file was deleted.

lib/handlebars/runtime.js

Lines changed: 2 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,7 @@ import {
66
LAST_COMPATIBLE_COMPILER_REVISION,
77
REVISION_CHANGES
88
} from './base';
9-
import { moveHelperToHooks } from './helpers';
10-
import { wrapHelper } from './internal/wrapHelper';
9+
import { mergeHelpers, moveHelperToHooks } from './helpers';
1110
import {
1211
createProtoAccessControl,
1312
resultIsAllowed
@@ -240,10 +239,7 @@ export function template(templateSpec, env) {
240239

241240
ret._setup = function(options) {
242241
if (!options.partial) {
243-
let mergedHelpers = {};
244-
addHelpers(mergedHelpers, env.helpers, container);
245-
addHelpers(mergedHelpers, options.helpers, container);
246-
container.helpers = mergedHelpers;
242+
container.helpers = mergeHelpers(env, options, container);
247243

248244
if (templateSpec.usePartial) {
249245
// Use mergeIfNeeded here to prevent compiling global partials multiple times
@@ -421,19 +417,3 @@ function executeDecorators(fn, prog, container, depths, data, blockParams) {
421417
}
422418
return prog;
423419
}
424-
425-
function addHelpers(mergedHelpers, helpers, container) {
426-
if (!helpers) return;
427-
Object.keys(helpers).forEach(helperName => {
428-
let helper = helpers[helperName];
429-
mergedHelpers[helperName] = passLookupPropertyOption(helper, container);
430-
});
431-
}
432-
433-
function passLookupPropertyOption(helper, container) {
434-
const lookupProperty = container.lookupProperty;
435-
return wrapHelper(helper, options => {
436-
options.lookupProperty = lookupProperty;
437-
return options;
438-
});
439-
}

0 commit comments

Comments
 (0)