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)