tpl: Put Go's internal template funcs in Hugo's map - hugo - [fork] hugo port for 9front
HTML git clone git@git.drkhsh.at/hugo.git
DIR Log
DIR Files
DIR Refs
DIR Submodules
DIR README
DIR LICENSE
---
DIR commit 1cf235412f98b42aefe368e99a0e9e95bae6eef7
DIR parent df6e9efd8f345707932231ea23dc8713afb5b026
HTML Author: Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Date: Tue, 7 Jan 2020 10:23:24 +0100
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
Diffstat:
M tpl/internal/go_templates/htmltemp… | 3 +++
M tpl/internal/go_templates/texttemp… | 3 +++
M tpl/tplimpl/template_funcs.go | 20 +++++++++++++++++++-
3 files changed, 25 insertions(+), 1 deletion(-)
---
DIR diff --git a/tpl/internal/go_templates/htmltemplate/hugo_template.go b/tpl/internal/go_templates/htmltemplate/hugo_template.go
@@ -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 {
DIR diff --git a/tpl/internal/go_templates/texttemplate/hugo_template.go b/tpl/internal/go_templates/texttemplate/hugo_template.go
@@ -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)
DIR diff --git a/tpl/tplimpl/template_funcs.go b/tpl/tplimpl/template_funcs.go
@@ -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{