Revision history for Template-Stencil
0.07 2026-08-16
- New built-in filter fmt: sprintf with exactly one conversion
{% price | fmt('$%.2f') %}
0.06 2026-08-14
- The compile-scaling test in t/11-bytecode-shape.t timed
_inspect, whose per-op Perl hash building dominated the
measurement and made the ratio an allocator benchmark rather
than a compiler one; a FreeBSD smoker duly reported 43.9x on a
compiler that measures sublinear. It now times
_compile_handle/_free_handle and takes the best of five rounds.
0.05 2026-08-12
- Require perl 5.10.1.
- _abi_ptr returns a UV rather than an IV.
0.04 2026-08-08
- cpuid.h is now included only on gcc 4.3+ or clang; FreeBSD 9's
base gcc 4.2.1 defines __GNUC__ without shipping the header, so
the build died before the SIMD paths could fall back. Runtime
caps simply stay scalar on such compilers.
- Define MAX when no header supplied it. utf8.h on perl 5.41+
expands UTF8_MAXBYTES_CASE through MAX(), which perl.h reserves
for PERL_CORE/PERL_EXT
- The stat/fstat call sites now declare struct stat rather than
Stat_t.
0.03 Date/time
- Windows fixes
- Path safety now treats '\' as a separator alongside '/' when
scanning a template name for traversal.
- Perl 5.10.0 is the new minimum, down from 5.16. ppport.h supplies
av_top_index, croak_sv, mg_findext, SvREFCNT_dec_NN, HeUTF8 and
utf8_to_uvchr_buf; sv_eq_flags/sv_cmp_flags fall back to
sv_eq/sv_cmp, which take the identical path for the already
fetched non-magical SVs the VM compares. cv_set_call_checker
needs 5.14 and cannot be back-ported, so below that the
statically-resolved fast path is simply not installed and every
call takes the ordinary XSUB
- Fixed a latent stack bug in the ABI self-test: SvIV(POPs) popped
twice
- t/11-bytecode-shape.t asserted a 1000us compile budget, which is
a property of the smoker rather than of the compiler
0.02 Date/time
- A shared C ABI (include/st_abi.h), so a consumer XS module can
render through the engine without a Perl frame: engine_of hands
back the opaque engine behind a blessed Template::Stencil object
(building it lazily, as the render method does), and render is
the render path minus the XS prologue and the croak. Template
errors come back through an out-parameter rather than as an
exception, so a consumer can turn one into its own 500. The table
is resolved at runtime through Template::Stencil::_abi_ptr and
gated on abi_version, so there is no link-time coupling and the
two dists upgrade independently; it grows only at the end.
- Installed through ExtUtils::Depends, so a dependent reaches
st_abi.h without vendoring a copy. t/57-abi.t drives the table
the way a consumer does and checks its output byte-for-byte
against the render method, UTF-8 flag included.
0.01 Date/time
First version, released on an unsuspecting world.