diff options
author | Dominik Picheta <dominikpicheta@gmail.com> | 2017-11-30 18:43:34 +0000 |
---|---|---|
committer | Dominik Picheta <dominikpicheta@googlemail.com> | 2017-11-30 21:34:30 +0000 |
commit | 2bb2e6975e397bef1b320cd5dbafb6b3338fdaf0 (patch) | |
tree | 79fbb17b92e547eae821be0a58d593336b47ee9a /lib | |
parent | 8d6126237226a80ca4c78206c625009ce285c348 (diff) | |
download | Nim-2bb2e6975e397bef1b320cd5dbafb6b3338fdaf0.tar.gz |
Fix infinite recursion when using json.to on ref with cycle.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/pure/json.nim | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/lib/pure/json.nim b/lib/pure/json.nim index 1d2f480c4..9e7510e45 100644 --- a/lib/pure/json.nim +++ b/lib/pure/json.nim @@ -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 |