diff options
author | Andreas Rumpf <andreasrumpf@noname> | 2009-09-15 23:22:22 +0200 |
---|---|---|
committer | Andreas Rumpf <andreasrumpf@noname> | 2009-09-15 23:22:22 +0200 |
commit | 66a7e3d37c0303997a6b1a3b7ec263dfb8c07748 (patch) | |
tree | 40ae1ab8aeb9086b7310ea73ab8a2ed6b597f88b /nim/transf.pas | |
parent | 300430fbba28b408f7ac86ca46b03d9d50839399 (diff) | |
download | Nim-66a7e3d37c0303997a6b1a3b7ec263dfb8c07748.tar.gz |
added tools and web dirs
Diffstat (limited to 'nim/transf.pas')
-rwxr-xr-x[-rw-r--r--] | nim/transf.pas | 47 |
1 files changed, 33 insertions, 14 deletions
diff --git a/nim/transf.pas b/nim/transf.pas index 3e3b2a611..79f65b754 100644..100755 --- a/nim/transf.pas +++ b/nim/transf.pas @@ -124,7 +124,7 @@ Should be transformed into:: return a[i] block L1: inc(c.i) -More efficient, but not implementable: +More efficient, but not implementable:: type TItemsClosure = record @@ -288,7 +288,7 @@ end; function inlineIter(c: PTransf; n: PNode): PNode; var - i: int; + i, j, L: int; it: PNode; newVar: PSym; begin @@ -304,16 +304,33 @@ begin for i := 0 to sonsLen(result)-1 do begin it := result.sons[i]; if it.kind = nkCommentStmt then continue; - if (it.kind <> nkIdentDefs) or (it.sons[0].kind <> nkSym) then - InternalError(it.info, 'inlineIter'); - newVar := copySym(it.sons[0].sym); - include(newVar.flags, sfFromGeneric); - // fixes a strange bug for rodgen: - //include(it.sons[0].sym.flags, sfFromGeneric); - newVar.owner := getCurrOwner(c); - IdNodeTablePut(c.transCon.mapping, it.sons[0].sym, newSymNode(newVar)); - it.sons[0] := newSymNode(newVar); - it.sons[2] := transform(c, it.sons[2]); + if it.kind = nkIdentDefs then begin + if (it.sons[0].kind <> nkSym) then + InternalError(it.info, 'inlineIter'); + newVar := copySym(it.sons[0].sym); + include(newVar.flags, sfFromGeneric); + // fixes a strange bug for rodgen: + //include(it.sons[0].sym.flags, sfFromGeneric); + newVar.owner := getCurrOwner(c); + IdNodeTablePut(c.transCon.mapping, it.sons[0].sym, newSymNode(newVar)); + it.sons[0] := newSymNode(newVar); + it.sons[2] := transform(c, it.sons[2]); + end + else begin + if it.kind <> nkVarTuple then + InternalError(it.info, 'inlineIter: not nkVarTuple'); + L := sonsLen(it); + for j := 0 to L-3 do begin + newVar := copySym(it.sons[j].sym); + include(newVar.flags, sfFromGeneric); + newVar.owner := getCurrOwner(c); + IdNodeTablePut(c.transCon.mapping, it.sons[j].sym, + newSymNode(newVar)); + it.sons[j] := newSymNode(newVar); + end; + assert(it.sons[L-2] = nil); + it.sons[L-1] := transform(c, it.sons[L-1]); + end end end else begin @@ -758,7 +775,8 @@ function getMergeOp(n: PNode): PSym; begin result := nil; case n.kind of - nkCall, nkHiddenCallConv, nkCommand, nkInfix, nkPrefix, nkPostfix: begin + nkCall, nkHiddenCallConv, nkCommand, nkInfix, nkPrefix, nkPostfix, + nkCallStrLit: begin if (n.sons[0].Kind = nkSym) and (n.sons[0].sym.kind = skProc) and (sfMerge in n.sons[0].sym.flags) then result := n.sons[0].sym; @@ -873,7 +891,8 @@ begin n.sons[0] := transform(c, n.sons[0]); n.sons[1] := transformContinue(c, n.sons[1]); end; - nkCall, nkHiddenCallConv, nkCommand, nkInfix, nkPrefix, nkPostfix: + nkCall, nkHiddenCallConv, nkCommand, nkInfix, nkPrefix, nkPostfix, + nkCallStrLit: result := transformCall(c, result); nkAddr, nkHiddenAddr: result := transformAddrDeref(c, n, nkDerefExpr, nkHiddenDeref); |