Cursor Agent
a646ffd9fa
Make error position tracking explicit with Offset field on ParserError
...
Thread byte offset information through all error creation sites,
eliminating the need for SubsliceOffset to recover position from
pointer comparison.
Changes:
- Add Offset field to ParserError struct
- Add offset parameter to NewParserError
- Add Parser.offsetOf helper for suffix-length arithmetic
- Thread base offset through scanner functions (scanComment,
scanBasicString, scanMultilineBasicString, scanLiteralString,
scanMultilineLiteralString, scanWindowsNewline)
- Thread base offset through standalone functions (expect, hexToRune)
- Thread base offset through all decode functions (parseInteger,
parseFloat, parseLocalDate, parseLocalTime, parseLocalDateTime,
parseDateTime, checkAndRemoveUnderscores*)
- Update all unmarshaler call sites to pass value.Raw.Offset
- Update localtime.go UnmarshalText methods with base=0
- Update strict.go to populate Offset from key ranges
- Change wrapDecodeError to read de.Offset directly
- Change Utf8TomlValidAlreadyEscaped to return int index (-1 if valid)
instead of a byte subslice
- Unexport SubsliceOffset (now only used internally by Range())
This makes error positions self-describing: each ParserError carries its
own byte offset, so callers no longer need the original document slice
and address arithmetic to determine where an error occurred.
Co-authored-by: Thomas Pelletier <thomas@pelletier.dev >
2026-04-12 19:08:55 +00:00
Thomas Pelletier
99cd40b175
Reject leap seconds to prevent year overflow ( #1019 )
...
Go's time.Date() normalizes leap seconds (second=60) by adding 1 minute.
When parsing the maximum valid TOML date 9999-12-31 23:59:60z, this causes
the year to overflow to 10000, which exceeds the valid TOML year range
(0000-9999) and breaks round-trip serialization.
The fix rejects leap seconds (second > 59) during parsing. This is
consistent with the resolution of issue #913 which determined that
emitting an error is less surprising than silently normalizing leap
seconds.
Fixes #1015
Co-authored-by: Claude <noreply@anthropic.com >
2026-01-04 13:40:19 -05:00
Nathan Baulch
a675c6b3e2
Upgrade to golangci-lint v2 ( #1008 )
2026-01-04 09:54:29 -05:00
Haiyang Wang
bb026cae89
Decode: fix panic when parsing '0' as a float ( #887 )
...
Fixes #886
2023-08-22 18:07:39 +02:00
Thomas Pelletier
e195b58fd0
Expose parser API as unstable ( #827 )
2022-11-09 16:12:39 -05:00
Thomas Pelletier
8bbb673431
Fuzzing setup and fixes ( #755 )
...
* encode: fix localdate formatting
* encode: fix empty key marshaling
* encode: fix invalid quotation of time.Time
* encode: ensure control chars are escaped
* decode: always use UTC for zero tz
* encode: check for invalid characters in keys
* encode: always construct map for empty array tables
* fuzz: add go 1.18 fuzz test
* encode: handle NaNs
* encode: allow new lines in quoted keys
* encode: never emit table inside array
* encode: don't capitalize inf
2022-04-10 21:37:12 -04:00
Cameron Moore
146f70ea8a
Decode: use cleaned byte slice throughout parseFloat ( #735 )
...
Fixes #734
2022-01-06 14:34:27 -05:00
Cameron Moore
892df5c28e
Decode: fix index out of range bug ( #716 )
...
Fixes #715
2021-12-29 08:49:33 -05:00
Thomas Pelletier
8ce5c3d78f
Decoder: time allows extra precision ( #710 )
...
As discussed[1], this change allows times to provide precision beyond the
nanosecond (nine digits fractional part). Extra precision is truncated according
to the TOML specificiation.
[1]: https://github.com/pelletier/go-toml/discussions/707
2021-12-26 17:05:10 +01:00
Cameron Moore
5cbdea6192
decode: fix maximum time offset values ( #706 )
...
According to RFC3339 section 5.6, the maximum time offset values for
hours and minutes is 23 and 59, respectively.
2021-12-22 10:29:52 +01:00
Cameron Moore
8bbb519477
Decode: ensure signed exponents don't start with an underscore ( #699 )
2021-12-05 20:02:19 -05:00
Cameron Moore
b37e11d74d
Decode: allow maximum seconds value of 60 ( #700 )
...
RFC3339 allows seconds to be 60 when adding leap seconds
2021-12-05 20:00:42 -05:00
Cameron Moore
6cd86876b8
Decode: ensure signed numbers don't start with an underscore ( #698 )
2021-12-04 16:56:48 -05:00
Cameron Moore
f53bc740c1
Decode: restrict timezone offset values ( #696 )
...
Don't allow hours greater than 24 and minutes greater than 60 per RFC
3339.
2021-12-02 18:59:32 -05:00
Thomas Pelletier
9bf9be681e
Decoder: check for invalid chars in timezone ( #695 )
...
Fixes #694
2021-12-02 09:00:20 -05:00
Thomas Pelletier
3990899d7e
Decoder: check tz has : between hours and minutes ( #691 )
...
Fixes #690
2021-11-30 20:22:11 -05:00
Thomas Pelletier
bbaae540ce
Decoder: check timezones start with +,-,z,Z ( #688 )
...
Also simplifies local time seconds scanning.
Fixes #686
2021-11-30 13:01:15 -05:00
Thomas Pelletier
8eae15b2ee
Decoder: validate bounds of day and month in dates ( #680 )
...
Fixes #676
2021-11-24 17:42:01 -05:00
Thomas Pelletier
85c0658984
Decode: add missing checks for LocalTime ( #650 )
2021-10-29 22:13:08 -04:00
Thomas Pelletier
3694ae88f6
decode: error on _ before exponent in floats ( #647 )
...
Fixes #646
2021-10-28 20:41:10 -04:00
Thomas Pelletier
4d7c9ddac7
Floats and integers parsing fixes ( #638 )
...
* parser: fix scan of float with exp but no decimal
* decoder: validate leading zeros for decimals
2021-10-22 22:25:56 -04:00
Thomas Pelletier
3000471a12
parser: improve floats validation ( #636 )
2021-10-20 08:49:28 -04:00
Cameron Moore
a23850f29b
decode: preserve nanosecond precision when decoding time ( #626 )
...
Co-authored-by: Thomas Pelletier <thomas@pelletier.codes >
2021-10-17 20:43:29 -04:00
Johanan Idicula
76f53c857b
unmarshal: validate date ( #622 )
2021-10-17 20:18:20 -04:00
Riya John
e96746311c
decoder: fix panic date time should have a timezone ( #614 )
...
Fixes #596
Co-authored-by: Thomas Pelletier <thomas@pelletier.codes >
2021-10-06 21:24:25 -04:00
Cameron Moore
476492a85c
unmarshal: support lowercase 'T' and 'Z' in date-time parsing ( #601 )
...
RFC3399 allows for lowercase 't' and 'z' in date-time values.
Fixes #600
2021-09-25 10:02:23 -07:00
Thomas Pelletier
f6b38c33b7
Provide own implementation of Local* ( #558 )
...
* Reduces the public API.
* Reuses optimized parsing functions.
* Removes reliance on Google code under Apache license.
2021-06-08 20:27:05 -04:00
Thomas Pelletier
c2d1fd86e5
Fix timezone detection when time has fractional component ( #544 )
2021-05-21 09:37:43 -04:00
Thomas Pelletier
95c701b253
Increase test coverage ( #538 )
...
Also fix array in map bug.
2021-05-10 20:17:05 -04:00
Thomas Pelletier
ea225df3ed
v2: errors ( #534 )
...
```
name old time/op new time/op delta
UnmarshalDataset/config-32 86.7ms ± 2% 87.5ms ± 2% ~ (p=0.113 n=9+10)
UnmarshalDataset/canada-32 129ms ± 4% 106ms ± 3% -17.94% (p=0.000 n=10+10)
UnmarshalDataset/citm_catalog-32 59.4ms ± 5% 58.7ms ± 5% ~ (p=0.393 n=10+10)
UnmarshalDataset/twitter-32 27.0ms ± 7% 26.9ms ± 6% ~ (p=0.720 n=10+9)
UnmarshalDataset/code-32 326ms ± 4% 322ms ± 7% ~ (p=0.661 n=9+10)
UnmarshalDataset/example-32 510µs ±11% 526µs ± 7% ~ (p=0.182 n=10+9)
UnmarshalSimple-32 1.41µs ± 6% 1.41µs ± 4% ~ (p=0.736 n=10+9)
ReferenceFile-32 45.6µs ± 3% 43.9µs ±10% ~ (p=0.089 n=10+10)
name old speed new speed delta
UnmarshalDataset/config-32 12.1MB/s ± 2% 12.0MB/s ± 2% ~ (p=0.108 n=9+10)
UnmarshalDataset/canada-32 17.1MB/s ± 4% 20.9MB/s ± 3% +21.86% (p=0.000 n=10+10)
UnmarshalDataset/citm_catalog-32 9.41MB/s ± 5% 9.51MB/s ± 5% ~ (p=0.362 n=10+10)
UnmarshalDataset/twitter-32 16.4MB/s ± 8% 16.5MB/s ± 6% ~ (p=0.704 n=10+9)
UnmarshalDataset/code-32 8.24MB/s ± 4% 8.34MB/s ± 7% ~ (p=0.675 n=9+10)
UnmarshalDataset/example-32 15.9MB/s ±11% 15.4MB/s ± 7% ~ (p=0.182 n=10+9)
ReferenceFile-32 115MB/s ± 4% 120MB/s ±10% ~ (p=0.085 n=10+10)
name old alloc/op new alloc/op delta
UnmarshalDataset/config-32 16.9MB ± 0% 16.9MB ± 0% -0.02% (p=0.000 n=10+10)
UnmarshalDataset/canada-32 76.8MB ± 0% 74.3MB ± 0% -3.31% (p=0.000 n=10+10)
UnmarshalDataset/citm_catalog-32 37.3MB ± 0% 37.1MB ± 0% -0.60% (p=0.000 n=9+10)
UnmarshalDataset/twitter-32 15.6MB ± 0% 15.6MB ± 0% -0.09% (p=0.000 n=10+10)
UnmarshalDataset/code-32 60.2MB ± 0% 59.3MB ± 0% -1.51% (p=0.000 n=10+9)
UnmarshalDataset/example-32 238kB ± 0% 238kB ± 0% -0.18% (p=0.000 n=10+10)
ReferenceFile-32 11.8kB ± 0% 11.8kB ± 0% ~ (all equal)
name old allocs/op new allocs/op delta
UnmarshalDataset/config-32 653k ± 0% 645k ± 0% -1.20% (p=0.000 n=10+6)
UnmarshalDataset/canada-32 1.01M ± 0% 0.90M ± 0% -11.04% (p=0.000 n=9+10)
UnmarshalDataset/citm_catalog-32 384k ± 0% 370k ± 0% -3.75% (p=0.000 n=10+10)
UnmarshalDataset/twitter-32 160k ± 0% 157k ± 0% -1.32% (p=0.000 n=10+10)
UnmarshalDataset/code-32 2.97M ± 0% 2.91M ± 0% -2.15% (p=0.000 n=10+7)
UnmarshalDataset/example-32 3.69k ± 0% 3.63k ± 0% -1.52% (p=0.000 n=10+10)
ReferenceFile-32 253 ± 0% 253 ± 0% ~ (all equal)
```
2021-05-08 16:04:25 -04:00
Vincent Serpoul
2b1c52dddd
golangci-lint: decoder/unmarshal ( #518 )
2021-04-22 09:29:23 -04:00
Thomas Pelletier
32c1a8d372
encoder: move nspow into the parseLocalTime
2021-04-20 23:19:40 -04:00
Thomas Pelletier
ee102a3528
decoder: fix time fractional parsing
2021-04-20 23:16:08 -04:00
Vincent Serpoul
18af62d3ea
Golangci-lint v2 part one ( #492 )
2021-04-07 13:39:01 -04:00
Thomas Pelletier
32da85ab11
Decoding error position tracking
2021-03-30 21:43:57 -04:00
Thomas Pelletier
18d45c446b
wip: decoder errors
2021-03-30 19:52:02 -04:00
Thomas Pelletier
636a75f316
Import tomltestgen
...
Handful are failing.
2021-03-26 09:51:35 -04:00
Thomas Pelletier
b8da9d1854
Fix datetime error checking
2021-03-23 08:54:44 -04:00
Thomas Pelletier
fcc91f2618
Progress on date/times
2021-03-22 09:59:15 -04:00