diff options
author | Araq <rumpf_a@web.de> | 2013-01-27 19:15:13 +0100 |
---|---|---|
committer | Araq <rumpf_a@web.de> | 2013-01-27 19:15:13 +0100 |
commit | 07585088955c1fe8fb815c40409ed9f5d66fd446 (patch) | |
tree | 0179ff01c39469a61cdc2644ba5d9cc3b29181e8 /lib/system/debugger.nim | |
parent | 0e1b67cfff7f9e7352439888e06e2c255599e193 (diff) | |
download | Nim-07585088955c1fe8fb815c40409ed9f5d66fd446.tar.gz |
bugfix: typeinfo.extendSeq
Diffstat (limited to 'lib/system/debugger.nim')
-rwxr-xr-x | lib/system/debugger.nim | 39 |
1 files changed, 25 insertions, 14 deletions
diff --git a/lib/system/debugger.nim b/lib/system/debugger.nim index 68fbccef6..f234c9daf 100755 --- a/lib/system/debugger.nim +++ b/lib/system/debugger.nim @@ -1,7 +1,7 @@ # # # Nimrod's Runtime Library -# (c) Copyright 2012 Andreas Rumpf +# (c) Copyright 2013 Andreas Rumpf # # See the file "copying.txt", included in this # distribution, for details about the copyright. @@ -579,6 +579,10 @@ proc hash(Data: Pointer, Size: int): THash = Dec(s) result = !$h +proc hashGcHeader(data: pointer): THash = + const headerSize = sizeof(int)*2 + result = hash(cast[pointer](cast[int](data) -% headerSize), headerSize) + proc genericHashAux(dest: Pointer, mt: PNimType, shallow: bool, h: THash): THash proc genericHashAux(dest: Pointer, n: ptr TNimNode, shallow: bool, @@ -606,20 +610,22 @@ proc genericHashAux(dest: Pointer, mt: PNimType, shallow: bool, result = h if x != nil: let s = cast[NimString](x) - when true: - result = result !& hash(x, s.len) + when defined(trackGcHeaders): + result = result !& hashGcHeader(x) else: - let y = cast[pointer](cast[int](x) -% 2*sizeof(int)) - result = result !& hash(y, s.len + 2*sizeof(int)) + result = result !& hash(x, s.len) of tySequence: var x = cast[ppointer](dest) var dst = cast[taddress](cast[ppointer](dest)[]) result = h if dst != 0: - for i in 0..cast[pgenericseq](dst).len-1: - result = result !& genericHashAux( - cast[pointer](dst +% i*% mt.base.size +% GenericSeqSize), - mt.Base, shallow, result) + when defined(trackGcHeaders): + result = result !& hashGcHeader(cast[ppointer](dest)[]) + else: + for i in 0..cast[pgenericseq](dst).len-1: + result = result !& genericHashAux( + cast[pointer](dst +% i*% mt.base.size +% GenericSeqSize), + mt.Base, shallow, result) of tyObject, tyTuple: # we don't need to copy m_type field for tyObject, as they are equal anyway result = genericHashAux(dest, mt.node, shallow, h) @@ -630,13 +636,18 @@ proc genericHashAux(dest: Pointer, mt: PNimType, shallow: bool, result = result !& genericHashAux(cast[pointer](d +% i*% mt.base.size), mt.base, shallow, result) of tyRef: - if shallow: - result = h !& hash(dest, mt.size) - else: - result = h + when defined(trackGcHeaders): var s = cast[ppointer](dest)[] if s != nil: - result = result !& genericHashAux(s, mt.base, shallow, result) + result = result !& hashGcHeader(s) + else: + if shallow: + result = h !& hash(dest, mt.size) + else: + result = h + var s = cast[ppointer](dest)[] + if s != nil: + result = result !& genericHashAux(s, mt.base, shallow, result) # hash the object header: #const headerSize = sizeof(int)*2 #result = result !& hash(cast[pointer](cast[int](s) -% headerSize), |