diff options
author | Andreas Rumpf <rumpf_a@web.de> | 2009-01-07 17:03:25 +0100 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2009-01-07 17:03:25 +0100 |
commit | 439aa2d04d5528b5aed288f70895515d1da2dc3d (patch) | |
tree | cda2d0bc4d4f2bab189c4a0567cae3c1428c5ed0 /nim/ecmasgen.pas | |
parent | 1c8ddca7e08af9075a930edaca6c522d5e6fd8b5 (diff) | |
download | Nim-439aa2d04d5528b5aed288f70895515d1da2dc3d.tar.gz |
version 0.7.4
Diffstat (limited to 'nim/ecmasgen.pas')
-rw-r--r-- | nim/ecmasgen.pas | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/nim/ecmasgen.pas b/nim/ecmasgen.pas index d50be9b0c..c9dfcfe25 100644 --- a/nim/ecmasgen.pas +++ b/nim/ecmasgen.pas @@ -896,7 +896,8 @@ begin or (skipGeneric(y.typ).kind in [tyRef, tyPtr, tyVar]) end; -procedure genAsgnAux(var p: TProc; x, y: PNode; var r: TCompRes); +procedure genAsgnAux(var p: TProc; x, y: PNode; var r: TCompRes; + noCopyNeeded: bool); var a, b: TCompRes; begin @@ -906,7 +907,7 @@ begin etyObject: begin if a.com <> nil then appf(r.com, '$1;$n', [a.com]); if b.com <> nil then appf(r.com, '$1;$n', [b.com]); - if needsNoCopy(y) then + if needsNoCopy(y) or noCopyNeeded then appf(r.com, '$1 = $2;$n', [a.res, b.res]) else begin useMagic(p, 'NimCopy'); @@ -930,7 +931,13 @@ end; procedure genAsgn(var p: TProc; n: PNode; var r: TCompRes); begin genLineDir(p, n, r); - genAsgnAux(p, n.sons[0], n.sons[1], r); + genAsgnAux(p, n.sons[0], n.sons[1], r, false); +end; + +procedure genFastAsgn(var p: TProc; n: PNode; var r: TCompRes); +begin + genLineDir(p, n, r); + genAsgnAux(p, n.sons[0], n.sons[1], r, true); end; procedure genSwap(var p: TProc; n: PNode; var r: TCompRes); @@ -1692,6 +1699,7 @@ begin nkReturnStmt: genReturnStmt(p, n, r); nkBreakStmt: genBreakStmt(p, n, r); nkAsgn: genAsgn(p, n, r); + nkFastAsgn: genFastAsgn(p, n, r); nkDiscardStmt: begin genLineDir(p, n, r); gen(p, n.sons[0], r); |