mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-28 17:04:41 +00:00
js -r defines nodejs & program result undeclared if unavailable (#21849)
* js -r defines nodejs & program result undefined if unavailable fixes #16985, fixes #16074 * fix * add changelog too * minor word change
This commit is contained in:
@@ -249,6 +249,10 @@
|
||||
these deprecated aliases are likely not used anymore and it may make sense
|
||||
to simply remove these statements.
|
||||
|
||||
- `getProgramResult` and `setProgramResult` in `std/exitprocs` are no longer
|
||||
declared when they are not available on the backend. Previously it would call
|
||||
`doAssert false` at runtime despite the condition being compile-time.
|
||||
|
||||
## Standard library additions and changes
|
||||
|
||||
[//]: # "Changes:"
|
||||
|
||||
@@ -654,6 +654,9 @@ proc processSwitch*(switch, arg: string, pass: TCmdLinePass, info: TLineInfo;
|
||||
if backend == TBackend.default: localError(conf, info, "invalid backend: '$1'" % arg)
|
||||
if backend == backendJs: # bug #21209
|
||||
conf.globalOptions.excl {optThreadAnalysis, optThreads}
|
||||
if optRun in conf.globalOptions:
|
||||
# for now, -r uses nodejs, so define nodejs
|
||||
defineSymbol(conf.symbols, "nodejs")
|
||||
conf.backend = backend
|
||||
of "doccmd": conf.docCmd = arg
|
||||
of "define", "d":
|
||||
@@ -864,6 +867,9 @@ proc processSwitch*(switch, arg: string, pass: TCmdLinePass, info: TLineInfo;
|
||||
setTarget(conf.target, conf.target.targetOS, cpu)
|
||||
of "run", "r":
|
||||
processOnOffSwitchG(conf, {optRun}, arg, pass, info)
|
||||
if conf.backend == backendJs:
|
||||
# for now, -r uses nodejs, so define nodejs
|
||||
defineSymbol(conf.symbols, "nodejs")
|
||||
of "maxloopiterationsvm":
|
||||
expectArg(conf, switch, arg, pass, info)
|
||||
conf.maxLoopIterationsVM = parseInt(arg)
|
||||
|
||||
@@ -519,6 +519,12 @@ proc exceptionTypeName(e: ref Exception): string {.inline.} =
|
||||
if e == nil: "<foreign exception>"
|
||||
else: $e.name
|
||||
|
||||
when not declared(setProgramResult):
|
||||
{.warning: "setProgramResult not available on platform, unittest will not" &
|
||||
" give failing exit code on test failure".}
|
||||
template setProgramResult(a: int) =
|
||||
discard
|
||||
|
||||
template test*(name, body) {.dirty.} =
|
||||
## Define a single test case identified by `name`.
|
||||
##
|
||||
|
||||
@@ -69,23 +69,19 @@ proc addExitProc*(cl: proc() {.noconv.}) =
|
||||
fun()
|
||||
gFuns.add Fun(kind: kNoconv, fun2: cl)
|
||||
|
||||
when not defined(nimscript):
|
||||
when not defined(nimscript) and (not defined(js) or defined(nodejs)):
|
||||
proc getProgramResult*(): int =
|
||||
when defined(js) and defined(nodejs):
|
||||
asm """
|
||||
`result` = process.exitCode;
|
||||
"""
|
||||
elif not defined(js):
|
||||
result = programResult
|
||||
else:
|
||||
doAssert false
|
||||
result = programResult
|
||||
|
||||
proc setProgramResult*(a: int) =
|
||||
when defined(js) and defined(nodejs):
|
||||
asm """
|
||||
process.exitCode = `a`;
|
||||
"""
|
||||
elif not defined(js):
|
||||
programResult = a
|
||||
else:
|
||||
doAssert false
|
||||
programResult = a
|
||||
|
||||
Reference in New Issue
Block a user