This commit is contained in:
Araq
2013-09-10 22:04:12 +02:00
parent 138db5a85d
commit 275c7ccf82
5 changed files with 46 additions and 10 deletions

View File

@@ -304,7 +304,7 @@ proc genAssignment(p: BProc, dest, src: TLoc, flags: TAssignmentFlags) =
of tyObject:
# XXX: check for subtyping?
if needsComplexAssignment(ty):
if asgnComplexity(ty.n) <= 4:
if ty.sons[0].isNil and asgnComplexity(ty.n) <= 4:
discard getTypeDesc(p.module, ty)
internalAssert ty.n != nil
genOptAsgnObject(p, dest, src, flags, ty.n)
@@ -1017,7 +1017,6 @@ proc genObjConstr(p: BProc, e: PNode, d: var TLoc) =
rawGenNew(p, tmp, nil)
t = t.sons[0].skipTypes(abstractInst)
r = ropef("(*$1)", r)
# XXX object initialization? but not necessary for temps, is it?
discard getTypeDesc(p.module, t)
for i in 1 .. <e.len:
let it = e.sons[i]

View File

@@ -384,12 +384,6 @@ proc initLocalVar(p: BProc, v: PSym, immediateAsgn: bool) =
if not immediateAsgn:
constructLoc(p, v.loc)
proc initTemp(p: BProc, tmp: var TLoc) =
# XXX: This is still suspicious.
# Objects should always be constructed?
if containsGarbageCollectedRef(tmp.t) or isInvalidReturnType(tmp.t):
constructLoc(p, tmp)
proc getTemp(p: BProc, t: PType, result: var TLoc) =
inc(p.labels)
if gCmd == cmdCompileToLLVM:
@@ -402,7 +396,7 @@ proc getTemp(p: BProc, t: PType, result: var TLoc) =
result.t = getUniqueType(t)
result.s = OnStack
result.flags = {}
initTemp(p, result)
constructLoc(p, result)
proc keepAlive(p: BProc, toKeepAlive: TLoc) =
when false:

View File

@@ -73,6 +73,8 @@ proc genericAssignAux(dest, src: Pointer, mt: PNimType, shallow: bool) =
# sequence reallocations:
var pint = cast[ptr PNimType](dest)
pint[] = cast[ptr PNimType](src)[]
if mt.base != nil:
genericAssignAux(dest, src, mt.base, shallow)
genericAssignAux(dest, src, mt.node, shallow)
of tyTuple:
genericAssignAux(dest, src, mt.node, shallow)

View File

@@ -120,7 +120,9 @@ proc storeAux(dest, src: Pointer, mt: PNimType, t: PRawChannel,
# copy type field:
var pint = cast[ptr PNimType](dest)
# XXX use dynamic type here!
pint[] = mt
pint[] = mt
if mt.base != nil:
storeAux(dest, src, mt.base, t, mode)
storeAux(dest, src, mt.node, t, mode)
of tyTuple:
storeAux(dest, src, mt.node, t, mode)

39
tests/run/tobjasgn.nim Normal file
View File

@@ -0,0 +1,39 @@
discard """
output: '''0
pre test a:test b:1 c:2 haha:3
assignment test a:test b:1 c:2 haha:3
'''
"""
type TSomeObj = object of TObject
Variable: int
var a = TSomeObj()
echo a.Variable.`$`
# bug #575
type
Something = object of Tobject
a: string
b, c: int32
type
Other = object of Something
haha: int
proc `$`(x: Other): string =
result = "a:" & x.a & " b:" & $x.b & " c:" & $x.c & " haha:" & $x.haha
var
t: Other
t.a = "test"
t.b = 1
t.c = 2
t.haha = 3
echo "pre test ", $t
var x = t
echo "assignment test ", x