diff --git a/doc/tut2.txt b/doc/tut2.txt index 7276a8f125..b4b29d7cea 100755 --- a/doc/tut2.txt +++ b/doc/tut2.txt @@ -558,10 +558,10 @@ The template body does not open a new scope. To open a new scope use a ``block`` statement: .. code-block:: nimrod - template declareInScope(x: expr, t: typeDesc): stmt = + template declareInScope(x: expr, t: typeDesc): stmt {.immediate.} = var x: t - template declareInNewScope(x: expr, t: typeDesc): stmt = + template declareInNewScope(x: expr, t: typeDesc): stmt {.immediate.} = # open a new scope: block: var x: t @@ -572,6 +572,8 @@ statement: declareInNewScope(b, int) b = 42 # does not work, `b` is unknown +(The manual explains why the ``immediate`` pragma is needed for these +templates.) If there is a ``stmt`` parameter it should be the last in the template declaration. The reason is that statements can be passed to a template @@ -580,7 +582,7 @@ via a special ``:`` syntax: .. code-block:: nimrod template withFile(f: expr, filename: string, mode: TFileMode, - body: stmt): stmt = + body: stmt): stmt {.immediate.} = block: let fn = filename var f: TFile diff --git a/lib/system/debugger.nim b/lib/system/debugger.nim index 564f080d1f..ca60b04057 100755 --- a/lib/system/debugger.nim +++ b/lib/system/debugger.nim @@ -632,7 +632,12 @@ proc genericHashAux(dest: Pointer, mt: PNimType, shallow: bool, else: result = h var s = cast[ppointer](dest)[] - if s != nil: result = genericHashAux(s, mt.base, shallow, result) + 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), + # headerSize) else: result = h !& hash(dest, mt.size) # hash raw bits diff --git a/lib/system/gc.nim b/lib/system/gc.nim index ea30754a6d..883089c570 100755 --- a/lib/system/gc.nim +++ b/lib/system/gc.nim @@ -100,6 +100,8 @@ proc usrToCell(usr: pointer): PCell {.inline.} = result = cast[PCell](cast[TAddress](usr)-%TAddress(sizeof(TCell))) proc canbeCycleRoot(c: PCell): bool {.inline.} = + if c.typ == nil: + echo "ARRGHHHHHHH" result = ntfAcyclic notin c.typ.flags proc extGetCellType(c: pointer): PNimType {.compilerproc.} =