diff options
author | Timothee Cour <timothee.cour2@gmail.com> | 2020-12-30 05:58:41 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-12-30 14:58:41 +0100 |
commit | 8508c4e1c262567ecc093de8b645cec677ce5afd (patch) | |
tree | 35329fb3dcdf9ce94ff56638d5ac3d9eb55d7d07 /compiler | |
parent | 2f4d00fb98beaf6bb2e155e9da7dc7194038b5f3 (diff) | |
download | Nim-8508c4e1c262567ecc093de8b645cec677ce5afd.tar.gz |
fix `hintProcessing` dots interference with `static:echo` and `hintCC`; add tests for `nim secret`, add tests for hintProcessing, misc other bug fixes (#16495)
* fix dots interfering with static:echo * add tests * fix hintProcessing dots for hintCC * improve trunner tests * fix bug: readLineFromStdin now writes prompt to stdout, consistent with linenoise and rdstdin * disable a failing test for windows
Diffstat (limited to 'compiler')
-rw-r--r-- | compiler/extccomp.nim | 5 | ||||
-rw-r--r-- | compiler/llstream.nim | 4 | ||||
-rw-r--r-- | compiler/main.nim | 2 | ||||
-rw-r--r-- | compiler/msgs.nim | 12 | ||||
-rw-r--r-- | compiler/options.nim | 5 | ||||
-rw-r--r-- | compiler/vm.nim | 6 |
6 files changed, 21 insertions, 13 deletions
diff --git a/compiler/extccomp.nim b/compiler/extccomp.nim index e37e867da..14b961ee1 100644 --- a/compiler/extccomp.nim +++ b/compiler/extccomp.nim @@ -848,7 +848,10 @@ proc callCCompiler*(conf: ConfigRef) = var cmds: TStringSeq var prettyCmds: TStringSeq let prettyCb = proc (idx: int) = - if prettyCmds[idx].len > 0: echo prettyCmds[idx] + if prettyCmds[idx].len > 0: + flushDot(conf) + # xxx should probably use stderr like other compiler messages, not stdout + echo prettyCmds[idx] for idx, it in conf.toCompile: # call the C compiler for the .c file: diff --git a/compiler/llstream.nim b/compiler/llstream.nim index b768e6c83..bfc377a16 100644 --- a/compiler/llstream.nim +++ b/compiler/llstream.nim @@ -75,10 +75,10 @@ proc llStreamClose*(s: PLLStream) = when not declared(readLineFromStdin): # fallback implementation: proc readLineFromStdin(prompt: string, line: var string): bool = - stderr.write(prompt) + stdout.write(prompt) result = readLine(stdin, line) if not result: - stderr.write("\n") + stdout.write("\n") quit(0) proc endsWith*(x: string, s: set[char]): bool = diff --git a/compiler/main.nim b/compiler/main.nim index 74c19bf10..c94c4323f 100644 --- a/compiler/main.nim +++ b/compiler/main.nim @@ -138,7 +138,7 @@ proc commandInteractive(graph: ModuleGraph) = var m = graph.makeStdinModule() incl(m.flags, sfMainModule) var idgen = IdGenerator(module: m.itemId.module, item: m.itemId.item) - let s = llStreamOpenStdIn(onPrompt = proc() = flushDot(graph.config, stderr)) + let s = llStreamOpenStdIn(onPrompt = proc() = flushDot(graph.config)) processModule(graph, m, idgen, s) proc commandScan(cache: IdentCache, config: ConfigRef) = diff --git a/compiler/msgs.nim b/compiler/msgs.nim index 6d6e21204..afb51da09 100644 --- a/compiler/msgs.nim +++ b/compiler/msgs.nim @@ -19,8 +19,10 @@ template instLoc(): InstantiationInfo = instantiationInfo(-2, fullPaths = true) template toStdOrrKind(stdOrr): untyped = if stdOrr == stdout: stdOrrStdout else: stdOrrStderr -template flushDot*(conf, stdOrr) = +proc flushDot*(conf: ConfigRef) = ## safe to call multiple times + # xxx one edge case not yet handled is when `printf` is called at CT with `compiletimeFFI`. + let stdOrr = if optStdout in conf.globalOptions: stdout else: stderr let stdOrrKind = toStdOrrKind(stdOrr) if stdOrrKind in conf.lastMsgWasDot: conf.lastMsgWasDot.excl stdOrrKind @@ -311,12 +313,12 @@ proc msgWriteln*(conf: ConfigRef; s: string, flags: MsgFlags = {}) = conf.writelnHook(s) elif optStdout in conf.globalOptions or msgStdout in flags: if eStdOut in conf.m.errorOutputs: - flushDot(conf, stdout) + flushDot(conf) writeLine(stdout, s) flushFile(stdout) else: if eStdErr in conf.m.errorOutputs: - flushDot(conf, stderr) + flushDot(conf) writeLine(stderr, s) # On Windows stderr is fully-buffered when piped, regardless of C std. when defined(windows): @@ -368,11 +370,11 @@ template styledMsgWriteln*(args: varargs[typed]) = callIgnoringStyle(callWritelnHook, nil, args) elif optStdout in conf.globalOptions: if eStdOut in conf.m.errorOutputs: - flushDot(conf, stdout) + flushDot(conf) callIgnoringStyle(writeLine, stdout, args) flushFile(stdout) elif eStdErr in conf.m.errorOutputs: - flushDot(conf, stderr) + flushDot(conf) if optUseColors in conf.globalOptions: callStyledWriteLineStderr(args) else: diff --git a/compiler/options.nim b/compiler/options.nim index 87796539c..1de6d531a 100644 --- a/compiler/options.nim +++ b/compiler/options.nim @@ -368,8 +368,11 @@ proc setNote*(conf: ConfigRef, note: TNoteKind, enabled = true) = if enabled: incl(conf.notes, note) else: excl(conf.notes, note) proc hasHint*(conf: ConfigRef, note: TNoteKind): bool = + # ternary states instead of binary states would simplify logic if optHints notin conf.options: false - elif note in {hintConf}: # could add here other special notes like hintSource + elif note in {hintConf, hintProcessing}: + # could add here other special notes like hintSource + # these notes apply globally. note in conf.mainPackageNotes else: note in conf.notes diff --git a/compiler/vm.nim b/compiler/vm.nim index 34d76f21e..1004826ea 100644 --- a/compiler/vm.nim +++ b/compiler/vm.nim @@ -1153,14 +1153,14 @@ proc rawExecute(c: PCtx, start: int, tos: PStackFrame): TFullReg = stackTrace(c, tos, pc, "node is not a proc symbol") of opcEcho: let rb = instr.regB - if rb == 1: - msgWriteln(c.config, regs[ra].node.strVal, {msgStdout}) + template fn(s) = msgWriteln(c.config, s, {msgStdout}) + if rb == 1: fn(regs[ra].node.strVal) else: var outp = "" for i in ra..ra+rb-1: #if regs[i].kind != rkNode: debug regs[i] outp.add(regs[i].node.strVal) - msgWriteln(c.config, outp, {msgStdout}) + fn(outp) of opcContainsSet: decodeBC(rkInt) regs[ra].intVal = ord(inSet(regs[rb].node, regs[rc].regToNode)) |