Back to Opa

methodlesstemplate

internal/methodlesstemplate/README.md

1.19.01.5 KB
Original Source

methodlesstemplate

A vendored copy of the Go standard library's text/template, with one behavioral change: the method-calls-on-data branch in exec.go's evalField (reflect.Value.MethodByName) is removed.

A reachable, non-constant reflect.Value.MethodByName makes the Go linker disable method-level dead-code elimination for the entire binary (golang/go#72895). OPA reaches text/template from its compiler (schema errors) and the strings.render_template builtin, so that one edge retains the full reflected method surface of every embedder — a large binary-size regression (#7903). Rego values and gojsonschema ErrorDetails decode to map[string]any / []any / scalars, which have no methods, so eliding the data-method lookup is a behavioral no-op while restoring DCE.

Only exec.go differs from the upstream stdlib. doc.go, funcs.go, option.go, template.go, and internal/fmtsort/sort.go are byte-identical to their Go release; text/template/parse is reused via its normal import. helper.go (ParseFiles/ParseGlob/ParseFS) is intentionally not vendored. Go's BSD LICENSE and per-file copyright headers are preserved.

Regenerating

Do not hand-edit these files. To re-sync to a new Go release, run under the target toolchain:

GOTOOLCHAIN=go1.26.0 build/regen-methodless-template.sh

The script copies the stdlib files verbatim and re-applies the single method-elision edit. If the edit no longer applies (the stdlib changed that region), the script fails and the elision must be re-derived and the patch in the script updated.