summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorAraq <rumpf_a@web.de>2019-04-09 11:38:54 +0200
committerAraq <rumpf_a@web.de>2019-04-09 11:38:54 +0200
commitd59e9c37fa4d8eb8da055d3fde763964b5e44040 (patch)
treea9d18a34f4d551920adaceba87e370aeafe965ce
parentda6ff14184084465e04812da877507cd6196ca23 (diff)
downloadNim-d59e9c37fa4d8eb8da055d3fde763964b5e44040.tar.gz
added lowerings.evalOnce
-rw-r--r--compiler/lowerings.nim16
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))