Skip to content

Commit

Permalink
tpl: Put Go's internal template funcs in Hugo's map
Browse files Browse the repository at this point in the history
```
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 gohugoio#6717
  • Loading branch information
bep authored and jakejarvis committed Mar 5, 2021
1 parent c7f0de3 commit 08b8790
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 1 deletion.
3 changes: 3 additions & 0 deletions tpl/internal/go_templates/htmltemplate/hugo_template.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
3 changes: 3 additions & 0 deletions tpl/internal/go_templates/texttemplate/hugo_template.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
20 changes: 19 additions & 1 deletion tpl/tplimpl/template_funcs.go
Original file line number Diff line number Diff line change
Expand Up @@ -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{
Expand Down

0 comments on commit 08b8790

Please sign in to comment.