diff options
author | Vindaar <basti90@gmail.com> | 2018-10-13 08:47:58 +0200 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2018-10-13 08:47:58 +0200 |
commit | 9cdd9be5a529675112b4c0e85a66061eaf0f53b7 (patch) | |
tree | 7f850bc8f8c14cbc71d4b7d540188da6952f60da | |
parent | c495e97ec46ab46df56087457c82d80178f7e769 (diff) | |
download | Nim-9cdd9be5a529675112b4c0e85a66061eaf0f53b7.tar.gz |
fixes #8916 by fixing typeinfo and marshal. (#9341)
* fixes #8916 by removing `tyString`, `tySeq`, mod. marshal, typeinfo Need to check in `typeinfo` for nil of the underlying pointer. In marshal don't have to check for nil of seq anymore. * remove reference to string, sequence in `isNil` doc string
-rw-r--r-- | lib/core/typeinfo.nim | 19 | ||||
-rw-r--r-- | lib/pure/marshal.nim | 12 | ||||
-rw-r--r-- | tests/stdlib/tmarshal.nim | 13 |
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) |