diff options
Diffstat (limited to 'compiler/ndi.nim')
-rw-r--r-- | compiler/ndi.nim | 38 |
1 files changed, 25 insertions, 13 deletions
diff --git a/compiler/ndi.nim b/compiler/ndi.nim index a7ca02193..cc18ab39f 100644 --- a/compiler/ndi.nim +++ b/compiler/ndi.nim @@ -10,31 +10,43 @@ ## This module implements the generation of ``.ndi`` files for better debugging ## support of Nim code. "ndi" stands for "Nim debug info". -import ast, msgs, ropes +import ast, msgs, ropes, options, pathutils + +when defined(nimPreviewSlimSystem): + import std/[syncio, assertions] type NdiFile* = object enabled: bool f: File buf: string + filename: AbsoluteFile + syms: seq[PSym] -proc doWrite(f: var NdiFile; s: PSym) = +proc doWrite(f: var NdiFile; s: PSym; conf: ConfigRef) = f.buf.setLen 0 - f.buf.add s.info.line.int + f.buf.addInt s.info.line.int f.buf.add "\t" - f.buf.add s.info.col.int + f.buf.addInt s.info.col.int f.f.write(s.name.s, "\t") - f.f.writeRope(s.loc.r) - f.f.writeLine("\t", s.info.toFullPath, "\t", f.buf) + f.f.writeRope(s.loc.snippet) + f.f.writeLine("\t", toFullPath(conf, s.info), "\t", f.buf) -template writeMangledName*(f: NdiFile; s: PSym) = - if f.enabled: doWrite(f, s) +template writeMangledName*(f: NdiFile; s: PSym; conf: ConfigRef) = + if f.enabled: f.syms.add s -proc open*(f: var NdiFile; filename: string) = - f.enabled = filename.len > 0 +proc open*(f: var NdiFile; filename: AbsoluteFile; conf: ConfigRef) = + f.enabled = not filename.isEmpty if f.enabled: - f.f = open(filename, 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 |