summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--lib/core/typeinfo.nim19
-rw-r--r--lib/pure/marshal.nim12
-rw-r--r--tests/stdlib/tmarshal.nim13
3 files changed, 29 insertions, 15 deletions
diff --git a/lib/core/typeinfo.nim b/lib/core/typeinfo.nim
index 16580b318..c78752360 100644
--- a/lib/core/typeinfo.nim
+++ b/lib/core/typeinfo.nim
@@ -228,8 +228,14 @@ proc `[]=`*(x: Any, i: int, y: Any) =
 proc len*(x: Any): int =
   ## len for an any `x` that represents an array or a sequence.
   case x.rawType.kind
-  of tyArray: result = x.rawType.size div x.rawType.base.size
-  of tySequence: result = cast[PGenSeq](cast[ppointer](x.value)[]).len
+  of tyArray:
+    result = x.rawType.size div x.rawType.base.size
+  of tySequence:
+    let pgenSeq = cast[PGenSeq](cast[ppointer](x.value)[])
+    if isNil(pgenSeq):
+      result = 0
+    else:
+      result = pgenSeq.len
   else: assert false
 
 
@@ -240,10 +246,9 @@ proc base*(x: Any): Any =
 
 
 proc isNil*(x: Any): bool =
-  ## `isNil` for an any `x` that represents a sequence, string, cstring,
-  ## proc or some pointer type.
-  assert x.rawType.kind in {tyString, tyCString, tyRef, tyPtr, tyPointer,
-                            tySequence, tyProc}
+  ## `isNil` for an any `x` that represents a cstring, proc or
+  ## some pointer type.
+  assert x.rawType.kind in {tyCString, tyRef, tyPtr, tyPointer, tyProc}
   result = isNil(cast[ppointer](x.value)[])
 
 proc getPointer*(x: Any): pointer =
@@ -716,5 +721,3 @@ when isMainModule:
     for i in 0 .. m.len-1:
       for j in 0 .. m[i].len-1:
         echo getString(m[i][j])
-
-
diff --git a/lib/pure/marshal.nim b/lib/pure/marshal.nim
index b0bcfe535..171b71493 100644
--- a/lib/pure/marshal.nim
+++ b/lib/pure/marshal.nim
@@ -54,13 +54,11 @@ proc storeAny(s: Stream, a: Any, stored: var IntSet) =
     else:
       s.write($int(ch))
   of akArray, akSequence:
-    if a.kind == akSequence and isNil(a): s.write("null")
-    else:
-      s.write("[")
-      for i in 0 .. a.len-1:
-        if i > 0: s.write(", ")
-        storeAny(s, a[i], stored)
-      s.write("]")
+    s.write("[")
+    for i in 0 .. a.len-1:
+      if i > 0: s.write(", ")
+      storeAny(s, a[i], stored)
+    s.write("]")
   of akObject, akTuple:
     s.write("{")
     var i = 0
diff --git a/tests/stdlib/tmarshal.nim b/tests/stdlib/tmarshal.nim
index 38937590f..a6fc6c1a5 100644
--- a/tests/stdlib/tmarshal.nim
+++ b/tests/stdlib/tmarshal.nim
@@ -105,3 +105,16 @@ r = to[Something](data2)
 
 echo r.x, " ", r.y
 
+
+type
+  Foo = object
+    a1: string
+    a2: string
+    a3: seq[string]
+    a4: seq[int]
+    a5: seq[int]
+    a6: seq[int]
+var foo = Foo(a2: "", a4: @[], a6: @[1])
+foo.a6.setLen 0
+doAssert $$foo == """{"a1": "", "a2": "", "a3": [], "a4": [], "a5": [], "a6": []}"""
+testit(foo)