bugfix: echo vs debugEcho

This commit is contained in:
Araq 2012-09-13 17:33:20 +02:00
commit d336cb4957
3 changed files with 26 additions and 6 deletions

View file

@ -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 =

View file

@ -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

View file

@ -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``.