move io out of system (#19442)

* move io out of system

* fix tests

* fix tests

* next step

* rename to syncio

* rename

* fix nimscript

* comma

* fix

* fix parts of errors

* good for now

* fix test
This commit is contained in:
flywind
2022-02-03 00:10:11 +08:00
committed by GitHub
parent 486cb09ec2
commit 891329cd4b
24 changed files with 92 additions and 42 deletions

View File

@@ -20,6 +20,8 @@
- `addr` is now available for all addressable locations, `unsafeAddr` is deprecated and
becomes an alias for `addr`.
- io is about to move out of system; use `-d:nimPreviewSlimSystem` and import `std/syncio`.
## Standard library additions and changes
- `macros.parseExpr` and `macros.parseStmt` now accept an optional

View File

@@ -12,6 +12,9 @@
import os, pathnorm
when defined(nimSlimSystem):
import std/syncio
type
AbsoluteFile* = distinct string
AbsoluteDir* = distinct string

View File

@@ -47,7 +47,7 @@ template systemop(op) {.dirty.} =
registerCallback(c, "stdlib.system." & astToStr(op), `op Wrapper`)
template ioop(op) {.dirty.} =
registerCallback(c, "stdlib.io." & astToStr(op), `op Wrapper`)
registerCallback(c, "stdlib.syncio." & astToStr(op), `op Wrapper`)
template macrosop(op) {.dirty.} =
registerCallback(c, "stdlib.macros." & astToStr(op), `op Wrapper`)

View File

@@ -84,8 +84,8 @@ done with spaces only, tabulators are not allowed.
String literals are enclosed in double-quotes. The `var` statement declares
a new variable named `name` of type `string` with the value that is
returned by the `readLine <io.html#readLine,File>`_ procedure. Since the
compiler knows that `readLine <io.html#readLine,File>`_ returns a string,
returned by the `readLine <syncio.html#readLine,File>`_ procedure. Since the
compiler knows that `readLine <syncio.html#readLine,File>`_ returns a string,
you can leave out the type in the declaration (this is called `local type
inference`:idx:). So this will work too:
@@ -97,7 +97,7 @@ Note that this is basically the only form of type inference that exists in
Nim: it is a good compromise between brevity and readability.
The "hello world" program contains several identifiers that are already known
to the compiler: `echo`, `readLine <io.html#readLine,File>`_, etc.
to the compiler: `echo`, `readLine <syncio.html#readLine,File>`_, etc.
These built-ins are declared in the system_ module which is implicitly
imported by any other module.
@@ -594,7 +594,7 @@ Procedures
==========
To define new commands like `echo <system.html#echo,varargs[typed,]>`_
and `readLine <io.html#readLine,File>`_ in the examples, the concept of a
and `readLine <syncio.html#readLine,File>`_ in the examples, the concept of a
*procedure* is needed. You might be used to them being called *methods* or
*functions* in other languages, but Nim
`differentiates these concepts <tut1.html#procedures-funcs-and-methods>`_. In

View File

@@ -37,6 +37,9 @@
when defined(nimHasStyleChecks):
{.push styleChecks: off.}
when defined(nimSlimSystem):
import std/syncio
# TODO these constants don't seem to be fetched from a header file for unknown
# platforms - where do they come from and why are they here?
when false:

View File

@@ -51,6 +51,9 @@
import strutils, streams, parsexml, xmltree, unicode, strtabs
when defined(nimPreviewSlimSystem):
import std/syncio
type
HtmlTag* = enum ## list of all supported HTML tags; order will always be
## alphabetically

View File

@@ -164,6 +164,9 @@ import hashes, tables, strutils, lexbase, streams, macros, parsejson
import options # xxx remove this dependency using same approach as https://github.com/nim-lang/Nim/pull/14563
import std/private/since
when defined(nimPreviewSlimSystem):
import std/syncio
export
tables.`$`

View File

@@ -48,7 +48,7 @@
## .. warning::
## For loggers that log to a console or to files, only error and fatal
## messages will cause their output buffers to be flushed immediately.
## Use the `flushFile proc <io.html#flushFile,File>`_ to flush the buffer
## Use the `flushFile proc <syncio.html#flushFile,File>`_ to flush the buffer
## manually if needed.
##
## Handlers
@@ -146,6 +146,9 @@ import strutils, times
when not defined(js):
import os
when defined(nimPreviewSlimSystem):
import std/syncio
type
Level* = enum ## \
## Enumeration of logging levels.
@@ -346,7 +349,7 @@ method log*(logger: ConsoleLogger, level: Level, args: varargs[string, `$`]) =
##
## **Note:** Only error and fatal messages will cause the output buffer
## to be flushed immediately. Use the `flushFile proc
## <io.html#flushFile,File>`_ to flush the buffer manually if needed.
## <syncio.html#flushFile,File>`_ to flush the buffer manually if needed.
##
## See also:
## * `log method<#log.e,FileLogger,Level,varargs[string,]>`_
@@ -422,7 +425,7 @@ when not defined(js):
## **Notes:**
## * Only error and fatal messages will cause the output buffer
## to be flushed immediately. Use the `flushFile proc
## <io.html#flushFile,File>`_ to flush the buffer manually if needed.
## <syncio.html#flushFile,File>`_ to flush the buffer manually if needed.
## * This method is not available for the JavaScript backend.
##
## See also:
@@ -600,7 +603,7 @@ when not defined(js):
## **Notes:**
## * Only error and fatal messages will cause the output buffer
## to be flushed immediately. Use the `flushFile proc
## <io.html#flushFile,File>`_ to flush the buffer manually if needed.
## <syncio.html#flushFile,File>`_ to flush the buffer manually if needed.
## * This method is not available for the JavaScript backend.
##
## See also:

View File

@@ -431,7 +431,7 @@ iterator memSlices*(mfile: MemFile, delim = '\l', eat = '\r'): MemSlice {.inline
iterator lines*(mfile: MemFile, buf: var string, delim = '\l',
eat = '\r'): string {.inline.} =
## Replace contents of passed buffer with each new line, like
## `readLine(File) <io.html#readLine,File,string>`_.
## `readLine(File) <syncio.html#readLine,File,string>`_.
## `delim`, `eat`, and delimiting logic is exactly as for `memSlices
## <#memSlices.i,MemFile,char,char>`_, but Nim strings are returned.
##
@@ -450,7 +450,7 @@ iterator lines*(mfile: MemFile, buf: var string, delim = '\l',
iterator lines*(mfile: MemFile, delim = '\l', eat = '\r'): string {.inline.} =
## Return each line in a file as a Nim string, like
## `lines(File) <io.html#lines.i,File>`_.
## `lines(File) <syncio.html#lines.i,File>`_.
## `delim`, `eat`, and delimiting logic is exactly as for `memSlices
## <#memSlices.i,MemFile,char,char>`_, but Nim strings are returned.
##

View File

@@ -34,6 +34,9 @@ import std/private/since
import strutils, pathnorm
when defined(nimPreviewSlimSystem):
import std/syncio
const weirdTarget = defined(nimscript) or defined(js)
since (1, 1):

View File

@@ -175,8 +175,12 @@ import strutils, lexbase, streams, tables
import std/private/decode_helpers
import std/private/since
when defined(nimPreviewSlimSystem):
import std/syncio
include "system/inclrtl"
type
CfgEventKind* = enum ## enumeration of all events that may occur when parsing
cfgEof, ## end of file reached

View File

@@ -67,6 +67,9 @@
import lexbase, streams
when defined(nimPreviewSlimSystem):
import std/syncio
type
CsvRow* = seq[string] ## A row in a CSV file.
CsvParser* = object of BaseLexer ## The parser object.

View File

@@ -16,6 +16,8 @@
##
include "system/inclrtl"
when defined(nimPreviewSlimSystem):
import std/syncio
const
useUnicode = true ## change this to deactivate proper UTF-8 support

View File

@@ -19,6 +19,9 @@
include system/inclrtl
import streams
when defined(nimPreviewSlimSystem):
import std/syncio
{.push debugger: off.} # the user does not want to trace a part
# of the standard library!

View File

@@ -92,10 +92,13 @@
## See also
## ========
## * `asyncstreams module <asyncstreams.html>`_
## * `io module <io.html>`_ for `FileMode enum <io.html#FileMode>`_
## * `io module <syncio.html>`_ for `FileMode enum <syncio.html#FileMode>`_
import std/private/since
when defined(nimPreviewSlimSystem):
import std/syncio
proc newEIO(msg: string): owned(ref IOError) =
new(result)
result.msg = msg
@@ -1331,7 +1334,7 @@ proc newFileStream*(f: File): owned FileStream =
## * `newStringStream proc <#newStringStream,string>`_ creates a new stream
## from string.
## * `newFileStream proc <#newFileStream,string,FileMode,int>`_ is the same
## as using `open proc <io.html#open,File,string,FileMode,int>`_
## as using `open proc <syncio.html#open,File,string,FileMode,int>`_
## on Examples.
## * `openFileStream proc <#openFileStream,string,FileMode,int>`_ creates a
## file stream from the file name and the mode.
@@ -1370,7 +1373,7 @@ proc newFileStream*(filename: string, mode: FileMode = fmRead,
## Creates a new stream from the file named `filename` with the mode `mode`.
##
## If the file cannot be opened, `nil` is returned. See the `io module
## <io.html>`_ for a list of available `FileMode enums <io.html#FileMode>`_.
## <syncio.html>`_ for a list of available `FileMode enums <syncio.html#FileMode>`_.
##
## **Note:**
## * **This function returns nil in case of failure.**

View File

@@ -66,6 +66,9 @@ import colors
when defined(windows):
import winlean
when defined(nimPreviewSlimSystem):
import std/syncio
type
PTerminal = ref object
trueColorIsSupported: bool

View File

@@ -11,6 +11,9 @@
import streams, parsexml, strtabs, xmltree
when defined(nimPreviewSlimSystem):
import std/syncio
type
XmlError* = object of ValueError ## Exception that is raised
## for invalid XML.

View File

@@ -1,18 +1,17 @@
#
#
# Nim's Runtime Library
# (c) Copyright 2019 Nim contributors
# (c) Copyright 2022 Nim contributors
#
# See the file "copying.txt", included in this
# distribution, for details about the copyright.
#
## This is a part of `system.nim`, you should not manually import it.
## This module implements various synchronized I/O operations.
include inclrtl
include system/inclrtl
import std/private/since
import formatfloat
import system/formatfloat
# ----------------- IO Part ------------------------------------------------
type
@@ -179,7 +178,7 @@ proc checkErr(f: File) =
{.push stackTrace: off, profiler: off.}
proc readBuffer*(f: File, buffer: pointer, len: Natural): int {.
tags: [ReadIOEffect], benign.} =
## reads `len` bytes into the buffer pointed to by `buffer`. Returns
## Reads `len` bytes into the buffer pointed to by `buffer`. Returns
## the actual number of bytes that have been read which may be less than
## `len` (if not as many bytes are remaining), but not greater.
result = cast[int](c_fread(buffer, 1, cast[csize_t](len), f))
@@ -188,13 +187,13 @@ proc readBuffer*(f: File, buffer: pointer, len: Natural): int {.
proc readBytes*(f: File, a: var openArray[int8|uint8], start,
len: Natural): int {.
tags: [ReadIOEffect], benign.} =
## reads `len` bytes into the buffer `a` starting at `a[start]`. Returns
## Reads `len` bytes into the buffer `a` starting at `a[start]`. Returns
## the actual number of bytes that have been read which may be less than
## `len` (if not as many bytes are remaining), but not greater.
result = readBuffer(f, addr(a[start]), len)
proc readChars*(f: File, a: var openArray[char]): int {.tags: [ReadIOEffect], benign.} =
## reads up to `a.len` bytes into the buffer `a`. Returns
## Reads up to `a.len` bytes into the buffer `a`. Returns
## the actual number of bytes that have been read which may be less than
## `a.len` (if not as many bytes are remaining), but not greater.
result = readBuffer(f, addr(a[0]), a.len)
@@ -202,7 +201,7 @@ proc readChars*(f: File, a: var openArray[char]): int {.tags: [ReadIOEffect], be
proc readChars*(f: File, a: var openArray[char], start, len: Natural): int {.
tags: [ReadIOEffect], benign, deprecated:
"use other `readChars` overload, possibly via: readChars(toOpenArray(buf, start, len-1))".} =
## reads `len` bytes into the buffer `a` starting at `a[start]`. Returns
## Reads `len` bytes into the buffer `a` starting at `a[start]`. Returns
## the actual number of bytes that have been read which may be less than
## `len` (if not as many bytes are remaining), but not greater.
if (start + len) > len(a):
@@ -216,7 +215,7 @@ proc write*(f: File, c: cstring) {.tags: [WriteIOEffect], benign.} =
proc writeBuffer*(f: File, buffer: pointer, len: Natural): int {.
tags: [WriteIOEffect], benign.} =
## writes the bytes of buffer pointed to by the parameter `buffer` to the
## Writes the bytes of buffer pointed to by the parameter `buffer` to the
## file `f`. Returns the number of actual written bytes, which may be less
## than `len` in case of an error.
result = cast[int](c_fwrite(buffer, 1, cast[csize_t](len), f))
@@ -224,7 +223,7 @@ proc writeBuffer*(f: File, buffer: pointer, len: Natural): int {.
proc writeBytes*(f: File, a: openArray[int8|uint8], start, len: Natural): int {.
tags: [WriteIOEffect], benign.} =
## writes the bytes of `a[start..start+len-1]` to the file `f`. Returns
## Writes the bytes of `a[start..start+len-1]` to the file `f`. Returns
## the number of actual written bytes, which may be less than `len` in case
## of an error.
var x = cast[ptr UncheckedArray[int8]](a)
@@ -232,7 +231,7 @@ proc writeBytes*(f: File, a: openArray[int8|uint8], start, len: Natural): int {.
proc writeChars*(f: File, a: openArray[char], start, len: Natural): int {.
tags: [WriteIOEffect], benign.} =
## writes the bytes of `a[start..start+len-1]` to the file `f`. Returns
## Writes the bytes of `a[start..start+len-1]` to the file `f`. Returns
## the number of actual written bytes, which may be less than `len` in case
## of an error.
var x = cast[ptr UncheckedArray[int8]](a)
@@ -341,7 +340,7 @@ proc flushFile*(f: File) {.tags: [WriteIOEffect].} =
discard c_fflush(f)
proc getFileHandle*(f: File): FileHandle =
## returns the file handle of the file `f`. This is only useful for
## Returns the file handle of the file `f`. This is only useful for
## platform specific programming.
## Note that on Windows this doesn't return the Windows-specific handle,
## but the C library's notion of a handle, whatever that means.
@@ -349,7 +348,7 @@ proc getFileHandle*(f: File): FileHandle =
c_fileno(f)
proc getOsFileHandle*(f: File): FileHandle =
## returns the OS file handle of the file `f`. This is only useful for
## Returns the OS file handle of the file `f`. This is only useful for
## platform specific programming.
when defined(windows):
result = FileHandle getOsfhandle(cint getFileHandle(f))
@@ -380,7 +379,7 @@ when defined(nimdoc) or (defined(posix) and not defined(nimscript)) or defined(w
proc readLine*(f: File, line: var string): bool {.tags: [ReadIOEffect],
benign.} =
## reads a line of text from the file `f` into `line`. May throw an IO
## Reads a line of text from the file `f` into `line`. May throw an IO
## exception.
## A line of text may be delimited by `LF` or `CRLF`. The newline
## character(s) are not part of the returned string. Returns `false`
@@ -500,7 +499,7 @@ proc readLine*(f: File, line: var string): bool {.tags: [ReadIOEffect],
line.setLen(pos+sp)
proc readLine*(f: File): string {.tags: [ReadIOEffect], benign.} =
## reads a line of text from the file `f`. May throw an IO exception.
## Reads a line of text from the file `f`. May throw an IO exception.
## A line of text may be delimited by `LF` or `CRLF`. The newline
## character(s) are not part of the returned string.
result = newStringOfCap(80)
@@ -602,7 +601,7 @@ proc readAll*(file: File): string {.tags: [ReadIOEffect], benign.} =
proc writeLine*[Ty](f: File, x: varargs[Ty, `$`]) {.inline,
tags: [WriteIOEffect], benign.} =
## writes the values `x` to `f` and then writes "\\n".
## Writes the values `x` to `f` and then writes "\\n".
## May throw an IO exception.
for i in items(x):
write(f, i)
@@ -723,7 +722,7 @@ proc open*(f: var File, filename: string,
proc reopen*(f: File, filename: string, mode: FileMode = fmRead): bool {.
tags: [], benign.} =
## reopens the file `f` with given `filename` and `mode`. This
## Reopens the file `f` with given `filename` and `mode`. This
## is often used to redirect the `stdin`, `stdout` or `stderr`
## file variables.
##
@@ -765,19 +764,19 @@ proc open*(filename: string,
sysFatal(IOError, "cannot open: " & filename)
proc setFilePos*(f: File, pos: int64, relativeTo: FileSeekPos = fspSet) {.benign.} =
## sets the position of the file pointer that is used for read/write
## Sets the position of the file pointer that is used for read/write
## operations. The file's first byte has the index zero.
if c_fseek(f, pos, cint(relativeTo)) != 0:
raiseEIO("cannot set file position")
proc getFilePos*(f: File): int64 {.benign.} =
## retrieves the current position of the file pointer that is used to
## Retrieves the current position of the file pointer that is used to
## read from the file `f`. The file's first byte has the index zero.
result = c_ftell(f)
if result < 0: raiseEIO("cannot retrieve file position")
proc getFileSize*(f: File): int64 {.tags: [ReadIOEffect], benign.} =
## retrieves the file size (in bytes) of `f`.
## Retrieves the file size (in bytes) of `f`.
let oldPos = getFilePos(f)
discard c_fseek(f, 0, 2) # seek the end of the file
result = getFilePos(f)
@@ -906,7 +905,7 @@ proc writeFile*(filename: string, content: openArray[byte]) {.since: (1, 1).} =
raise newException(IOError, "cannot open: " & filename)
proc readLines*(filename: string, n: Natural): seq[string] =
## read `n` lines from the file named `filename`. Raises an IO exception
## Reads `n` lines from the file named `filename`. Raises an IO exception
## in case of an error. Raises EOF if file does not contain at least `n` lines.
## Available at compile time. A line of text may be delimited by `LF` or `CRLF`.
## The newline character(s) are not part of the returned strings.
@@ -948,7 +947,7 @@ iterator lines*(filename: string): string {.tags: [ReadIOEffect].} =
close(f)
iterator lines*(f: File): string {.tags: [ReadIOEffect].} =
## Iterate over any line in the file `f`.
## Iterates over any line in the file `f`.
##
## The trailing newline character(s) are removed from the iterated lines.
##

View File

@@ -2680,7 +2680,7 @@ proc slurp*(filename: string): string {.magic: "Slurp".}
## This is an alias for `staticRead <#staticRead,string>`_.
proc staticRead*(filename: string): string {.magic: "Slurp".}
## Compile-time `readFile <io.html#readFile,string>`_ proc for easy
## Compile-time `readFile <syncio.html#readFile,string>`_ proc for easy
## `resource`:idx: embedding:
##
## The maximum file size limit that `staticRead` and `slurp` can read is
@@ -3150,8 +3150,11 @@ when defined(genode):
import system/widestrs
export widestrs
import system/io
export io
when not defined(nimPreviewSlimSystem):
{.deprecated: """io is about to move out of system; use `-d:nimPreviewSlimSystem` and
import `std/syncio`.""".}
import std/syncio
export syncio
when not defined(createNimHcr) and not defined(nimscript):
include nimhcr

View File

@@ -7,7 +7,6 @@ is in separate files:
* `iterators <iterators.html>`_
* `assertions <assertions.html>`_
* `dollars <dollars.html>`_
* `io <io.html>`_
* `widestrs <widestrs.html>`_

View File

@@ -17,6 +17,9 @@ when defined(nimHasStyleChecks):
{.passc: "-DWIN32_LEAN_AND_MEAN".}
when defined(nimPreviewSlimSystem):
from std/syncio import FileHandle
const
useWinUnicode* = not defined(useWinAnsi)

View File

@@ -5,6 +5,9 @@ discard """
import sequtils, strutils
when defined(nimPreviewSlimSystem):
import std/syncio
let rules = toSeq(lines("input"))
.mapIt(it.split(" => ").mapIt(it.replace("/", "")))

View File

@@ -5,6 +5,9 @@
from stdtest/specialpaths import buildDir
when defined(nimSlimSystem):
import std/syncio
import std/[
# Core:
bitops, typetraits, lenientops, macros, volatile,

View File

@@ -187,7 +187,6 @@ proc getDocList(): seq[string] =
# don't ignore these even though in lib/system (not include files)
const goodSystem = """
lib/system/io.nim
lib/system/nimscript.nim
lib/system/assertions.nim
lib/system/iterators.nim