From f1e789bfc20a807365fc59f1a5f0c6fb96803ac7 Mon Sep 17 00:00:00 2001 From: Araq Date: Wed, 18 Sep 2013 02:58:18 +0200 Subject: [PATCH] fixes #576 --- compiler/ast.nim | 3 ++- compiler/ccgstmts.nim | 5 +++-- compiler/pragmas.nim | 1 + 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/compiler/ast.nim b/compiler/ast.nim index 6e0cafd74..ea60284da 100644 --- a/compiler/ast.nim +++ b/compiler/ast.nim @@ -231,7 +231,8 @@ type sfVolatile, # variable is volatile sfRegister, # variable should be placed in a register sfPure, # object is "pure" that means it has no type-information - + # enum is "pure", its values need qualified access + # variable is "pure"; it's an explicit "global" sfNoSideEffect, # proc has no side effects sfSideEffect, # proc may have side effects; cannot prove it has none sfMainModule, # module is the main module diff --git a/compiler/ccgstmts.nim b/compiler/ccgstmts.nim index 8115abc2f..3c8c6d9a3 100644 --- a/compiler/ccgstmts.nim +++ b/compiler/ccgstmts.nim @@ -151,8 +151,9 @@ proc genSingleVar(p: BProc, a: PNode) = var targetProc = p var immediateAsgn = a.sons[2].kind != nkEmpty if sfGlobal in v.flags: - if v.owner.kind != skModule: - targetProc = p.module.postInitProc + if sfPure in v.flags: + # v.owner.kind != skModule: + targetProc = p.module.preInitProc assignGlobalVar(targetProc, v) # XXX: be careful here. # Global variables should not be zeromem-ed within loops diff --git a/compiler/pragmas.nim b/compiler/pragmas.nim index aeffcdc4c..8c2425de3 100644 --- a/compiler/pragmas.nim +++ b/compiler/pragmas.nim @@ -569,6 +569,7 @@ proc singlePragma(c: PContext, sym: PSym, n: PNode, i: int, of wGlobal: noVal(it) incl(sym.flags, sfGlobal) + incl(sym.flags, sfPure) of wMerge: noval(it) incl(sym.flags, sfMerge)