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:
metagn
2023-05-24 18:55:09 +03:00
committed by GitHub
parent c7f2541914
commit 4d6be458a0
4 changed files with 19 additions and 7 deletions

View File

@@ -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:"

View File

@@ -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)

View File

@@ -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`.
##

View File

@@ -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