tpl: Put Go's internal template funcs in Hugo's map

```
name                            old time/op    new time/op    delta
SiteNew/Many_HTML_templates-16    43.4ms ± 0%    42.7ms ± 0%  -1.71%  (p=0.016 n=4+5)

name                            old alloc/op   new alloc/op   delta
SiteNew/Many_HTML_templates-16    17.5MB ± 0%    17.5MB ± 0%    ~     (p=0.690 n=5+5)

name                            old allocs/op  new allocs/op  delta
SiteNew/Many_HTML_templates-16      247k ± 0%      247k ± 0%    ~     (p=0.310 n=5+5)
```

Fixes #6717
This commit is contained in:
Bjørn Erik Pedersen 2020-01-07 10:23:24 +01:00
parent df6e9efd8f
commit 1cf235412f
No known key found for this signature in database
GPG key ID: 330E6E2BD4859D8F
3 changed files with 25 additions and 1 deletions

View file

@ -24,6 +24,9 @@ package is auto generated.
*/
// Export it so we can populate Hugo's func map with it, which makes it faster.
var GoFuncs = funcMap
// Prepare returns a template ready for execution.
func (t *Template) Prepare() (*template.Template, error) {
if err := t.escape(); err != nil {

View file

@ -29,6 +29,9 @@ package is auto generated.
*/
// Export it so we can populate Hugo's func map with it, which makes it faster.
var GoFuncs = builtinFuncs
// Preparer prepares the template before execution.
type Preparer interface {
Prepare() (*Template, error)

View file

@ -108,7 +108,25 @@ func newTemplateExecuter(d *deps.Deps) (texttemplate.Executer, map[string]reflec
funcsv := make(map[string]reflect.Value)
for k, v := range funcs {
funcsv[k] = reflect.ValueOf(v)
vv := reflect.ValueOf(v)
funcsv[k] = vv
}
// Duplicate Go's internal funcs here for faster lookups.
for k, v := range template.GoFuncs {
if _, exists := funcsv[k]; !exists {
vv, ok := v.(reflect.Value)
if !ok {
vv = reflect.ValueOf(v)
}
funcsv[k] = vv
}
}
for k, v := range texttemplate.GoFuncs {
if _, exists := funcsv[k]; !exists {
funcsv[k] = v
}
}
exeHelper := &templateExecHelper{