summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--compiler/aliases.nim2
-rw-r--r--lib/pure/json.nim13
-rw-r--r--tests/alias/talias.nim5
3 files changed, 16 insertions, 4 deletions
diff --git a/compiler/aliases.nim b/compiler/aliases.nim
index 3d3fc9a79..4b592ee60 100644
--- a/compiler/aliases.nim
+++ b/compiler/aliases.nim
@@ -146,7 +146,7 @@ proc isPartOf*(a, b: PNode): TAnalysisResult =
     # go down recursively; this is quite demanding:
     const
       Ix0Kinds = {nkDotExpr, nkBracketExpr, nkObjUpConv, nkObjDownConv,
-                  nkCheckedFieldExpr}
+                  nkCheckedFieldExpr, nkHiddenAddr}
       Ix1Kinds = {nkHiddenStdConv, nkHiddenSubConv, nkConv}
       DerefKinds = {nkHiddenDeref, nkDerefExpr}
     case b.kind
diff --git a/lib/pure/json.nim b/lib/pure/json.nim
index 540a1a8eb..abf6305f2 100644
--- a/lib/pure/json.nim
+++ b/lib/pure/json.nim
@@ -1074,9 +1074,9 @@ when not defined(js):
     ## for nice error messages.
     var p: JsonParser
     p.open(s, filename)
+    defer: p.close()
     discard getTok(p) # read first token
     result = p.parseJson()
-    p.close()
 
   proc parseJson*(buffer: string): JsonNode =
     ## Parses JSON from `buffer`.
@@ -1203,6 +1203,17 @@ when isMainModule:
   testJson{["c", "d"]} = %true
   assert(testJson["c"]["d"].bval)
 
+  # make sure no memory leek when parsing invalid string
+  let startMemory = getOccupiedMem()
+  for i in 0 .. 10000:
+    try:
+      discard parseJson"""{ invalid"""
+    except:
+      discard
+  # memory diff should less than 2M
+  assert(abs(getOccupiedMem() - startMemory) < 2 * 1024 * 1024)
+
+
   # test `$`
   let stringified = $testJson
   let parsedAgain = parseJson(stringified)
diff --git a/tests/alias/talias.nim b/tests/alias/talias.nim
index 6addc4704..810ea2095 100644
--- a/tests/alias/talias.nim
+++ b/tests/alias/talias.nim
@@ -30,7 +30,7 @@ type
     c: char
     se: seq[TA]
 
-proc p(param1, param2: TC): TC =
+proc p(param1, param2: TC, param3: var TC): TC =
   var
     local: TC
     plocal: ptr TC
@@ -43,6 +43,7 @@ proc p(param1, param2: TC): TC =
   plocal2[] ?<| local
 
   param1 ?<| param2
+  local ?<| param3
 
   local.arr[0] !<| param1
   local.arr !<| param1
@@ -62,5 +63,5 @@ var
 a <| a
 a !<| b
 
-discard p(x, x)
+discard p(x, x, x)