fixes a long standing bug concerning assignment of case objects

This commit is contained in:
Araq 2012-05-22 01:02:33 +02:00
commit 7f64e95747
2 changed files with 10 additions and 4 deletions

View file

@ -7,6 +7,8 @@
# distribution, for details about the copyright. # distribution, for details about the copyright.
# #
proc genericResetAux(dest: Pointer, n: ptr TNimNode)
proc genericAssignAux(dest, src: Pointer, mt: PNimType, shallow: bool) proc genericAssignAux(dest, src: Pointer, mt: PNimType, shallow: bool)
proc genericAssignAux(dest, src: Pointer, n: ptr TNimNode, shallow: bool) = proc genericAssignAux(dest, src: Pointer, n: ptr TNimNode, shallow: bool) =
var var
@ -20,10 +22,16 @@ proc genericAssignAux(dest, src: Pointer, n: ptr TNimNode, shallow: bool) =
for i in 0..n.len-1: for i in 0..n.len-1:
genericAssignAux(dest, src, n.sons[i], shallow) genericAssignAux(dest, src, n.sons[i], shallow)
of nkCase: of nkCase:
var dd = selectBranch(dest, n)
var m = selectBranch(src, n)
# reset if different branches are in use; note different branches also
# imply that's not self-assignment (``x = x``)!
if m != dd and dd != nil:
genericResetAux(dest, dd)
copyMem(cast[pointer](d +% n.offset), cast[pointer](s +% n.offset), copyMem(cast[pointer](d +% n.offset), cast[pointer](s +% n.offset),
n.typ.size) n.typ.size)
var m = selectBranch(src, n) if m != nil:
if m != nil: genericAssignAux(dest, src, m, shallow) genericAssignAux(dest, src, m, shallow)
of nkNone: sysAssert(false, "genericAssignAux") of nkNone: sysAssert(false, "genericAssignAux")
#else: #else:
# echo "ugh memory corruption! ", n.kind # echo "ugh memory corruption! ", n.kind

View file

@ -1,8 +1,6 @@
version 0.9.0 version 0.9.0
============= =============
- bug: generic assign still buggy
- special case the generic assign that needs to care about case objects
- make templates hygienic by default - make templates hygienic by default
- ``bind`` for overloaded symbols does not work apparently - ``bind`` for overloaded symbols does not work apparently
- ``=`` should be overloadable; requires specialization for ``=`` - ``=`` should be overloadable; requires specialization for ``=``