mirror of
https://github.com/nim-lang/Nim.git
synced 2026-04-19 14:00:35 +00:00
add getCurrentCompilerExe to vmops (eg allows to get nim compiler at CT); add tests for vmops (#9925)
This commit is contained in:
committed by
Andreas Rumpf
parent
bb1160b73c
commit
c4e3c4ca2d
@@ -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
|
||||
|
||||
|
||||
@@ -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())
|
||||
|
||||
@@ -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.
|
||||
|
||||
|
||||
@@ -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 =
|
||||
|
||||
@@ -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
47
tests/vm/tvmops.nim
Normal 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"))
|
||||
Reference in New Issue
Block a user