vm now free of global variables

This commit is contained in:
Andreas Rumpf
2018-05-28 14:41:49 +02:00
parent 5d45e630c5
commit 382bc34f93
4 changed files with 12 additions and 17 deletions

View File

@@ -41,6 +41,8 @@ type
backend*: RootRef # minor hack so that a backend can extend this easily
config*: ConfigRef
cache*: IdentCache
vm*: RootRef # unfortunately the 'vm' state is shared project-wise, this will
# be clarified in later compiler implementations.
doStopCompile*: proc(): bool {.closure.}
usageSym*: PSym # for nimsuggest
owners*: seq[PSym]

View File

@@ -166,14 +166,13 @@ proc runNimScript*(cache: IdentCache; scriptName: string;
var m = graph.makeModule(scriptName)
incl(m.flags, sfMainModule)
vm.globalCtx = setupVM(m, cache, scriptName, graph)
graph.vm = setupVM(m, cache, scriptName, graph)
graph.compileSystemModule(cache)
discard graph.processModule(m, llStreamOpen(scriptName, fmRead), nil, cache)
# ensure we load 'system.nim' again for the real non-config stuff!
resetSystemArtifacts(graph)
vm.globalCtx = nil
# do not remove the defined symbols
#initDefines()
undefSymbol(conf.symbols, "nimscript")

View File

@@ -1654,18 +1654,12 @@ proc getGlobalValue*(c: PCtx; s: PSym): PNode =
include vmops
# for now we share the 'globals' environment. XXX Coming soon: An API for
# storing&loading the 'globals' environment to get what a component system
# requires.
var
globalCtx*: PCtx
proc setupGlobalCtx(module: PSym; cache: IdentCache; graph: ModuleGraph) =
if globalCtx.isNil:
globalCtx = newCtx(module, cache, graph)
registerAdditionalOps(globalCtx)
if graph.vm.isNil:
graph.vm = newCtx(module, cache, graph)
registerAdditionalOps(PCtx graph.vm)
else:
refresh(globalCtx, module)
refresh(PCtx graph.vm, module)
proc myOpen(graph: ModuleGraph; module: PSym; cache: IdentCache): PPassContext =
#var c = newEvalContext(module, emRepl)
@@ -1674,9 +1668,9 @@ proc myOpen(graph: ModuleGraph; module: PSym; cache: IdentCache): PPassContext =
# XXX produce a new 'globals' environment here:
setupGlobalCtx(module, cache, graph)
result = globalCtx
result = PCtx graph.vm
when hasFFI:
globalCtx.features = {allowFFI, allowCast}
PCtx(graph.vm).features = {allowFFI, allowCast}
proc myProcess(c: PPassContext, n: PNode): PNode =
let c = PCtx(c)
@@ -1698,7 +1692,7 @@ proc evalConstExprAux(module: PSym; cache: IdentCache;
mode: TEvalMode): PNode =
let n = transformExpr(g, module, n)
setupGlobalCtx(module, cache, g)
var c = globalCtx
var c = PCtx g.vm
let oldMode = c.mode
defer: c.mode = oldMode
c.mode = mode
@@ -1763,7 +1757,7 @@ proc evalMacroCall*(module: PSym; cache: IdentCache; g: ModuleGraph;
n.renderTree, $(n.safeLen-1), $(sym.typ.len-1)])
setupGlobalCtx(module, cache, g)
var c = globalCtx
var c = PCtx g.vm
c.comesFromHeuristic.line = 0'u16
c.callsite = nOrig

View File

@@ -438,7 +438,7 @@ proc execCmd(cmd: string; graph: ModuleGraph; cache: IdentCache; cachedMsgs: Cac
proc recompileFullProject(graph: ModuleGraph; cache: IdentCache) =
#echo "recompiling full project"
resetSystemArtifacts(graph)
vm.globalCtx = nil
graph.vm = nil
graph.resetAllModules()
GC_fullcollect()
compileProject(graph, cache)