fixes a long standing bug concerning assignment of case objects
This commit is contained in:
parent
ea5b74c832
commit
7f64e95747
2 changed files with 10 additions and 4 deletions
|
|
@ -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
|
||||||
|
|
|
||||||
2
todo.txt
2
todo.txt
|
|
@ -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 ``=``
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue