summary refs log tree commit diff stats
path: root/compiler
diff options
context:
space:
mode:
authorZahary Karadjov <zahary@gmail.com>2018-04-19 19:16:05 +0300
committerAndreas Rumpf <rumpf_a@web.de>2018-05-07 09:37:49 +0200
commit2b8bf8fc4ae4204089a9f177c4ba62c5872d4f0a (patch)
tree6ffb673a6a6fa16ede6adbf0e652e505352ec658 /compiler
parentbdcb72959729a5c4b195f9bf6b2ac8783c27f38e (diff)
downloadNim-2b8bf8fc4ae4204089a9f177c4ba62c5872d4f0a.tar.gz
A motivating example for the new `bindSym` behavior.
The example is a proof-of-concept logging library, allowing you to define
lexically-scoped environments where certain logging attributes are applied
automatically to all logging statements.

fixes tmacro1 (use of `bindSym` inside static blocks)
Diffstat (limited to 'compiler')
-rw-r--r--compiler/semdata.nim1
-rw-r--r--compiler/semexprs.nim2
-rw-r--r--compiler/semmagic.nim2
-rw-r--r--compiler/semstmts.nim2
4 files changed, 6 insertions, 1 deletions
diff --git a/compiler/semdata.nim b/compiler/semdata.nim
index fc0488814..62be471f7 100644
--- a/compiler/semdata.nim
+++ b/compiler/semdata.nim
@@ -89,6 +89,7 @@ type
     ambiguousSymbols*: IntSet  # ids of all ambiguous symbols (cannot
                                # store this info in the syms themselves!)
     inGenericContext*: int     # > 0 if we are in a generic type
+    inStaticContext*: int      # > 0 if we are inside a static: block
     inUnrolledContext*: int    # > 0 if we are unrolling a loop
     compilesContextId*: int    # > 0 if we are in a ``compiles`` magic
     compilesContextIdGenerator*: int
diff --git a/compiler/semexprs.nim b/compiler/semexprs.nim
index 29f377a19..5ef9916ad 100644
--- a/compiler/semexprs.nim
+++ b/compiler/semexprs.nim
@@ -1780,6 +1780,7 @@ proc tryExpr(c: PContext, n: PNode, flags: TExprFlags = {}): PNode =
   let oldInGenericContext = c.inGenericContext
   let oldInUnrolledContext = c.inUnrolledContext
   let oldInGenericInst = c.inGenericInst
+  let oldInStaticContext = c.inStaticContext
   let oldProcCon = c.p
   c.generics = @[]
   var err: string
@@ -1794,6 +1795,7 @@ proc tryExpr(c: PContext, n: PNode, flags: TExprFlags = {}): PNode =
   c.inGenericContext = oldInGenericContext
   c.inUnrolledContext = oldInUnrolledContext
   c.inGenericInst = oldInGenericInst
+  c.inStaticContext = oldInStaticContext
   c.p = oldProcCon
   msgs.setInfoContextLen(oldContextLen)
   setLen(c.graph.owners, oldOwnerLen)
diff --git a/compiler/semmagic.nim b/compiler/semmagic.nim
index bf3c55120..e6e29b4d3 100644
--- a/compiler/semmagic.nim
+++ b/compiler/semmagic.nim
@@ -199,7 +199,7 @@ proc semBindSym(c: PContext, n: PNode): PNode =
   if s != nil:
     # we need to mark all symbols:
     var sc = symChoice(c, id, s, TSymChoiceRule(isMixin.intVal))
-    if not getCurrOwner(c).isCompileTimeProc:
+    if not (c.inStaticContext > 0 or getCurrOwner(c).isCompileTimeProc):
       # inside regular code, bindSym resolves to the sym-choice
       # nodes (see tinspectsymbol)
       return sc
diff --git a/compiler/semstmts.nim b/compiler/semstmts.nim
index b0bd4e0f6..f3cf4196f 100644
--- a/compiler/semstmts.nim
+++ b/compiler/semstmts.nim
@@ -1754,7 +1754,9 @@ proc semPragmaBlock(c: PContext, n: PNode): PNode =
 proc semStaticStmt(c: PContext, n: PNode): PNode =
   #echo "semStaticStmt"
   #writeStackTrace()
+  inc c.inStaticContext
   let a = semStmt(c, n.sons[0])
+  dec c.inStaticContext
   n.sons[0] = a
   evalStaticStmt(c.module, c.cache, c.graph.config, a, c.p.owner)
   result = newNodeI(nkDiscardStmt, n.info, 1)