avoid creating temporary in genObjConstr if possible (#7032)

This commit is contained in:
jcosborn 2018-01-10 19:01:51 -06:00 • committed by Andreas Rumpf
commit d0a9fac362
3 changed files with 45 additions and 17 deletions

View file

@ -1202,11 +1202,20 @@ proc genObjConstr(p: BProc, e: PNode, d: var TLoc) =
# we skip this step here: # we skip this step here:
if not p.module.compileToCpp: if not p.module.compileToCpp:
if handleConstExpr(p, e, d): return if handleConstExpr(p, e, d): return
var tmp: TLoc
var t = e.typ.skipTypes(abstractInst) var t = e.typ.skipTypes(abstractInst)
getTemp(p, t, tmp)
let isRef = t.kind == tyRef let isRef = t.kind == tyRef
var r = rdLoc(tmp)
# check if we need to construct the object in a temporary
var useTemp =
isRef or
(d.k notin {locTemp,locLocalVar,locGlobalVar,locParam,locField}) or
(isPartOf(d.lode, e) != arNo)
var tmp: TLoc
var r: Rope
if useTemp:
getTemp(p, t, tmp)
r = rdLoc(tmp)
if isRef: if isRef:
rawGenNew(p, tmp, nil) rawGenNew(p, tmp, nil)
t = t.lastSon.skipTypes(abstractInst) t = t.lastSon.skipTypes(abstractInst)
@ -1214,6 +1223,9 @@ proc genObjConstr(p: BProc, e: PNode, d: var TLoc) =
gcUsage(e) gcUsage(e)
else: else:
constructLoc(p, tmp) constructLoc(p, tmp)
else:
resetLoc(p, d)
r = rdLoc(d)
discard getTypeDesc(p.module, t) discard getTypeDesc(p.module, t)
let ty = getUniqueType(t) let ty = getUniqueType(t)
for i in 1 ..< e.len: for i in 1 ..< e.len:
@ -1227,11 +1239,15 @@ proc genObjConstr(p: BProc, e: PNode, d: var TLoc) =
genFieldCheck(p, it.sons[2], r, field) genFieldCheck(p, it.sons[2], r, field)
add(tmp2.r, ".") add(tmp2.r, ".")
add(tmp2.r, field.loc.r) add(tmp2.r, field.loc.r)
if useTemp:
tmp2.k = locTemp tmp2.k = locTemp
tmp2.lode = it.sons[1]
tmp2.storage = if isRef: OnHeap else: OnStack tmp2.storage = if isRef: OnHeap else: OnStack
else:
tmp2.k = d.k
tmp2.storage = if isRef: OnHeap else: d.storage
tmp2.lode = it.sons[1]
expr(p, it.sons[1], tmp2) expr(p, it.sons[1], tmp2)
if useTemp:
if d.k == locNone: if d.k == locNone:
d = tmp d = tmp
else: else:

View file

@ -15,7 +15,8 @@ discard """
(y: 678, x: 123) (y: 678, x: 123)
(y: 678, x: 123) (y: 678, x: 123)
(y: 0, x: 123) (y: 0, x: 123)
(y: 678, x: 123)''' (y: 678, x: 123)
(y: 123, x: 678)'''
""" """
type type
@ -75,3 +76,7 @@ when true:
echo b # (y: 0, x: 123) echo b # (y: 0, x: 123)
b=B(y: 678, x: 123) b=B(y: 678, x: 123)
echo b # (y: 678, x: 123) echo b # (y: 678, x: 123)
b=B(y: b.x, x: b.y)
echo b # (y: 123, x: 678)
GC_fullCollect()

View file

@ -1,3 +1,8 @@
discard """
output: '''42
Foo'''
"""
type TFoo{.exportc.} = object type TFoo{.exportc.} = object
x:int x:int
@ -48,3 +53,5 @@ type NamedGraphic = object of Graphic2
var ngr = NamedGraphic(kind: Koo, radius: 6.9, name: "Foo") var ngr = NamedGraphic(kind: Koo, radius: 6.9, name: "Foo")
echo ngr.name echo ngr.name
GC_fullCollect()