Merge branch 'devel' into coroutines
This commit is contained in:
commit
24ad2cb392
89 changed files with 2829 additions and 1405 deletions
|
|
@ -21,7 +21,7 @@ type
|
|||
# only slots that are
|
||||
# needed are allocated and not 10_000,
|
||||
# except for the global data description.
|
||||
f: Frame
|
||||
f: TFrame
|
||||
slots: array[0..10_000, VarSlot]
|
||||
{.deprecated: [TVarSlot: VarSlot, TExtendedFrame: ExtendedFrame].}
|
||||
|
||||
|
|
@ -66,7 +66,7 @@ var
|
|||
dbgBP: array[0..127, Breakpoint] # breakpoints
|
||||
dbgBPlen: int
|
||||
dbgBPbloom: int64 # we use a bloom filter to speed up breakpoint checking
|
||||
|
||||
|
||||
dbgFilenames*: array[0..300, cstring] ## registered filenames;
|
||||
## 'nil' terminated
|
||||
dbgFilenameLen: int
|
||||
|
|
@ -197,7 +197,7 @@ proc genericHashAux(dest: pointer, n: ptr TNimNode, shallow: bool,
|
|||
result = genericHashAux(cast[pointer](d +% n.offset), n.typ, shallow, h)
|
||||
of nkList:
|
||||
result = h
|
||||
for i in 0..n.len-1:
|
||||
for i in 0..n.len-1:
|
||||
result = result !& genericHashAux(dest, n.sons[i], shallow, result)
|
||||
of nkCase:
|
||||
result = h !& hash(cast[pointer](d +% n.offset), n.typ.size)
|
||||
|
|
@ -205,7 +205,7 @@ proc genericHashAux(dest: pointer, n: ptr TNimNode, shallow: bool,
|
|||
if m != nil: result = genericHashAux(dest, m, shallow, result)
|
||||
of nkNone: sysAssert(false, "genericHashAux")
|
||||
|
||||
proc genericHashAux(dest: pointer, mt: PNimType, shallow: bool,
|
||||
proc genericHashAux(dest: pointer, mt: PNimType, shallow: bool,
|
||||
h: Hash): Hash =
|
||||
sysAssert(mt != nil, "genericHashAux 2")
|
||||
case mt.kind
|
||||
|
|
@ -257,7 +257,7 @@ proc genericHashAux(dest: pointer, mt: PNimType, shallow: bool,
|
|||
|
||||
proc genericHash(dest: pointer, mt: PNimType): int =
|
||||
result = genericHashAux(dest, mt, false, 0)
|
||||
|
||||
|
||||
proc dbgRegisterWatchpoint(address: pointer, name: cstring,
|
||||
typ: PNimType) {.compilerproc.} =
|
||||
let L = watchPointsLen
|
||||
|
|
@ -285,7 +285,7 @@ var
|
|||
## Only code compiled with the ``debugger:on`` switch calls this hook.
|
||||
|
||||
dbgWatchpointHook*: proc (watchpointName: cstring) {.nimcall.}
|
||||
|
||||
|
||||
proc checkWatchpoints =
|
||||
let L = watchPointsLen
|
||||
for i in 0.. <L:
|
||||
|
|
|
|||
152
lib/system/nimscript.nim
Normal file
152
lib/system/nimscript.nim
Normal file
|
|
@ -0,0 +1,152 @@
|
|||
#
|
||||
#
|
||||
# Nim's Runtime Library
|
||||
# (c) Copyright 2015 Andreas Rumpf
|
||||
#
|
||||
# See the file "copying.txt", included in this
|
||||
# distribution, for details about the copyright.
|
||||
#
|
||||
|
||||
|
||||
# Nim's configuration system now uses Nim for scripting. This module provides
|
||||
# a few things that are required for this to work.
|
||||
|
||||
template builtin = discard
|
||||
|
||||
proc listDirs*(dir: string): seq[string] = builtin
|
||||
proc listFiles*(dir: string): seq[string] = builtin
|
||||
|
||||
proc removeDir(dir: string) = builtin
|
||||
proc removeFile(dir: string) = builtin
|
||||
proc moveFile(src, dest: string) = builtin
|
||||
proc createDir(dir: string) = builtin
|
||||
proc getOsError: string = builtin
|
||||
proc setCurrentDir(dir: string) = builtin
|
||||
proc getCurrentDir(): string = builtin
|
||||
proc paramStr*(i: int): string = builtin
|
||||
proc paramCount*(): int = builtin
|
||||
|
||||
proc switch*(key: string, val="") = builtin
|
||||
proc getCommand*(): string = builtin
|
||||
proc setCommand*(cmd: string) = builtin
|
||||
proc cmpIgnoreStyle(a, b: string): int = builtin
|
||||
|
||||
proc strip(s: string): string =
|
||||
var i = 0
|
||||
while s[i] in {' ', '\c', '\L'}: inc i
|
||||
result = s.substr(i)
|
||||
|
||||
template `--`*(key, val: untyped) = switch(astToStr(key), strip astToStr(val))
|
||||
template `--`*(key: untyped) = switch(astToStr(key), "")
|
||||
|
||||
type
|
||||
ScriptMode* {.pure.} = enum
|
||||
Silent,
|
||||
Verbose,
|
||||
Whatif
|
||||
|
||||
var
|
||||
mode*: ScriptMode ## Set this to influence how mkDir, rmDir, rmFile etc.
|
||||
## behave
|
||||
|
||||
template checkOsError =
|
||||
let err = getOsError()
|
||||
if err.len > 0: raise newException(OSError, err)
|
||||
|
||||
template log(msg: string, body: untyped) =
|
||||
if mode == ScriptMode.Verbose or mode == ScriptMode.Whatif:
|
||||
echo "[NimScript] ", msg
|
||||
if mode != ScriptMode.WhatIf:
|
||||
body
|
||||
|
||||
proc rmDir*(dir: string) {.raises: [OSError].} =
|
||||
log "rmDir: " & dir:
|
||||
removeDir dir
|
||||
checkOsError()
|
||||
|
||||
proc rmFile*(dir: string) {.raises: [OSError].} =
|
||||
log "rmFile: " & dir:
|
||||
removeFile dir
|
||||
checkOsError()
|
||||
|
||||
proc mkDir*(dir: string) {.raises: [OSError].} =
|
||||
log "mkDir: " & dir:
|
||||
createDir dir
|
||||
checkOsError()
|
||||
|
||||
proc mvFile*(`from`, to: string) {.raises: [OSError].} =
|
||||
log "mvFile: " & `from` & ", " & to:
|
||||
moveFile `from`, to
|
||||
checkOsError()
|
||||
|
||||
proc exec*(command: string, input = "", cache = "") =
|
||||
## Executes an external process.
|
||||
log "exec: " & command:
|
||||
echo staticExec(command, input, cache)
|
||||
|
||||
proc put*(key, value: string) =
|
||||
## Sets a configuration 'key' like 'gcc.options.always' to its value.
|
||||
builtin
|
||||
|
||||
proc get*(key: string): string =
|
||||
## Retrieves a configuration 'key' like 'gcc.options.always'.
|
||||
builtin
|
||||
|
||||
proc exists*(key: string): bool =
|
||||
## Checks for the existance of a configuration 'key'
|
||||
## like 'gcc.options.always'.
|
||||
builtin
|
||||
|
||||
proc nimcacheDir*(): string =
|
||||
## Retrieves the location of 'nimcache'.
|
||||
builtin
|
||||
|
||||
proc thisDir*(): string =
|
||||
## Retrieves the location of the current ``nims`` script file.
|
||||
builtin
|
||||
|
||||
proc cd*(dir: string) {.raises: [OSError].} =
|
||||
## Changes the current directory.
|
||||
##
|
||||
## The change is permanent for the rest of the execution, since this is just
|
||||
## a shortcut for `os.setCurrentDir()
|
||||
## <http://nim-lang.org/os.html#setCurrentDir,string>`_ . Use the `withDir()
|
||||
## <#withDir>`_ template if you want to perform a temporary change only.
|
||||
setCurrentDir(dir)
|
||||
checkOsError()
|
||||
|
||||
template withDir*(dir: string; body: untyped): untyped =
|
||||
## Changes the current directory temporarily.
|
||||
##
|
||||
## If you need a permanent change, use the `cd() <#cd>`_ proc. Usage example:
|
||||
##
|
||||
## .. code-block:: nimrod
|
||||
## withDir "foo":
|
||||
## # inside foo
|
||||
## #back to last dir
|
||||
var curDir = getCurrentDir()
|
||||
try:
|
||||
cd(dir)
|
||||
body
|
||||
finally:
|
||||
cd(curDir)
|
||||
|
||||
template `==?`(a, b: string): bool = cmpIgnoreStyle(a, b) == 0
|
||||
|
||||
proc writeTask(name, desc: string) =
|
||||
if desc.len > 0:
|
||||
var spaces = " "
|
||||
for i in 0 ..< 20 - name.len: spaces.add ' '
|
||||
echo name, spaces, desc
|
||||
|
||||
template task*(name: untyped; description: string; body: untyped): untyped =
|
||||
## Defines a task. Hidden tasks are supported via an empty description.
|
||||
proc `name Task`() = body
|
||||
|
||||
let cmd = getCommand()
|
||||
if cmd.len == 0 or cmd ==? "help" or cmd == "nop":
|
||||
setCommand "nop"
|
||||
writeTask(astToStr(name), description)
|
||||
elif cmd ==? astToStr(name):
|
||||
setCommand "nop"
|
||||
`name Task`()
|
||||
|
|
@ -18,11 +18,14 @@ type
|
|||
alpha, ## Alpha processor
|
||||
powerpc, ## 32 bit PowerPC
|
||||
powerpc64, ## 64 bit PowerPC
|
||||
powerpc64el, ## Little Endian 64 bit PowerPC
|
||||
sparc, ## Sparc based processor
|
||||
ia64, ## Intel Itanium
|
||||
amd64, ## x86_64 (AMD64); 64 bit x86 compatible CPU
|
||||
mips, ## Mips based processor
|
||||
mipsel, ## Little Endian Mips based processor
|
||||
arm, ## ARM based processor
|
||||
arm64, ## ARM64 based processor
|
||||
vm, ## Some Virtual machine: Nim's VM or JavaScript
|
||||
avr ## AVR based processor
|
||||
|
||||
|
|
@ -63,11 +66,14 @@ const
|
|||
elif defined(alpha): CpuPlatform.alpha
|
||||
elif defined(powerpc): CpuPlatform.powerpc
|
||||
elif defined(powerpc64): CpuPlatform.powerpc64
|
||||
elif defined(powerpc64el): CpuPlatform.powerpc64el
|
||||
elif defined(sparc): CpuPlatform.sparc
|
||||
elif defined(ia64): CpuPlatform.ia64
|
||||
elif defined(amd64): CpuPlatform.amd64
|
||||
elif defined(mips): CpuPlatform.mips
|
||||
elif defined(mipsel): CpuPlatform.mipsel
|
||||
elif defined(arm): CpuPlatform.arm
|
||||
elif defined(arm64): CpuPlatform.arm64
|
||||
elif defined(vm): CpuPlatform.vm
|
||||
elif defined(avr): CpuPlatform.avr
|
||||
else: CpuPlatform.none
|
||||
|
|
|
|||
|
|
@ -256,7 +256,10 @@ when not defined(useNimRtl):
|
|||
of tyBool: add result, reprBool(cast[ptr bool](p)[])
|
||||
of tyChar: add result, reprChar(cast[ptr char](p)[])
|
||||
of tyString: reprStrAux(result, cast[ptr string](p)[])
|
||||
of tyCString: reprStrAux(result, $(cast[ptr cstring](p)[]))
|
||||
of tyCString:
|
||||
let cs = cast[ptr cstring](p)[]
|
||||
if cs.isNil: add result, "nil"
|
||||
else: reprStrAux(result, $cs)
|
||||
of tyRange: reprAux(result, p, typ.base, cl)
|
||||
of tyProc, tyPointer:
|
||||
if cast[PPointer](p)[] == nil: add result, "nil"
|
||||
|
|
|
|||
|
|
@ -19,9 +19,9 @@ proc countBits32(n: int32): int {.compilerproc.} =
|
|||
v = (v and 0x33333333'i32) +% ((v shr 2'i32) and 0x33333333'i32)
|
||||
result = ((v +% (v shr 4'i32) and 0xF0F0F0F'i32) *% 0x1010101'i32) shr 24'i32
|
||||
|
||||
proc countBits64(n: int64): int {.compilerproc.} =
|
||||
result = countBits32(toU32(n and 0xffff'i64)) +
|
||||
countBits32(toU32(n shr 16'i64))
|
||||
proc countBits64(n: int64): int {.compilerproc.} =
|
||||
result = countBits32(toU32(n and 0xffffffff'i64)) +
|
||||
countBits32(toU32(n shr 32'i64))
|
||||
|
||||
proc cardSet(s: NimSet, len: int): int {.compilerproc.} =
|
||||
result = 0
|
||||
|
|
|
|||
|
|
@ -182,7 +182,10 @@ proc readAllFile(file: File): string =
|
|||
proc readAll(file: File): TaintedString =
|
||||
# Separate handling needed because we need to buffer when we
|
||||
# don't know the overall length of the File.
|
||||
let len = if file != stdin: rawFileSize(file) else: -1
|
||||
when declared(stdin):
|
||||
let len = if file != stdin: rawFileSize(file) else: -1
|
||||
else:
|
||||
let len = rawFileSize(file)
|
||||
if len > 0:
|
||||
result = readAllFile(file, len).TaintedString
|
||||
else:
|
||||
|
|
@ -216,9 +219,9 @@ proc writeLine[Ty](f: File, x: varargs[Ty, `$`]) =
|
|||
for i in items(x): write(f, i)
|
||||
write(f, "\n")
|
||||
|
||||
|
||||
proc rawEcho(x: string) {.inline, compilerproc.} = write(stdout, x)
|
||||
proc rawEchoNL() {.inline, compilerproc.} = write(stdout, "\n")
|
||||
when declared(stdout):
|
||||
proc rawEcho(x: string) {.inline, compilerproc.} = write(stdout, x)
|
||||
proc rawEchoNL() {.inline, compilerproc.} = write(stdout, "\n")
|
||||
|
||||
# interface to the C procs:
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue