bugfix: echo vs debugEcho
This commit is contained in:
parent
a783077cfd
commit
d336cb4957
3 changed files with 26 additions and 6 deletions
|
|
@ -686,6 +686,9 @@ proc semEcho(c: PContext, n: PNode): PNode =
|
||||||
for i in countup(1, sonsLen(n) - 1):
|
for i in countup(1, sonsLen(n) - 1):
|
||||||
var arg = semExprWithType(c, n.sons[i])
|
var arg = semExprWithType(c, n.sons[i])
|
||||||
n.sons[i] = semExpr(c, buildStringify(c, arg))
|
n.sons[i] = semExpr(c, buildStringify(c, arg))
|
||||||
|
|
||||||
|
let t = n.sons[0].typ
|
||||||
|
if tfNoSideEffect notin t.flags: incl(c.p.owner.flags, sfSideEffect)
|
||||||
result = n
|
result = n
|
||||||
|
|
||||||
proc buildEchoStmt(c: PContext, n: PNode): PNode =
|
proc buildEchoStmt(c: PContext, n: PNode): PNode =
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,8 @@
|
||||||
# distribution, for details about the copyright.
|
# distribution, for details about the copyright.
|
||||||
#
|
#
|
||||||
|
|
||||||
# included from sem.nim
|
import
|
||||||
|
ast, astalgo, msgs, semdata
|
||||||
|
|
||||||
# Second semantic checking pass over the AST. Necessary because the old
|
# Second semantic checking pass over the AST. Necessary because the old
|
||||||
# way had some inherent problems. Performs:
|
# way had some inherent problems. Performs:
|
||||||
|
|
@ -15,9 +16,25 @@
|
||||||
# * procvar checks
|
# * procvar checks
|
||||||
# * effect tracking
|
# * effect tracking
|
||||||
# * closure analysis
|
# * closure analysis
|
||||||
# * checks for invalid usages of compiletime magics
|
# * checks for invalid usages of compiletime magics (not implemented)
|
||||||
# * checks for invalid usages of PNimNode
|
# * checks for invalid usages of PNimNode (not implemented)
|
||||||
# * later: will do an escape analysis for closures at least
|
# * later: will do an escape analysis for closures at least
|
||||||
|
|
||||||
proc sem2(c: PContext, n: PNode): PNode =
|
# Predefined effects:
|
||||||
nil
|
# io, time (time dependent), gc (performs GC'ed allocation), exceptions,
|
||||||
|
# side effect (accesses global), store (stores into *type*),
|
||||||
|
# store_unkown (performs some store) --> store(any)|store(x)
|
||||||
|
# load (loads from *type*), recursive (recursive call),
|
||||||
|
# endless (has endless loops), --> user effects are defined over *patterns*
|
||||||
|
# --> a TR macro can annotate the proc with user defined annotations
|
||||||
|
# --> the effect system can access these
|
||||||
|
|
||||||
|
proc sem2call(c: PContext, n: PNode): PNode =
|
||||||
|
assert n.kind in nkCallKinds
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
proc sem2sym(c: PContext, n: PNode): PNode =
|
||||||
|
assert n.kind == nkSym
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3431,7 +3431,7 @@ or ``ref T`` or ``ptr T`` this means no locations are modified. It is a static
|
||||||
error to mark a proc/iterator to have no side effect if the compiler cannot
|
error to mark a proc/iterator to have no side effect if the compiler cannot
|
||||||
verify this.
|
verify this.
|
||||||
|
|
||||||
As a special semantic rule, the built-in ``echo`` pretends to be free of
|
As a special semantic rule, the built-in ``debugEcho`` pretends to be free of
|
||||||
side effects, so that it can be used for debugging routines marked as
|
side effects, so that it can be used for debugging routines marked as
|
||||||
``noSideEffect``.
|
``noSideEffect``.
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue