From 2bb2e6975e397bef1b320cd5dbafb6b3338fdaf0 Mon Sep 17 00:00:00 2001 From: Dominik Picheta Date: Thu, 30 Nov 2017 18:43:34 +0000 Subject: Fix infinite recursion when using json.to on ref with cycle. --- lib/pure/json.nim | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'lib') 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 -- cgit 1.4.1-2-gfad0