petrbalvin
9874464213
perf(decode): resolve interfaces through cached type flags
...
The decoder asked every value whether it implements Unmarshaler or encoding.TextUnmarshaler by boxing it into an interface and asserting, which allocated on every scalar field. A per-type flag cache answers first and an interface value is built only where the assertion can succeed; interface destinations are still asked dynamically. A monomorphic hint in front of the cache keeps the hot walk off the sync.Map probe, and it re-points at published cache entries so a miss allocates nothing.
Representative document: 233 to 167 allocations; long document typed decode: 107 674 to 63 772 allocations, about 6.1 to about 3.8 ms.
2026-09-20 22:15:23 +02:00
petrbalvin
d00cbb983a
perf(parse): cut allocations and validate UTF-8 in the scan
...
Per-statement work no longer allocates where it does not need to: parseKeyPath returns the first key component directly, absolute paths and key buffers sit on the parser, the definition maps are created on first write, arrays presize, and a string without escapes is copied out in one piece instead of built byte by byte. Repeated keys share one string across array-of-tables elements through a parser-local intern table whose lookup works on the bytes, so a repeated key costs no allocation.
UTF-8 validity is no longer a whole-input pass before the parser runs: the scan validates where it meets a multi-byte sequence, and a SyntaxError now names the line the invalid byte sits on. TestParseRejectsInvalidUTF8 covers nine positions; docs/API.md describes the new reporting.
Long document: 67 664 to 31 765 allocations per parse, about 51 to about 106 MB/s; representative document: 157 to 104 allocations.
2026-09-20 22:15:10 +02:00
petrbalvin
f37c05f9a2
perf(datetime): scan the token shape and render in one pass
...
Date-time tokens were validated by two regular expressions and then tried against up to sixteen time.Parse layouts; the profile named the regexp backtracker among the hottest nodes, and the failed attempts allocated ParseErrors by the million. scanDateTimeShape walks the strict TOML grammar as bytes and dispatches one layout per shape, which time.Parse accepts because parsing takes a fractional second whether the layout signs it or not. The String methods build their output in a single buffer instead of concatenating Format results.
2026-09-20 22:15:10 +02:00
petrbalvin
9a3d8dd87a
test(bench): measure the long document on the typed decode and marshal paths
...
The suite gains BenchmarkStrictDecodeLong and BenchmarkMarshalLong over the same 2000-entry document ParseLong uses, so long-input work is visible on every path, not the parse alone. docs/BENCHMARKING.md lists them.
2026-09-20 22:15:10 +02:00
petrbalvin
72f8b21ac4
feat: parse into a Document that keeps order and comments
...
Test / test (push) Successful in 1m34s
Assisted-by: DeepSeek V4.1 Flash
2026-09-20 10:40:57 +02:00
petrbalvin
a6e3e3fe31
feat: add OffsetDateTime, nesting limits and uniform Marshaler dispatch
...
Test / test (push) Successful in 2m18s
Assisted-by: DeepSeek V4.1 Flash
2026-09-19 19:36:24 +02:00
petrbalvin
b695b69768
docs(api): use an inline table sample that really breaks
...
Test / test (push) Successful in 1m33s
Assisted-by: DeepSeek V4.1 Flash
2026-09-19 12:18:57 +02:00
petrbalvin
959eaba4b0
feat(encode): add the InlineTables option
...
Assisted-by: DeepSeek V4.1 Flash
2026-09-19 12:18:30 +02:00
petrbalvin
8f85bb68fa
feat(encode): write the TOML 1.1 output form
...
Assisted-by: DeepSeek V4.1 Flash
2026-09-19 12:18:18 +02:00
petrbalvin
bccaf087c8
feat(cmd): add the encoder mode to the toml-test adapter
...
Test / test (push) Successful in 1m33s
Assisted-by: DeepSeek V4.1 Flash
2026-09-19 11:38:19 +02:00
petrbalvin
0149a5b4d1
docs(encoder): correct the multi-line string claim
...
Assisted-by: DeepSeek V4.1 Flash
2026-09-19 11:38:17 +02:00
petrbalvin
815141440e
feat: honour TextMarshaler and TextUnmarshaler by default
...
Test / test (push) Successful in 1m35s
Assisted-by: DeepSeek V4.1 Flash
2026-09-19 02:41:09 +02:00
petrbalvin
9023784da3
fix(decode): decode into a defined string or bool type
...
Assisted-by: DeepSeek V4.1 Flash
2026-09-19 02:40:51 +02:00
petrbalvin
942c4b1489
docs(security): list the newest release as supported
...
Test / test (push) Successful in 1m33s
Assisted-by: DeepSeek V4.1 Flash
2026-09-19 02:24:24 +02:00
petrbalvin
8f0eae6604
docs: drop the TOML 1.0 compatibility promise
...
Assisted-by: DeepSeek V4.1 Flash
2026-09-19 02:24:24 +02:00
petrbalvin
1c7329aeea
build: move the module path to /v2
...
Test / test (push) Successful in 1m32s
Assisted-by: GLM 5.3 Flash
2026-09-19 00:14:39 +02:00
petrbalvin
ad6c32d0c6
chore: prepare release v1.1.0
...
Test / test (push) Successful in 1m32s
Release / gates (push) Successful in 1m21s
Release / release (push) Successful in 52s
Assisted-by: GLM 5.3 Flash
2026-09-18 01:10:08 +02:00
petrbalvin
17574a0d15
docs: add the benchmarking document
...
Test / test (push) Canceled after 1m19s
Assisted-by: GLM 5.3 Flash
2026-09-18 00:20:42 +02:00
petrbalvin
8aa2b1b9c0
docs(api): name the newline a literal string may carry
...
Assisted-by: GLM 5.3 Flash
2026-09-18 00:20:42 +02:00
petrbalvin
6a043e2824
docs(architecture): scope the no-caching claim to the parser
...
Assisted-by: GLM 5.3 Flash
2026-09-18 00:20:31 +02:00
petrbalvin
81033bb27c
docs(api): document the TOML 1.1 acceptance
...
Assisted-by: GLM 5.3 Flash
2026-09-18 00:20:31 +02:00
petrbalvin
dfd5d240d2
docs(changelog): drop the stale toml-test run mode
...
Assisted-by: GLM 5.3 Flash
2026-09-18 00:20:31 +02:00
petrbalvin
78946578d1
docs(development): correct the release pipeline gates
...
Assisted-by: GLM 5.3 Flash
2026-09-18 00:20:31 +02:00
petrbalvin
d365729b37
style(changelog): order the development fixed entries by component
...
Test / test (push) Successful in 1m34s
Assisted-by: GLM 5.3
2026-09-17 23:12:24 +02:00
petrbalvin
53102d70e6
perf(number): skip the rebuild for tokens without underscores
...
Assisted-by: GLM 5.3
2026-09-17 23:12:00 +02:00
petrbalvin
f1a757ec5c
perf(parser): scan the input as bytes instead of runes
...
Assisted-by: GLM 5.3
2026-09-17 23:11:50 +02:00
petrbalvin
3c8ac859c0
fix(decode): report the smallest unknown field deterministically
...
Assisted-by: GLM 5.3
2026-09-17 23:11:38 +02:00
petrbalvin
4def1b3e8b
fix(encode): reject a nil MarshalTOML result
...
Assisted-by: GLM 5.3
2026-09-17 23:11:10 +02:00
petrbalvin
d5327568fb
fix(encode): keep a []any of tables in the value-array form
...
Assisted-by: GLM 5.3
2026-09-17 23:10:35 +02:00
petrbalvin
c485aab227
fix(decode): overflow-check uint and float32 destinations
...
Assisted-by: GLM 5.3
2026-09-17 23:10:24 +02:00
petrbalvin
30b28fe7fc
fix(encode): emit one key when two fields resolve to one name
...
Assisted-by: GLM 5.3
2026-09-17 23:08:42 +02:00
petrbalvin
aaea68efc9
perf(decode): cache struct schemas per type
...
Assisted-by: GLM 5.3
2026-09-17 23:08:14 +02:00
petrbalvin
a8d69d90d5
fix(decode): terminate the schema walk on a self-embedded pointer struct
...
Assisted-by: GLM 5.3
2026-09-17 23:07:53 +02:00
petrbalvin
bb238c98c3
fix(decode): let the later field win an equal-depth name clash
...
Assisted-by: GLM 5.3
2026-09-17 23:07:27 +02:00
petrbalvin
54c6032a9a
fix(encode): propagate invalid UTF-8 key errors from headers and inline tables
...
Assisted-by: GLM 5.3
2026-09-17 23:06:59 +02:00
petrbalvin
ec0d7a0023
fix(encode): fall back from the literal multiline form when unsafe
...
Assisted-by: GLM 5.3
2026-09-17 23:06:25 +02:00
petrbalvin
feef4fe9ea
style(encode): reword the negative-zero rationale comments
...
Assisted-by: GLM 5.3
2026-09-17 23:05:41 +02:00
petrbalvin
3c1f65038b
test(number): cover zero-prefixable exponent digits
...
Assisted-by: GLM 5.3
2026-09-17 23:05:27 +02:00
petrbalvin
830f840f44
fix(parser): reset dotted-key and array records per array-of-tables element
...
Assisted-by: GLM 5.3
2026-09-17 23:05:06 +02:00
petrbalvin
696f117c22
fix(parser): reject an array-of-tables header extending a frozen inline table
...
Assisted-by: GLM 5.3
2026-09-17 23:04:49 +02:00
petrbalvin
d2fc31d260
feat: support TOML 1.1
...
Test / test (push) Successful in 1m32s
Assisted-by: GLM 5.3 Flash
2026-09-17 22:06:26 +02:00
petrbalvin
18f1cd51e9
build: upgrade the compliance suite to toml-test v2.2.0
...
Test / test (push) Successful in 1m42s
Assisted-by: GLM 5.3 Flash
2026-09-17 21:30:41 +02:00
petrbalvin
3cd538fad6
fix: reject an out-of-range date-time offset
...
Assisted-by: GLM 5.3 Flash
2026-09-17 21:30:34 +02:00
petrbalvin
e19a6f35f1
fix: reject a float exponent without digits
...
Assisted-by: GLM 5.3 Flash
2026-09-17 21:29:07 +02:00
petrbalvin
5a270d0879
feat: add the -validate mode to interpres-decode
...
Assisted-by: GLM 5.3 Flash
2026-09-17 21:23:29 +02:00
petrbalvin
3f41266710
feat: typed decode and encode errors with the key path
...
Assisted-by: GLM 5.3 Flash
2026-09-17 21:20:47 +02:00
petrbalvin
1e3198c8b6
docs: add the contributor terms with the CLA
...
Test / test (push) Successful in 1m58s
Assisted-by: GLM 5.3 Flash
2026-09-17 20:27:13 +02:00
petrbalvin
cdb42de561
ci: record the verified cancel-in-progress behaviour
...
Test / test (push) Successful in 1m24s
Assisted-by: GLM 5.3 Flash
2026-09-17 20:16:49 +02:00
petrbalvin
0f6d81fe3e
ci: second trigger of the cancel-in-progress experiment
...
Test / test (push) Successful in 1m32s
Assisted-by: GLM 5.3 Flash
2026-09-17 20:12:02 +02:00
petrbalvin
274b8a488c
ci: drive the cancel-in-progress experiment
...
Test / test (push) Canceled after 0s
Assisted-by: GLM 5.3 Flash
2026-09-17 20:12:00 +02:00
petrbalvin
b061c97a81
ci: experiment with cancel-in-progress on the test pipeline
...
Test / test (push) Successful in 1m33s
Assisted-by: GLM 5.3 Flash
2026-09-17 20:08:37 +02:00
petrbalvin
fc50e3c49a
fix: decode untagged embedded structs and maps inline
...
Test / test (push) Successful in 1m26s
Assisted-by: GLM 5.3 Flash
2026-09-17 20:05:50 +02:00
petrbalvin
93c36cf376
feat: honour the omitzero and omitempty tag options on encode
...
Assisted-by: GLM 5.3 Flash
2026-09-17 19:57:23 +02:00
petrbalvin
58e7dfb1d0
test: add parse, marshal and decode benchmarks
...
Assisted-by: GLM 5.3 Flash
2026-09-17 19:54:27 +02:00
petrbalvin
510cfb5182
test: add the FuzzParse fuzz target
...
Assisted-by: GLM 5.3 Flash
2026-09-17 19:52:45 +02:00
petrbalvin
3ac0b1e301
fix: encode mixed arrays with inline table elements
...
Assisted-by: GLM 5.3 Flash
2026-09-17 19:49:50 +02:00
petrbalvin
2737a5ac87
build: bump the go directive to 1.27.1
...
Assisted-by: GLM 5.3 Flash
2026-09-17 19:41:22 +02:00
petrbalvin
744c0eb58f
chore: prepare release v1.0.0
...
Test / test (push) Successful in 1m27s
Release / gates (push) Successful in 1m19s
Release / release (push) Successful in 44s
Assisted-by: GLM 5.3 Flash
2026-08-20 08:30:00 +02:00
petrbalvin
d12da6181d
docs: document set and changelog
...
Assisted-by: GLM 5.3 Flash
2026-08-19 18:44:00 +02:00
petrbalvin
8266dd6450
ci: hand-written test, race and release pipelines
...
Assisted-by: GLM 5.3 Flash
2026-08-19 16:08:00 +02:00
petrbalvin
ceccb754fe
build: canonical justfile
...
Assisted-by: GLM 5.3 Flash
2026-08-19 14:31:00 +02:00
petrbalvin
8bf44f0e34
feat: usage example
...
Assisted-by: GLM 5.3 Flash
2026-08-19 13:05:00 +02:00
petrbalvin
1cf99ab7a4
feat: toml-test adapter command
...
Assisted-by: GLM 5.3 Flash
2026-08-19 11:23:00 +02:00
petrbalvin
c4ed84282c
feat: TOML 1.0 parser and encoder
...
Assisted-by: GLM 5.3 Flash
2026-08-19 09:47:00 +02:00
petrbalvin
5354dd034f
chore: initialise repository
...
Assisted-by: GLM 5.3 Flash
2026-08-19 08:12:00 +02:00