From d261135c5cdd9fe90f4c6cd21fffded8949ef1c9 Mon Sep 17 00:00:00 2001 From: Jake Leahy Date: Mon, 24 Oct 2022 20:17:14 +1100 Subject: Fix tuple size check in `std/jsonutils` (#20637) * Add test for tuple being invalid size * Test tuple size before accessing fields * Fix formatting for import * Fix not being able to build from csources_v1 Co-authored-by: Andreas Rumpf --- lib/std/jsonutils.nim | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) (limited to 'lib/std') diff --git a/lib/std/jsonutils.nim b/lib/std/jsonutils.nim index 9db1106c4..05f9f661c 100644 --- a/lib/std/jsonutils.nim +++ b/lib/std/jsonutils.nim @@ -32,7 +32,7 @@ add a way to customize serialization, for e.g.: import macros from enumutils import symbolName -from typetraits import OrdinalEnum +from typetraits import OrdinalEnum, tupleLen when defined(nimPreviewSlimSystem): import std/assertions @@ -286,11 +286,21 @@ proc fromJson*[T](a: var T, b: JsonNode, opt = Joptions()) = fromJsonFields(a, nil, b, seq[string].default, opt) else: checkJson b.kind == JArray, $(b.kind) # we could customize whether to allow JNull + + when compiles(tupleLen(T)): + let tupleSize = tupleLen(T) + else: + # Tuple len isn't in csources_v1 so using tupleLen would fail. + # Else branch basically never runs (tupleLen added in 1.1 and jsonutils in 1.4), but here for consistency + var tupleSize = 0 + for val in fields(a): + tupleSize.inc + + checkJson b.len == tupleSize, $(b.len, tupleSize, $T, b) # could customize var i = 0 for val in fields(a): fromJson(val, b[i], opt) i.inc - checkJson b.len == i, $(b.len, i, $T, b) # could customize else: # checkJson not appropriate here static: doAssert false, "not yet implemented: " & $T -- cgit 1.4.1-2-gfad0