Skip to content

Commit

Permalink
check length before converting to range type
Browse files Browse the repository at this point in the history
The index type of an array is a `range` meaning that converting an
out-of-bounds value to it will raise a `Defect`.

This PR fixes the defect but does nothing for arrays which are not
"full" - probably, this should become an error.
  • Loading branch information
arnetheduck committed Oct 19, 2024
1 parent 96fcb65 commit 469bc9d
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 4 deletions.
8 changes: 4 additions & 4 deletions json_serialization/reader_impl.nim
Original file line number Diff line number Diff line change
Expand Up @@ -312,11 +312,11 @@ proc readValue*[T](r: var JsonReader, value: var T)
elif value is array:
type IDX = typeof low(value)
r.parseArray(idx):
let i = IDX(idx + low(value).int)
if i <= high(value):
# TODO: dont's ask. this makes the code compile
if false: value[i] = value[i]
if idx < value.len:
let i = IDX(idx + low(value).int)
readValue(r, value[i])
else:
r.raiseUnexpectedValue("Too many items for " & $(typeof(value)))

elif value is (object or tuple):
mixin flavorUsesAutomaticObjectSerialization
Expand Down
9 changes: 9 additions & 0 deletions tests/test_reader.nim
Original file line number Diff line number Diff line change
Expand Up @@ -211,3 +211,12 @@ suite "JsonReader basic test":

var z = toReaderNullFields("""{"something":null,"bool":999,"string":100}""")
check execReadObject(z) == 2

test "readValue of array":
var r = toReader "[false, true, false]"
check r.readValue(array[3, bool]) == [false, true, false]

test "readValue of array error":
var r = toReader "[false, true, false]"
expect JsonReaderError:
discard r.readValue(array[2, bool])

0 comments on commit 469bc9d

Please sign in to comment.