add getCurrentCompilerExe to vmops (eg allows to get nim compiler at CT); add tests for vmops (#9925)

This commit is contained in:
Timothee Cour 2018-12-18 00:07:12 -08:00 • committed by Andreas Rumpf
commit c4e3c4ca2d
6 changed files with 65 additions and 2 deletions

View file

@ -95,6 +95,9 @@ proc enumToString*(enums: openArray[enum]): string =
- Added `os.relativePath`. - Added `os.relativePath`.
- Added `parseopt.remainingArgs`. - Added `parseopt.remainingArgs`.
- Added `os.getCurrentCompilerExe` (implmented as `getAppFilename` at CT),
can be used to retrive the currently executing compiler.
### Library changes ### Library changes

View file

@ -13,7 +13,7 @@ from math import sqrt, ln, log10, log2, exp, round, arccos, arcsin,
arctan, arctan2, cos, cosh, hypot, sinh, sin, tan, tanh, pow, trunc, arctan, arctan2, cos, cosh, hypot, sinh, sin, tan, tanh, pow, trunc,
floor, ceil, `mod` floor, ceil, `mod`
from os import getEnv, existsEnv, dirExists, fileExists, putEnv, walkDir from os import getEnv, existsEnv, dirExists, fileExists, putEnv, walkDir, getAppFilename
template mathop(op) {.dirty.} = template mathop(op) {.dirty.} =
registerCallback(c, "stdlib.math." & astToStr(op), `op Wrapper`) registerCallback(c, "stdlib.math." & astToStr(op), `op Wrapper`)
@ -120,3 +120,6 @@ proc registerAdditionalOps*(c: PCtx) =
setResult(a, staticWalkDirImpl(getString(a, 0), getBool(a, 1))) setResult(a, staticWalkDirImpl(getString(a, 0), getBool(a, 1)))
systemop gorgeEx systemop gorgeEx
macrosop getProjectPath macrosop getProjectPath
registerCallback c, "stdlib.os.getCurrentCompilerExe", proc (a: VmArgs) {.nimcall.} =
setResult(a, getAppFilename())

View file

@ -1419,6 +1419,12 @@ type
pcDir, ## path refers to a directory pcDir, ## path refers to a directory
pcLinkToDir ## path refers to a symbolic link to a directory pcLinkToDir ## path refers to a symbolic link to a directory
proc getCurrentCompilerExe*(): string {.compileTime.} = discard
## `getAppFilename` at CT; can be used to retrive the currently executing
## Nim compiler from a Nim or nimscript program, or the nimble binary
## inside a nimble program (likewise with other binaries built from
## compiler API).
when defined(posix) and not defined(nimscript): when defined(posix) and not defined(nimscript):
proc getSymlinkFileKind(path: string): PathComponent = proc getSymlinkFileKind(path: string): PathComponent =
# Helper function. # Helper function.
@ -2118,7 +2124,8 @@ when defined(haiku):
result = "" result = ""
proc getAppFilename*(): string {.rtl, extern: "nos$1", tags: [ReadIOEffect], noNimScript.} = proc getAppFilename*(): string {.rtl, extern: "nos$1", tags: [ReadIOEffect], noNimScript.} =
## Returns the filename of the application's executable. ## Returns the filename of the application's executable. See also
## `getCurrentCompilerExe`.
## ##
## This procedure will resolve symlinks. ## This procedure will resolve symlinks.

View file

@ -143,6 +143,7 @@ proc existsDir*(dir: string): bool =
proc selfExe*(): string = proc selfExe*(): string =
## Returns the currently running nim or nimble executable. ## Returns the currently running nim or nimble executable.
# TODO: consider making this as deprecated alias of `getCurrentCompilerExe`
builtin builtin
proc toExe*(filename: string): string = proc toExe*(filename: string): string =

View file

@ -10,6 +10,8 @@ import os
template getScriptDir(): string = template getScriptDir(): string =
parentDir(instantiationInfo(-1, true).filename) parentDir(instantiationInfo(-1, true).filename)
# See also simpler test in Nim/tests/vm/tvmops.nim for a simpler
# cross platform way.
block gorge: block gorge:
const const
execName = when defined(windows): "tgorge.bat" else: "./tgorge.sh" execName = when defined(windows): "tgorge.bat" else: "./tgorge.sh"

47
tests/vm/tvmops.nim Normal file
View file

@ -0,0 +1,47 @@
#[
test for vmops.nim
]#
import os
import math
import strutils
template forceConst(a: untyped): untyped =
## Force evaluation at CT, useful for example here:
## `callFoo(forceConst(getBar1()), getBar2())`
## instead of:
## block:
## const a = getBar1()
## `callFoo(a, getBar2())`
const ret = a
ret
static:
# TODO: add more tests
block: #getAppFilename, gorgeEx, gorge
const nim = getCurrentCompilerExe()
let ret = gorgeEx(nim & " --version")
doAssert ret.exitCode == 0
doAssert ret.output.contains "Nim Compiler"
let ret2 = gorgeEx(nim & " --unexistant")
doAssert ret2.exitCode != 0
let output3 = gorge(nim & " --version")
doAssert output3.contains "Nim Compiler"
block:
const key = "D20181210T175037"
const val = "foo"
putEnv(key, val)
doAssert existsEnv(key)
doAssert getEnv(key) == val
block:
# sanity check (we probably don't need to test for all ops)
const a1 = arcsin 0.3
let a2 = arcsin 0.3
doAssert a1 == a2
block:
# Check against bugs like #9176
doAssert getCurrentCompilerExe() == forceConst(getCurrentCompilerExe())
if false: #pending #9176
doAssert gorgeEx("unexistant") == forceConst(gorgeEx("unexistant"))