diff options
author | Araq <rumpf_a@web.de> | 2019-04-09 11:38:54 +0200 |
---|---|---|
committer | Araq <rumpf_a@web.de> | 2019-04-09 11:38:54 +0200 |
commit | d59e9c37fa4d8eb8da055d3fde763964b5e44040 (patch) | |
tree | a9d18a34f4d551920adaceba87e370aeafe965ce | |
parent | da6ff14184084465e04812da877507cd6196ca23 (diff) | |
download | Nim-d59e9c37fa4d8eb8da055d3fde763964b5e44040.tar.gz |
added lowerings.evalOnce
-rw-r--r-- | compiler/lowerings.nim | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/compiler/lowerings.nim b/compiler/lowerings.nim index e1eff7a70..5004ba90b 100644 --- a/compiler/lowerings.nim +++ b/compiler/lowerings.nim @@ -72,6 +72,22 @@ proc lowerTupleUnpacking*(g: ModuleGraph; n: PNode; owner: PSym): PNode = if n.sons[i].kind == nkSym: v.addVar(n.sons[i]) result.add newAsgnStmt(n.sons[i], newTupleAccess(g, tempAsNode, i)) +proc evalOnce*(g: ModuleGraph; value: PNode; owner: PSym): PNode = + ## Turns (value) into (let tmp = value; tmp) so that 'value' can be re-used + ## freely, multiple times. This is frequently required and such a builtin would also be + ## handy to have in macros.nim. The value that can be reused is 'result.lastSon'! + result = newNodeIT(nkStmtListExpr, value.info, value.typ) + var temp = newSym(skTemp, getIdent(g.cache, genPrefix), owner, value.info, g.config.options) + temp.typ = skipTypes(value.typ, abstractInst) + incl(temp.flags, sfFromGeneric) + + var v = newNodeI(nkLetSection, value.info) + let tempAsNode = newSymNode(temp) + v.addVar(tempAsNode) + result.add(v) + result.add newAsgnStmt(tempAsNode, value) + result.add tempAsNode + proc newTupleAccessRaw*(tup: PNode, i: int): PNode = result = newNodeI(nkBracketExpr, tup.info) addSon(result, copyTree(tup)) |