summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorTimothee Cour <timothee.cour2@gmail.com>2021-06-20 00:51:07 -0700
committerGitHub <noreply@github.com>2021-06-20 09:51:07 +0200
commit6030e139b5c630b5508dbe12d7b58c56264212b1 (patch)
treebf96b32677b329c25bea1f0fc8017c2f393a6d6f
parent590d457631290beacf97d945c5d3a625cc671645 (diff)
downloadNim-6030e139b5c630b5508dbe12d7b58c56264212b1.tar.gz
move {.injectStmt.} to experimental; add a test (#18300)
* move {.injectStmt.} to experimental; add a test

* undocument and deprecat `.injectStmt` but keep its implementation until we have a replacement
-rw-r--r--compiler/pragmas.nim5
-rw-r--r--doc/manual.rst11
-rw-r--r--doc/manual_experimental.rst1
-rw-r--r--lib/pure/asyncdispatch.nim2
-rw-r--r--lib/system/gc_ms.nim1
-rw-r--r--tests/pragmas/tinjectstmt.nim48
6 files changed, 53 insertions, 15 deletions
diff --git a/compiler/pragmas.nim b/compiler/pragmas.nim
index 695e595c3..8ae931d84 100644
--- a/compiler/pragmas.nim
+++ b/compiler/pragmas.nim
@@ -1183,6 +1183,7 @@ proc singlePragma(c: PContext, sym: PSym, n: PNode, i: var int,
         if sym == nil: invalidPragma(c, it)
         else: magicsys.registerNimScriptSymbol(c.graph, sym)
       of wInjectStmt:
+        warningDeprecated(c.config, it.info, "'.injectStmt' pragma is deprecated")
         if it.kind notin nkPragmaCallKinds or it.len != 2:
           localError(c.config, it.info, "expression expected")
         else:
@@ -1194,10 +1195,10 @@ proc singlePragma(c: PContext, sym: PSym, n: PNode, i: var int,
       of wThis:
         if it.kind in nkPragmaCallKinds and it.len == 2:
           c.selfName = considerQuotedIdent(c, it[1])
-          message(c.config, n.info, warnDeprecated, "the '.this' pragma is deprecated")
+          message(c.config, n.info, warnDeprecated, "'.this' pragma is deprecated")
         elif it.kind == nkIdent or it.len == 1:
           c.selfName = getIdent(c.cache, "self")
-          message(c.config, n.info, warnDeprecated, "the '.this' pragma is deprecated")
+          message(c.config, n.info, warnDeprecated, "'.this' pragma is deprecated")
         else:
           localError(c.config, it.info, "'this' pragma is allowed to have zero or one arguments")
       of wNoRewrite:
diff --git a/doc/manual.rst b/doc/manual.rst
index 46a40a690..e8eec9a57 100644
--- a/doc/manual.rst
+++ b/doc/manual.rst
@@ -7432,17 +7432,6 @@ work properly (in particular regarding constructor and destructor) for
   proc main()=
     var a {.threadvar.}: Foo
 
-InjectStmt pragma
------------------
-
-The `injectStmt` pragma can be used to inject a statement before every
-other statement in the current module. It is only supposed to be used for
-debugging:
-
-.. code-block:: nim
-  {.injectStmt: gcInvariants().}
-
-  # ... complex code here that produces crashes ...
 
 compile-time define pragmas
 ---------------------------
diff --git a/doc/manual_experimental.rst b/doc/manual_experimental.rst
index 3157708da..d10ef8d1b 100644
--- a/doc/manual_experimental.rst
+++ b/doc/manual_experimental.rst
@@ -380,6 +380,7 @@ pass multiple blocks to a macro:
     # code to undo it
 
 
+
 Special Operators
 =================
 
diff --git a/lib/pure/asyncdispatch.nim b/lib/pure/asyncdispatch.nim
index 3866ebd24..b88d5ede8 100644
--- a/lib/pure/asyncdispatch.nim
+++ b/lib/pure/asyncdispatch.nim
@@ -176,8 +176,6 @@ export Port, SocketFlag
 export asyncfutures except callSoon
 export asyncstreams
 
-#{.injectStmt: newGcInvariant().}
-
 # TODO: Check if yielded future is nil and throw a more meaningful exception
 
 type
diff --git a/lib/system/gc_ms.nim b/lib/system/gc_ms.nim
index c20e93699..9e306c497 100644
--- a/lib/system/gc_ms.nim
+++ b/lib/system/gc_ms.nim
@@ -429,6 +429,7 @@ proc sweep(gch: var GcHeap) =
         else: freeCyclicCell(gch, c)
 
 when false:
+  # meant to be used with the now-deprected `.injectStmt`: {.injectStmt: newGcInvariant().}
   proc newGcInvariant*() =
     for x in allObjects(gch.region):
       if isCell(x):
diff --git a/tests/pragmas/tinjectstmt.nim b/tests/pragmas/tinjectstmt.nim
new file mode 100644
index 000000000..bca041e46
--- /dev/null
+++ b/tests/pragmas/tinjectstmt.nim
@@ -0,0 +1,48 @@
+discard """
+  joinable: false
+  output:'''
+onInject: 1
+onInject: 2
+ok0
+ok1
+onInject: 3
+onInject: 4
+0
+onInject: 5
+onInject: 6
+1
+onInject: 7
+onInject: 8
+2
+ok2
+onInject: 9
+'''
+"""
+
+# test {.injectStmt.}
+
+#[
+{.injectStmt.} pragma can be used to inject a statement before every
+other statement in the current module. It's now undocumented and may be removed
+in the future and replaced with something more general and without its limitations.
+e.g. (e.g. doesn't work in VM or js backends).
+]#
+
+from system/ansi_c import c_printf
+
+var count = 0
+proc onInject*() =
+  count.inc
+  # echo count # xxx would fail, probably infinite recursion
+  c_printf("onInject: %d\n", cast[int](count))
+
+{.injectStmt: onInject().}
+echo "ok0"
+proc main()=
+  echo "ok1"
+  for a in 0..<3:
+    echo a
+  echo "ok2"
+
+static: main() # xxx injectStmt not honred in VM
+main()