Revision history for JSON-Schema-Fast
0.10 2026-08-20
- FIX: change abi version checks from == to <=
0.09 2026-08-17
- Require File::Raw::JSON 0.07: earlier versions truncated a JSON
integer wider than the running perl's IV, which failed the
const "float and integers are equal up to 64-bit representation
limits" conformance case on the 32-bit smokers.
- Integer classification no longer casts an NV through an IV to
decide whether it has a fractional part.
- t/55-no-mutation: skip the "not numified" assertion where the
perl has no 64-bit integers, since the literal under test is
already an NV before the validator sees it.
0.08 2026-08-16
- Coercion now reaches enum and const. A string standing in for a
number or a boolean compared in its raw domain, so a value could
pass `type: integer` and then fail `enum: [0, 1]` on the string
it still was.
0.07 2026-08-12
- Build : 0.06 does not build at all where the toolchain compiles
-flto to bitcode but does not link it
- Validation no longer mutates the value it is judging. SvNV on an
integer caches the NV and turns NOK on, and although that changes
no verdict it changes the value afterwards: an encoder that tests
NOK before IOK then writes 1 as 1.0, so a caller who validates a
document and then serialises it puts different bytes on the wire
than the ones it was handed.
- The interpreter now reads the flags a decoder set rather than
forcing them (jsf__nv_of in include/jsf_types.h), at both sites
that read a number: the numeric keyword block, and jsf_json_equal
for const / enum / uniqueItems. The read order matches sv_2nv's
own preference, so a value carrying both an IV and an NV still
answers exactly what SvNV answered.
- t/55-no-mutation.t covers every keyword that reads a number,
values nested in objects and arrays, the failing path, floats and
large integers.
0.06 Date/time
- Build fix for perl 5.14 through 5.20: U64 is behind #ifdef PERL_CORE
until 5.22
- Arena allocations take their alignment from the type instead of a
hardcoded 8. jsf_node_t holds five NVs, and on a perl built
-Duselongdouble or -Dusequadmath an NV is 16-byte aligned, so every
node was landing on an odd 8-byte boundary.
- SPAGAIN after the require in the Fetch and File::Raw::JSON ABI
resolvers. Both captured SP, ran arbitrary Perl, then PUSHMARKed and
PUTBACKed through the stale pointer; if the require had grown the
value stack, that pointer was into the freed block.
0.05 2026-08-04
- Consume Fetch's and File::Raw::JSON's C ABIs through ExtUtils::Depends
- Also an ExtUtils::Depends provider now
- JSON schema text (and fetched remote documents) are now decoded via
File::Raw::JSON's C ABI (frj_abi.h) rather than a per-call Perl call
to file_json_decode.
0.04 2026-08-04
Become 100% conformance with json schema 2020-12
- Full URI reference model: $id opens base-URI scopes, $anchor registers
named locations, and $ref resolves against the base URI
- Remote / cross-document $ref: compile(..., resolver => sub { $uri -> $doc })
lazily fetches and parses referenced documents into the same arena.
- unevaluatedProperties / unevaluatedItems: a per-schema evaluated set
annotation, collected from a schema's keywords and its in place applicators
- $dynamicRef / $dynamicAnchor
- $vocabulary / $schema
- Default remote resolution: a $ref/$dynamicRef to an http(s) document with
no resolver is fetched through Fetch's C ABI
- Provide a C ABI (include/jsf_abi.h) so other XS modules - e.g. an OpenAPI
layer - can compile a schema once and validate per request entirely in C
0.02 2026-08-03
Propagate defaults into callers params when apply_defaults is true as it's more usefull.
0.01 2026-08-03
First version