Revision history for Template-Stencil

0.10    2026-08-21
        - Add support for tied hashes in data passed to the template

0.09    2026-08-17
        - Fix the fmt filter on quadmath and long-double perls. Perl's
          my_snprintf hands any format that is one bare float spec
          ("%.2f") to quadmath_snprintf and reads an NV from the
          varargs, so the double the filter passed made it panic
          ("quadmath_snprintf failed, format \"%.2f\"") or print 0.00.
          The float branch now calls snprintf directly, where a double
          and a plain format mean the same thing on every platform.
        - t/44-fmt: the %d width case used a 2**53 literal, which a perl
          without 64-bit integers holds as an NV that no %d can
          represent (SvIV clamps it to UV_MAX, which reads back as -1).
          It now formats IV_MAX and compares against perl's own sprintf.

0.08    2026-08-16
        - Eshu 0.13 is now the test-requires floor, and t/70 skips
          under anything older (0.11 fixed the indenter but 0.11 and
          0.12 do not build or walk correctly on Windows; 0.13 is the
          same indenter, working everywhere). 
        - -flto is no longer used on Windows.

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.

