From 24e66e04fad8fe451e0809adba5b32c63d427038 Mon Sep 17 00:00:00 2001 From: Araq Date: Sun, 21 Dec 2014 14:28:46 +0100 Subject: [PATCH] cleaned up os.nim; docgen improvements --- compiler/pragmas.nim | 4 ++-- compiler/renderer.nim | 16 +++++++++----- compiler/sempass2.nim | 26 ++++++++++++----------- compiler/typesrenderer.nim | 11 +++++++++- lib/pure/concurrency/threadpool.nim.cfg | 1 + lib/pure/os.nim | 28 ++++++++++++++----------- todo.txt | 1 - 7 files changed, 54 insertions(+), 33 deletions(-) create mode 100644 lib/pure/concurrency/threadpool.nim.cfg diff --git a/compiler/pragmas.nim b/compiler/pragmas.nim index 879950e795..8e639f0839 100644 --- a/compiler/pragmas.nim +++ b/compiler/pragmas.nim @@ -357,11 +357,11 @@ proc processPush(c: PContext, n: PNode, start: int) = append(c.optionStack, x) for i in countup(start, sonsLen(n) - 1): if processOption(c, n.sons[i]): - # simply store it somehwere: + # simply store it somewhere: if x.otherPragmas.isNil: x.otherPragmas = newNodeI(nkPragma, n.info) x.otherPragmas.add n.sons[i] - #LocalError(n.info, errOptionExpected) + #localError(n.info, errOptionExpected) proc processPop(c: PContext, n: PNode) = if c.optionStack.counter <= 1: diff --git a/compiler/renderer.nim b/compiler/renderer.nim index f25f3e7eef..2bbe8ac80b 100644 --- a/compiler/renderer.nim +++ b/compiler/renderer.nim @@ -34,6 +34,7 @@ type comStack*: seq[PNode] # comment stack flags*: TRenderFlags checkAnon: bool # we're in a context that can contain sfAnon + inPragma: int proc renderModule*(n: PNode, filename: string, renderFlags: TRenderFlags = {}) @@ -1184,12 +1185,17 @@ proc gsub(g: var TSrcGen, n: PNode, c: TContext) = of nkContinueStmt: putWithSpace(g, tkContinue, "continue") gsub(g, n.sons[0]) - of nkPragma: + of nkPragma: if renderNoPragmas notin g.flags: - put(g, tkSpaces, Space) - put(g, tkCurlyDotLe, "{.") - gcomma(g, n, emptyContext) - put(g, tkCurlyDotRi, ".}") + if g.inPragma <= 0: + inc g.inPragma + put(g, tkSpaces, Space) + put(g, tkCurlyDotLe, "{.") + gcomma(g, n, emptyContext) + put(g, tkCurlyDotRi, ".}") + dec g.inPragma + else: + gcomma(g, n, emptyContext) of nkImportStmt, nkExportStmt: if n.kind == nkImportStmt: putWithSpace(g, tkImport, "import") diff --git a/compiler/sempass2.nim b/compiler/sempass2.nim index f41e169e32..4300aee20e 100644 --- a/compiler/sempass2.nim +++ b/compiler/sempass2.nim @@ -370,7 +370,7 @@ proc trackPragmaStmt(tracked: PEffects, n: PNode) = # list the computed effects up to here: listEffects(tracked) -proc effectSpec(n: PNode, effectType = wRaises): PNode = +proc effectSpec(n: PNode, effectType: TSpecialWord): PNode = for i in countup(0, sonsLen(n) - 1): var it = n.sons[i] if it.kind == nkExprColonExpr and whichPragma(it) == effectType: @@ -380,8 +380,7 @@ proc effectSpec(n: PNode, effectType = wRaises): PNode = result.add(it.sons[1]) return -proc documentEffect(n, x: PNode, effectType: TSpecialWord, idx: int) = - var x = x +proc documentEffect(n, x: PNode, effectType: TSpecialWord, idx: int): PNode = let spec = effectSpec(x, effectType) if isNil(spec): let s = n.sons[namePos].sym @@ -399,18 +398,20 @@ proc documentEffect(n, x: PNode, effectType: TSpecialWord, idx: int) = # set the type so that the following analysis doesn't screw up: effects.sons[i].typ = real[i].typ - var pair = newNode(nkExprColonExpr, n.info, @[ + result = newNode(nkExprColonExpr, n.info, @[ newIdentNode(getIdent(specialWords[effectType]), n.info), effects]) - - if x.kind == nkEmpty: - x = newNodeI(nkPragma, n.info) - n.sons[pragmasPos] = x - x.add(pair) proc documentRaises*(n: PNode) = if n.sons[namePos].kind != nkSym: return - documentEffect(n, n.sons[pragmasPos], wRaises, exceptionEffects) - documentEffect(n, n.sons[pragmasPos], wTags, tagEffects) + let pragmas = n.sons[pragmasPos] + let p1 = documentEffect(n, pragmas, wRaises, exceptionEffects) + let p2 = documentEffect(n, pragmas, wTags, tagEffects) + + if p1 != nil or p2 != nil: + if pragmas.kind == nkEmpty: + n.sons[pragmasPos] = newNodeI(nkPragma, n.info) + if p1 != nil: n.sons[pragmasPos].add p1 + if p2 != nil: n.sons[pragmasPos].add p2 template notGcSafe(t): expr = {tfGcSafe, tfNoSideEffect} * t.flags == {} @@ -621,7 +622,8 @@ proc track(tracked: PEffects, n: PNode) = useVar(tracked, n) of nkRaiseStmt: n.sons[0].info = n.info - throws(tracked.exc, n.sons[0]) + #throws(tracked.exc, n.sons[0]) + addEffect(tracked, n.sons[0], useLineInfo=false) for i in 0 .. 0: m else: "unknown OS error") @@ -234,7 +234,7 @@ proc `$`*(err: OSErrorCode): string {.borrow.} proc osErrorMsg*(errorCode: OSErrorCode): string = ## Converts an OS error code into a human readable string. ## - ## The error code can be retrieved using the ``OSLastError`` proc. + ## The error code can be retrieved using the ``osLastError`` proc. ## ## If conversion fails, or ``errorCode`` is ``0`` then ``""`` will be ## returned. @@ -265,7 +265,7 @@ proc raiseOSError*(errorCode: OSErrorCode) = ## Raises an ``OSError`` exception. The ``errorCode`` will determine the ## message, ``osErrorMsg`` will be used to get this message. ## - ## The error code can be retrieved using the ``OSLastError`` proc. + ## The error code can be retrieved using the ``osLastError`` proc. ## ## If the error code is ``0`` or an error message could not be retrieved, ## the message ``unknown OS error`` will be used. @@ -884,7 +884,7 @@ proc sameFileContent*(path1, path2: string): bool {.rtl, extern: "nos$1", close(b) type - TFilePermission* = enum ## file access permission; modelled after UNIX + FilePermission* = enum ## file access permission; modelled after UNIX fpUserExec, ## execute access for the file owner fpUserWrite, ## write access for the file owner fpUserRead, ## read access for the file owner @@ -895,7 +895,9 @@ type fpOthersWrite, ## write access for others fpOthersRead ## read access for others -proc getFilePermissions*(filename: string): set[TFilePermission] {. +{.deprecated: [TFilePermission: FilePermission].} + +proc getFilePermissions*(filename: string): set[FilePermission] {. rtl, extern: "nos$1", tags: [ReadDirEffect].} = ## retrieves file permissions for `filename`. `OSError` is raised in case of ## an error. On Windows, only the ``readonly`` flag is checked, every other @@ -927,7 +929,7 @@ proc getFilePermissions*(filename: string): set[TFilePermission] {. else: result = {fpUserExec..fpOthersRead} -proc setFilePermissions*(filename: string, permissions: set[TFilePermission]) {. +proc setFilePermissions*(filename: string, permissions: set[FilePermission]) {. rtl, extern: "nos$1", tags: [WriteDirEffect].} = ## sets the file permissions for `filename`. `OSError` is raised in case of ## an error. On Windows, only the ``readonly`` flag is changed, depending on @@ -1231,13 +1233,15 @@ iterator walkFiles*(pattern: string): string {.tags: [ReadDirEffect].} = globfree(addr(f)) type - TPathComponent* = enum ## Enumeration specifying a path component. + PathComponent* = enum ## Enumeration specifying a path component. pcFile, ## path refers to a file pcLinkToFile, ## path refers to a symbolic link to a file pcDir, ## path refers to a directory pcLinkToDir ## path refers to a symbolic link to a directory -iterator walkDir*(dir: string): tuple[kind: TPathComponent, path: string] {. +{.deprecated: [TPathComponent: PathComponent].} + +iterator walkDir*(dir: string): tuple[kind: PathComponent, path: string] {. tags: [ReadDirEffect].} = ## walks over the directory `dir` and yields for each directory or file in ## `dir`. The component type and full path for each item is returned. @@ -1580,7 +1584,7 @@ proc copyDirWithPermissions*(source, dest: string, else: discard proc inclFilePermissions*(filename: string, - permissions: set[TFilePermission]) {. + permissions: set[FilePermission]) {. rtl, extern: "nos$1", tags: [ReadDirEffect, WriteDirEffect].} = ## a convenience procedure for: ## @@ -1589,7 +1593,7 @@ proc inclFilePermissions*(filename: string, setFilePermissions(filename, getFilePermissions(filename)+permissions) proc exclFilePermissions*(filename: string, - permissions: set[TFilePermission]) {. + permissions: set[FilePermission]) {. rtl, extern: "nos$1", tags: [ReadDirEffect, WriteDirEffect].} = ## a convenience procedure for: ## @@ -1885,9 +1889,9 @@ type FileInfo* = object ## Contains information associated with a file object. id*: tuple[device: DeviceId, file: FileId] # Device and file id. - kind*: TPathComponent # Kind of file object - directory, symlink, etc. + kind*: PathComponent # Kind of file object - directory, symlink, etc. size*: BiggestInt # Size of file. - permissions*: set[TFilePermission] # File permissions + permissions*: set[FilePermission] # File permissions linkCount*: BiggestInt # Number of hard links the file object has. lastAccessTime*: Time # Time file was last accessed. lastWriteTime*: Time # Time file was last modified/written to. diff --git a/todo.txt b/todo.txt index 5e2f91b01c..330d68d9b5 100644 --- a/todo.txt +++ b/todo.txt @@ -46,7 +46,6 @@ Bugs - VM: ptr/ref T cannot work in general - scopes are still broken for generic instantiation! - compilation of niminst takes way too long. looks like a regression -- docgen: sometimes effects are listed twice - blocks can "export" an identifier but the CCG generates {} for them ...