diff options
author | Timothee Cour <timothee.cour2@gmail.com> | 2020-04-01 08:48:17 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-04-01 17:48:17 +0200 |
commit | d3020af44d57316b3d913962a64a0949714d26f7 (patch) | |
tree | 6a6f2ee4c39682ae7d75fc4d21d6fc7e7b3875c4 | |
parent | c2d29eb3e0c518753ecd27c3809366c36bd2aec4 (diff) | |
download | Nim-d3020af44d57316b3d913962a64a0949714d26f7.tar.gz |
fix open file leak when running --debugger:native (#13832)
-rw-r--r-- | compiler/cgen.nim | 5 | ||||
-rw-r--r-- | compiler/ndi.nim | 17 |
2 files changed, 16 insertions, 6 deletions
diff --git a/compiler/cgen.nim b/compiler/cgen.nim index e03ddff09..e93465d73 100644 --- a/compiler/cgen.nim +++ b/compiler/cgen.nim @@ -1924,8 +1924,8 @@ proc shouldRecompile(m: BModule; code: Rope, cfile: Cfile): bool = # it would generate multiple 'main' procs, for instance. proc writeModule(m: BModule, pending: bool) = + template onExit() = close(m.ndi, m.config) let cfile = getCFile(m) - if true or optForceFullMake in m.config.globalOptions: if moduleHasChanged(m.g.graph, m.module): genInitCode(m) @@ -1943,6 +1943,7 @@ proc writeModule(m: BModule, pending: bool) = when hasTinyCBackend: if conf.cmd == cmdRun: tccgen.compileCCode($code) + onExit() return if not shouldRecompile(m, code, cf): cf.flags = {CfileFlag.Cached} @@ -1966,7 +1967,7 @@ proc writeModule(m: BModule, pending: bool) = obj: completeCfilePath(m.config, toObjFile(m.config, cfile)), flags: {}) if not fileExists(cf.obj): cf.flags = {CfileFlag.Cached} addFileToCompile(m.config, cf) - close(m.ndi) + onExit() proc updateCachedModule(m: BModule) = let cfile = getCFile(m) diff --git a/compiler/ndi.nim b/compiler/ndi.nim index 41f04cf0d..5af87237f 100644 --- a/compiler/ndi.nim +++ b/compiler/ndi.nim @@ -17,6 +17,8 @@ type enabled: bool f: File buf: string + filename: AbsoluteFile + syms: seq[PSym] proc doWrite(f: var NdiFile; s: PSym; conf: ConfigRef) = f.buf.setLen 0 @@ -28,13 +30,20 @@ proc doWrite(f: var NdiFile; s: PSym; conf: ConfigRef) = f.f.writeLine("\t", toFullPath(conf, s.info), "\t", f.buf) template writeMangledName*(f: NdiFile; s: PSym; conf: ConfigRef) = - if f.enabled: doWrite(f, s, conf) + if f.enabled: f.syms.add s proc open*(f: var NdiFile; filename: AbsoluteFile; conf: ConfigRef) = f.enabled = not filename.isEmpty if f.enabled: - f.f = open(filename.string, fmWrite, 8000) + f.filename = filename f.buf = newStringOfCap(20) -proc close*(f: var NdiFile) = - if f.enabled: close(f.f) +proc close*(f: var NdiFile, conf: ConfigRef) = + if f.enabled: + f.f = open(f.filename.string, fmWrite, 8000) + doAssert f.f != nil, f.filename.string + for s in f.syms: + doWrite(f, s, conf) + close(f.f) + f.syms.reset + f.filename.reset |