check length before converting to range type (#102)

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.

* bump version
This commit is contained in:
Jacek Sieka 2024-10-19 11:28:17 +02:00 committed by GitHub
parent 96fcb658b4
commit 6eadb6e939
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 14 additions and 5 deletions

View File

@ -10,7 +10,7 @@
mode = ScriptMode.Verbose mode = ScriptMode.Verbose
packageName = "json_serialization" packageName = "json_serialization"
version = "0.2.8" version = "0.2.9"
author = "Status Research & Development GmbH" author = "Status Research & Development GmbH"
description = "Flexible JSON serialization not relying on run-time type information" description = "Flexible JSON serialization not relying on run-time type information"
license = "Apache License 2.0" license = "Apache License 2.0"

View File

@ -312,11 +312,11 @@ proc readValue*[T](r: var JsonReader, value: var T)
elif value is array: elif value is array:
type IDX = typeof low(value) type IDX = typeof low(value)
r.parseArray(idx): r.parseArray(idx):
let i = IDX(idx + low(value).int) if idx < value.len:
if i <= high(value): let i = IDX(idx + low(value).int)
# TODO: dont's ask. this makes the code compile
if false: value[i] = value[i]
readValue(r, value[i]) readValue(r, value[i])
else:
r.raiseUnexpectedValue("Too many items for " & $(typeof(value)))
elif value is (object or tuple): elif value is (object or tuple):
mixin flavorUsesAutomaticObjectSerialization mixin flavorUsesAutomaticObjectSerialization

View File

@ -211,3 +211,12 @@ suite "JsonReader basic test":
var z = toReaderNullFields("""{"something":null,"bool":999,"string":100}""") var z = toReaderNullFields("""{"something":null,"bool":999,"string":100}""")
check execReadObject(z) == 2 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])