diff options
-rw-r--r-- | compiler/vmops.nim | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/compiler/vmops.nim b/compiler/vmops.nim index 63d364405..76e0ccb08 100644 --- a/compiler/vmops.nim +++ b/compiler/vmops.nim @@ -26,7 +26,7 @@ when declared(math.signbit): from std/envvars import getEnv, existsEnv, delEnv, putEnv, envPairs from std/os import getAppFilename from std/private/oscommon import dirExists, fileExists -from std/private/osdirs import walkDir +from std/private/osdirs import walkDir, createDir from std/times import cpuTime from std/hashes import hash @@ -49,6 +49,10 @@ template osop(op) {.dirty.} = template oscommonop(op) {.dirty.} = registerCallback(c, "stdlib.oscommon." & astToStr(op), `op Wrapper`) + +template osdirsop(op) {.dirty.} = + registerCallback(c, "stdlib.osdirs." & astToStr(op), `op Wrapper`) + template envvarsop(op) {.dirty.} = registerCallback(c, "stdlib.envvars." & astToStr(op), `op Wrapper`) @@ -105,7 +109,17 @@ template wrap2svoid(op, modop) {.dirty.} = op(getString(a, 0), getString(a, 1)) modop op -template wrapDangerous(op, modop) {.dirty.} = +template wrapDangerous1svoid(op, modop) {.dirty.} = + if vmopsDanger notin c.config.features and (defined(nimsuggest) or c.config.cmd == cmdCheck): + proc `op Wrapper`(a: VmArgs) {.nimcall.} = + discard + modop op + else: + proc `op Wrapper`(a: VmArgs) {.nimcall.} = + op(getString(a, 0)) + modop op + +template wrapDangerous2svoid(op, modop) {.dirty.} = if vmopsDanger notin c.config.features and (defined(nimsuggest) or c.config.cmd == cmdCheck): proc `op Wrapper`(a: VmArgs) {.nimcall.} = discard @@ -233,7 +247,8 @@ proc registerAdditionalOps*(c: PCtx) = wrap1svoid(delEnv, envvarsop) wrap1s(dirExists, oscommonop) wrap1s(fileExists, oscommonop) - wrapDangerous(writeFile, ioop) + wrapDangerous2svoid(writeFile, ioop) + wrapDangerous1svoid(createDir, osdirsop) wrap1s(readFile, ioop) wrap2si(readLines, ioop) systemop getCurrentExceptionMsg |