Fix infinite recursion when using json.to on ref with cycle.

This commit is contained in:
Dominik Picheta
2017-11-30 18:43:34 +00:00
committed by Dominik Picheta
parent 8d61262372
commit 2bb2e6975e
3 changed files with 32 additions and 3 deletions

View File

@@ -1651,6 +1651,13 @@ import options
proc workaroundMacroNone[T](): Option[T] =
none(T)
proc depth(n: NimNode, current = 0): int =
result = 1
for child in n:
let d = 1 + child.depth(current + 1)
if d > result:
result = d
proc createConstructor(typeSym, jsonNode: NimNode): NimNode =
## Accepts a type description, i.e. "ref Type", "seq[Type]", "Type" etc.
##
@@ -1660,6 +1667,9 @@ proc createConstructor(typeSym, jsonNode: NimNode): NimNode =
# echo("--createConsuctor-- \n", treeRepr(typeSym))
# echo()
if depth(jsonNode) > 150:
error("The `to` macro does not support ref objects with cycles.", jsonNode)
case typeSym.kind
of nnkBracketExpr:
var bracketName = ($typeSym[0]).normalize

View File

@@ -354,6 +354,4 @@ when isMainModule:
let dataDeser = to(dataParsed, Test)
doAssert dataDeser.name == "FooBar"
doAssert dataDeser.fallback.kind == JFloat
doAssert dataDeser.fallback.getFloat() == 56.42
# TODO: Cycles lead to infinite loops.
doAssert dataDeser.fallback.getFloat() == 56.42

View File

@@ -0,0 +1,21 @@
discard """
file: "tjsonmacro_reject2.nim"
line: 10
errormsg: "The `to` macro does not support ref objects with cycles."
"""
import json
type
Misdirection = object
cycle: Cycle
Cycle = ref object
foo: string
cycle: Misdirection
let data = """
{"cycle": null}
"""
let dataParsed = parseJson(data)
let dataDeser = to(dataParsed, Cycle)