From d336cb4957c6b223ce7e8d717718217cb0665b56 Mon Sep 17 00:00:00 2001 From: Araq Date: Thu, 13 Sep 2012 17:33:20 +0200 Subject: [PATCH] bugfix: echo vs debugEcho --- compiler/semexprs.nim | 3 +++ compiler/sempass2.nim | 27 ++++++++++++++++++++++----- doc/manual.txt | 2 +- 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/compiler/semexprs.nim b/compiler/semexprs.nim index e53db7ceca..d60879e0b1 100755 --- a/compiler/semexprs.nim +++ b/compiler/semexprs.nim @@ -686,6 +686,9 @@ proc semEcho(c: PContext, n: PNode): PNode = for i in countup(1, sonsLen(n) - 1): var arg = semExprWithType(c, n.sons[i]) 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 proc buildEchoStmt(c: PContext, n: PNode): PNode = diff --git a/compiler/sempass2.nim b/compiler/sempass2.nim index 78653bb44b..9b00901bbd 100644 --- a/compiler/sempass2.nim +++ b/compiler/sempass2.nim @@ -7,7 +7,8 @@ # 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 # way had some inherent problems. Performs: @@ -15,9 +16,25 @@ # * procvar checks # * effect tracking # * closure analysis -# * checks for invalid usages of compiletime magics -# * checks for invalid usages of PNimNode +# * checks for invalid usages of compiletime magics (not implemented) +# * checks for invalid usages of PNimNode (not implemented) # * later: will do an escape analysis for closures at least -proc sem2(c: PContext, n: PNode): PNode = - nil +# Predefined effects: +# 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 + + diff --git a/doc/manual.txt b/doc/manual.txt index 042163de9b..028ccb6714 100755 --- a/doc/manual.txt +++ b/doc/manual.txt @@ -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 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 ``noSideEffect``.