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
parent bb1160b73c
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 `parseopt.remainingArgs`.
- Added `os.getCurrentCompilerExe` (implmented as `getAppFilename` at CT),
can be used to retrive the currently executing compiler.
### 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,
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.} =
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)))
systemop gorgeEx
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
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):
proc getSymlinkFileKind(path: string): PathComponent =
# Helper function.
@@ -2118,7 +2124,8 @@ when defined(haiku):
result = ""
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.

View File

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

View File

@@ -10,6 +10,8 @@ import os
template getScriptDir(): string =
parentDir(instantiationInfo(-1, true).filename)
# See also simpler test in Nim/tests/vm/tvmops.nim for a simpler
# cross platform way.
block gorge:
const
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"))