diff options
-rw-r--r-- | changelog.md | 1 | ||||
-rw-r--r-- | compiler/parser.nim | 6 | ||||
-rw-r--r-- | doc/grammar.txt | 4 | ||||
-rw-r--r-- | doc/lib.rst | 3 | ||||
-rw-r--r-- | lib/pure/httpclient.nim | 74 | ||||
-rw-r--r-- | lib/pure/net.nim | 2 | ||||
-rw-r--r-- | lib/pure/strutils.nim | 10 | ||||
-rw-r--r-- | lib/wrappers/libuv.nim | 732 | ||||
-rw-r--r-- | tests/parser/tletcolon.nim | 11 | ||||
-rw-r--r-- | web/website.ini | 2 |
10 files changed, 69 insertions, 776 deletions
diff --git a/changelog.md b/changelog.md index 97ce82cd6..77e5a29b5 100644 --- a/changelog.md +++ b/changelog.md @@ -16,6 +16,7 @@ module. - The overloading rules changed slightly so that constrained generics are preferred over unconstrained generics. (Bug #6526) +- Removed libuv out of the stdlib and into Nimble packages. - It is now possible to forward declare object types so that mutually recursive types can be created across module boundaries. See [package level objects](https://nim-lang.org/docs/manual.html#package-level-objects) diff --git a/compiler/parser.nim b/compiler/parser.nim index e3bb68da4..41303ead9 100644 --- a/compiler/parser.nim +++ b/compiler/parser.nim @@ -72,6 +72,7 @@ proc parseStmtPragma(p: var TParser): PNode proc parsePragma(p: var TParser): PNode proc postExprBlocks(p: var TParser, x: PNode): PNode proc parseExprStmt(p: var TParser): PNode +proc parseBlock(p: var TParser): PNode # implementation proc getTok(p: var TParser) = @@ -1078,12 +1079,14 @@ proc parseTypeDescKAux(p: var TParser, kind: TNodeKind, parseSymbolList(p, list) proc parseExpr(p: var TParser): PNode = - #| expr = (ifExpr + #| expr = (blockExpr + #| | ifExpr #| | whenExpr #| | caseExpr #| | tryExpr) #| / simpleExpr case p.tok.tokType: + of tkBlock: result = parseBlock(p) of tkIf: result = parseIfExpr(p, nkIfExpr) of tkWhen: result = parseIfExpr(p, nkWhenExpr) of tkCase: result = parseCase(p) @@ -1517,6 +1520,7 @@ proc parseFor(p: var TParser): PNode = proc parseBlock(p: var TParser): PNode = #| blockStmt = 'block' symbol? colcom stmt + #| blockExpr = 'block' symbol? colcom stmt result = newNodeP(nkBlockStmt, p) getTokNoInd(p) if p.tok.tokType == tkColon: addSon(result, ast.emptyNode) diff --git a/doc/grammar.txt b/doc/grammar.txt index 58b119331..eae3694a0 100644 --- a/doc/grammar.txt +++ b/doc/grammar.txt @@ -83,7 +83,8 @@ paramListColon = paramList? (':' optInd typeDesc)? doBlock = 'do' paramListArrow pragmas? colcom stmt procExpr = 'proc' paramListColon pragmas? ('=' COMMENT? stmt)? distinct = 'distinct' optInd typeDesc -expr = (ifExpr +expr = (blockExpr + | ifExpr | whenExpr | caseExpr | tryExpr) @@ -141,6 +142,7 @@ tryExpr = 'try' colcom stmt &(optInd 'except'|'finally') exceptBlock = 'except' colcom stmt forStmt = 'for' (identWithPragma ^+ comma) 'in' expr colcom stmt blockStmt = 'block' symbol? colcom stmt +blockExpr = 'block' symbol? colcom stmt staticStmt = 'static' colcom stmt deferStmt = 'defer' colcom stmt asmStmt = 'asm' pragma? (STR_LIT | RSTR_LIT | TRIPLE_STR_LIT) diff --git a/doc/lib.rst b/doc/lib.rst index 64c3c11eb..e32c2b6a9 100644 --- a/doc/lib.rst +++ b/doc/lib.rst @@ -533,9 +533,6 @@ Database support Network Programming and Internet Protocols ------------------------------------------ -* `libuv <libuv.html>`_ - Wrapper for the libuv library used for async I/O programming. - * `joyent_http_parser <joyent_http_parser.html>`_ Wrapper for the joyent's high-performance HTTP parser. diff --git a/lib/pure/httpclient.nim b/lib/pure/httpclient.nim index de1d332a3..54a8498fa 100644 --- a/lib/pure/httpclient.nim +++ b/lib/pure/httpclient.nim @@ -469,7 +469,7 @@ proc request*(url: string, httpMethod: string, extraHeaders = "", ## **Deprecated since version 0.15.0**: use ``HttpClient.request`` instead. var r = if proxy == nil: parseUri(url) else: proxy.url var hostUrl = if proxy == nil: r else: parseUri(url) - var headers = httpMethod.toUpper() + var headers = httpMethod.toUpperAscii() # TODO: Use generateHeaders further down once it supports proxies. var s = newSocket() @@ -713,10 +713,10 @@ proc downloadFile*(url: string, outputFilename: string, proc generateHeaders(requestUrl: Uri, httpMethod: string, headers: HttpHeaders, body: string, proxy: Proxy): string = # GET - result = httpMethod.toUpper() + result = httpMethod.toUpperAscii() result.add ' ' - if proxy.isNil: + if proxy.isNil or (not proxy.isNil and requestUrl.scheme == "https"): # /path?query if requestUrl.path[0] != '/': result.add '/' result.add(requestUrl.path) @@ -1048,7 +1048,11 @@ proc newConnection(client: HttpClient | AsyncHttpClient, client.currentURL.scheme != url.scheme or client.currentURL.port != url.port or (not client.connected): - let isSsl = url.scheme.toLowerAscii() == "https" + # Connect to proxy if specified + let connectionUrl = + if client.proxy.isNil: url else: client.proxy.url + + let isSsl = connectionUrl.scheme.toLowerAscii() == "https" if isSsl and not defined(ssl): raise newException(HttpRequestError, @@ -1056,31 +1060,55 @@ proc newConnection(client: HttpClient | AsyncHttpClient, if client.connected: client.close() + client.connected = false # TODO: I should be able to write 'net.Port' here... let port = - if url.port == "": + if connectionUrl.port == "": if isSsl: nativesockets.Port(443) else: nativesockets.Port(80) - else: nativesockets.Port(url.port.parseInt) + else: nativesockets.Port(connectionUrl.port.parseInt) when client is HttpClient: - client.socket = await net.dial(url.hostname, port) + client.socket = await net.dial(connectionUrl.hostname, port) elif client is AsyncHttpClient: - client.socket = await asyncnet.dial(url.hostname, port) + client.socket = await asyncnet.dial(connectionUrl.hostname, port) else: {.fatal: "Unsupported client type".} when defined(ssl): if isSsl: try: client.sslContext.wrapConnectedSocket( - client.socket, handshakeAsClient, url.hostname) + client.socket, handshakeAsClient, connectionUrl.hostname) except: client.socket.close() raise getCurrentException() + # If need to CONNECT through proxy + if url.scheme == "https" and not client.proxy.isNil: + when defined(ssl): + # Pass only host:port for CONNECT + var connectUrl = initUri() + connectUrl.hostname = url.hostname + connectUrl.port = if url.port != "": url.port else: "443" + + let proxyHeaderString = generateHeaders(connectUrl, $HttpConnect, newHttpHeaders(), "", client.proxy) + await client.socket.send(proxyHeaderString) + let proxyResp = await parseResponse(client, false) + + if not proxyResp.status.startsWith("200"): + raise newException(HttpRequestError, + "The proxy server rejected a CONNECT request, " & + "so a secure connection could not be established.") + client.sslContext.wrapConnectedSocket( + client.socket, handshakeAsClient, url.hostname) + else: + raise newException(HttpRequestError, + "SSL support is not available. Cannot connect over SSL.") + + # May be connected through proxy but remember actual URL being accessed client.currentURL = url client.connected = true @@ -1100,32 +1128,9 @@ proc requestAux(client: HttpClient | AsyncHttpClient, url: string, headers: HttpHeaders = nil): Future[Response | AsyncResponse] {.multisync.} = # Helper that actually makes the request. Does not handle redirects. - let connectionUrl = - if client.proxy.isNil: parseUri(url) else: client.proxy.url let requestUrl = parseUri(url) - let savedProxy = client.proxy # client's proxy may be overwritten. - - if requestUrl.scheme == "https" and not client.proxy.isNil: - when defined(ssl): - client.proxy.url = connectionUrl - var connectUrl = requestUrl - connectUrl.scheme = "http" - connectUrl.port = "443" - let proxyResp = await requestAux(client, $connectUrl, $HttpConnect) - - if not proxyResp.status.startsWith("200"): - raise newException(HttpRequestError, - "The proxy server rejected a CONNECT request, " & - "so a secure connection could not be established.") - client.sslContext.wrapConnectedSocket( - client.socket, handshakeAsClient, requestUrl.hostname) - client.proxy = nil - else: - raise newException(HttpRequestError, - "SSL support not available. Cannot connect to https site over proxy.") - else: - await newConnection(client, connectionUrl) + await newConnection(client, requestUrl) let effectiveHeaders = client.headers.override(headers) @@ -1143,9 +1148,6 @@ proc requestAux(client: HttpClient | AsyncHttpClient, url: string, client.getBody result = await parseResponse(client, getBody) - # Restore the clients proxy in case it was overwritten. - client.proxy = savedProxy - proc request*(client: HttpClient | AsyncHttpClient, url: string, httpMethod: string, body = "", headers: HttpHeaders = nil): Future[Response | AsyncResponse] diff --git a/lib/pure/net.nim b/lib/pure/net.nim index a405ce1bd..b8d05642b 100644 --- a/lib/pure/net.nim +++ b/lib/pure/net.nim @@ -58,7 +58,7 @@ ## You can then begin accepting connections using the ``accept`` procedure. ## ## .. code-block:: Nim -## var client = newSocket() +## var client = new Socket ## var address = "" ## while true: ## socket.acceptAddr(client, address) diff --git a/lib/pure/strutils.nim b/lib/pure/strutils.nim index 0b55e6b1d..5c07757cb 100644 --- a/lib/pure/strutils.nim +++ b/lib/pure/strutils.nim @@ -2007,6 +2007,16 @@ proc formatFloat*(f: float, format: FloatFormatMode = ffDefault, ## after the decimal point for Nim's ``float`` type. ## ## If ``precision == 0``, it tries to format it nicely. + ## + ## Examples: + ## + ## .. code-block:: nim + ## + ## let x = 123.456 + ## echo x.formatFloat() # 123.4560000000000 + ## echo x.formatFloat(ffDecimal, 4) # 123.4560 + ## echo x.formatFloat(ffScientific, 2) # 1.23e+02 + ## result = formatBiggestFloat(f, format, precision, decimalSep) proc trimZeros*(x: var string) {.noSideEffect.} = diff --git a/lib/wrappers/libuv.nim b/lib/wrappers/libuv.nim deleted file mode 100644 index 3e28815ad..000000000 --- a/lib/wrappers/libuv.nim +++ /dev/null @@ -1,732 +0,0 @@ -# -# -# Nim's Runtime Library -# (c) Copyright 2015 Andreas Rumpf -# -# See the file "copying.txt", included in this -# distribution, for details about the copyright. -# - -## libuv is still fast moving target -## This file was last updated against a development HEAD revision of https://github.com/joyent/libuv/ - -## Use the following link to see changes (in uv.h) since then and don't forget to update the information here. -## https://github.com/joyent/libuv/compare/9f6024a6fa9d254527b4b59af724257df870288b...master - -when defined(Windows): - import winlean -else: - import posix - -type - Port* = distinct int16 ## port type - - cssize = int - coff = int - csize = int - - AllocProc* = proc (handle: PHandle, suggested_size: csize): Buf {.cdecl.} - ReadProc* = proc (stream: PStream, nread: cssize, buf: Buf) {.cdecl.} - ReadProc2* = proc (stream: PPipe, nread: cssize, buf: Buf, pending: HandleType) {.cdecl.} - WriteProc* = proc (req: PWrite, status: cint) {.cdecl.} - ConnectProc* = proc (req: PConnect, status: cint) {.cdecl.} - ShutdownProc* = proc (req: PShutdown, status: cint) {.cdecl.} - ConnectionProc* = proc (server: PStream, status: cint) {.cdecl.} - CloseProc* = proc (handle: PHandle) {.cdecl.} - TimerProc* = proc (handle: PTimer, status: cint) {.cdecl.} - AsyncProc* = proc (handle: PAsync, status: cint) {.cdecl.} - PrepareProc* = proc (handle: PPrepare, status: cint) {.cdecl.} - CheckProc* = proc (handle: PCheck, status: cint) {.cdecl.} - IdleProc* = proc (handle: PIdle, status: cint) {.cdecl.} - - PSockAddr* = ptr SockAddr - - GetAddrInfoProc* = proc (handle: PGetAddrInfo, status: cint, res: ptr AddrInfo) - - ExitProc* = proc (a2: PProcess, exit_status: cint, term_signal: cint) - FsProc* = proc (req: PFS) - WorkProc* = proc (req: PWork) - AfterWorkProc* = proc (req: PWork) - - FsEventProc* = proc (handle: PFsEvent, filename: cstring, events: cint, status: cint) - - ErrorCode* {.size: sizeof(cint).} = enum - UNKNOWN = - 1, OK = 0, EOF, EACCESS, EAGAIN, EADDRINUSE, EADDRNOTAVAIL, - EAFNOSUPPORT, EALREADY, EBADF, EBUSY, ECONNABORTED, ECONNREFUSED, - ECONNRESET, EDESTADDRREQ, EFAULT, EHOSTUNREACH, EINTR, EINVAL, EISCONN, - EMFILE, EMSGSIZE, ENETDOWN, ENETUNREACH, ENFILE, ENOBUFS, ENOMEM, ENONET, - ENOPROTOOPT, ENOTCONN, ENOTSOCK, ENOTSUP, ENOENT, EPIPE, EPROTO, - EPROTONOSUPPORT, EPROTOTYPE, ETIMEDOUT, ECHARSET, EAIFAMNOSUPPORT, - EAINONAME, EAISERVICE, EAISOCKTYPE, ESHUTDOWN, EEXIST - - HandleType* {.size: sizeof(cint).} = enum - UNKNOWN_HANDLE = 0, TCP, UDP, NAMED_PIPE, TTY, FILE, TIMER, PREPARE, CHECK, - IDLE, ASYNC, ARES_TASK, ARES_EVENT, PROCESS, FS_EVENT - - ReqType* {.size: sizeof(cint).} = enum - rUNKNOWN_REQ = 0, - rCONNECT, - rACCEPT, - rREAD, - rWRITE, - rSHUTDOWN, - rWAKEUP, - rUDP_SEND, - rFS, - rWORK, - rGETADDRINFO, - rREQ_TYPE_PRIVATE - - Err* {.pure, final, importc: "uv_err_t", header: "uv.h".} = object - code* {.importc: "code".}: ErrorCode - sys_errno* {.importc: "sys_errno_".}: cint - - FsEventType* = enum - evRENAME = 1, - evCHANGE = 2 - - TFsEvent* {.pure, final, importc: "uv_fs_event_t", header: "uv.h".} = object - loop* {.importc: "loop".}: PLoop - typ* {.importc: "type".}: HandleType - close_cb* {.importc: "close_cb".}: CloseProc - data* {.importc: "data".}: pointer - filename {.importc: "filename".}: cstring - - PFsEvent* = ptr TFsEvent - - FsEvents* {.pure, final, importc: "uv_fs_event_t", header: "uv.h".} = object - loop* {.importc: "loop".}: PLoop - typ* {.importc: "type".}: HandleType - close_cb* {.importc: "close_cb".}: CloseProc - data* {.importc: "data".}: pointer - filename* {.importc: "filename".}: cstring - - Buf* {.pure, final, importc: "uv_buf_t", header: "uv.h"} = object - base* {.importc: "base".}: cstring - len* {.importc: "len".}: csize - - AnyHandle* {.pure, final, importc: "uv_any_handle", header: "uv.h".} = object - tcp* {.importc: "tcp".}: TTcp - pipe* {.importc: "pipe".}: Pipe - prepare* {.importc: "prepare".}: TPrepare - check* {.importc: "check".}: TCheck - idle* {.importc: "idle".}: TIdle - async* {.importc: "async".}: TAsync - timer* {.importc: "timer".}: TTimer - getaddrinfo* {.importc: "getaddrinfo".}: Getaddrinfo - fs_event* {.importc: "fs_event".}: FsEvents - - AnyReq* {.pure, final, importc: "uv_any_req", header: "uv.h".} = object - req* {.importc: "req".}: Req - write* {.importc: "write".}: Write - connect* {.importc: "connect".}: Connect - shutdown* {.importc: "shutdown".}: Shutdown - fs_req* {.importc: "fs_req".}: Fs - work_req* {.importc: "work_req".}: Work - - ## better import this - uint64 = int64 - - Counters* {.pure, final, importc: "uv_counters_t", header: "uv.h".} = object - eio_init* {.importc: "eio_init".}: uint64 - req_init* {.importc: "req_init".}: uint64 - handle_init* {.importc: "handle_init".}: uint64 - stream_init* {.importc: "stream_init".}: uint64 - tcp_init* {.importc: "tcp_init".}: uint64 - udp_init* {.importc: "udp_init".}: uint64 - pipe_init* {.importc: "pipe_init".}: uint64 - tty_init* {.importc: "tty_init".}: uint64 - prepare_init* {.importc: "prepare_init".}: uint64 - check_init* {.importc: "check_init".}: uint64 - idle_init* {.importc: "idle_init".}: uint64 - async_init* {.importc: "async_init".}: uint64 - timer_init* {.importc: "timer_init".}: uint64 - process_init* {.importc: "process_init".}: uint64 - fs_event_init* {.importc: "fs_event_init".}: uint64 - - Loop* {.pure, final, importc: "uv_loop_t", header: "uv.h".} = object - # ares_handles_* {.importc: "uv_ares_handles_".}: pointer # XXX: This seems to be a private field? - eio_want_poll_notifier* {.importc: "uv_eio_want_poll_notifier".}: TAsync - eio_done_poll_notifier* {.importc: "uv_eio_done_poll_notifier".}: TAsync - eio_poller* {.importc: "uv_eio_poller".}: TIdle - counters* {.importc: "counters".}: Counters - last_err* {.importc: "last_err".}: Err - data* {.importc: "data".}: pointer - - PLoop* = ptr Loop - - Shutdown* {.pure, final, importc: "uv_shutdown_t", header: "uv.h".} = object - typ* {.importc: "type".}: ReqType - data* {.importc: "data".}: pointer - handle* {.importc: "handle".}: PStream - cb* {.importc: "cb".}: ShutdownProc - - PShutdown* = ptr Shutdown - - Handle* {.pure, final, importc: "uv_handle_t", header: "uv.h".} = object - loop* {.importc: "loop".}: PLoop - typ* {.importc: "type".}: HandleType - close_cb* {.importc: "close_cb".}: CloseProc - data* {.importc: "data".}: pointer - - PHandle* = ptr Handle - - Stream* {.pure, final, importc: "uv_stream_t", header: "uv.h".} = object - loop* {.importc: "loop".}: PLoop - typ* {.importc: "type".}: HandleType - alloc_cb* {.importc: "alloc_cb".}: AllocProc - read_cb* {.importc: "read_cb".}: ReadProc - read2_cb* {.importc: "read2_cb".}: ReadProc2 - close_cb* {.importc: "close_cb".}: CloseProc - data* {.importc: "data".}: pointer - write_queue_size* {.importc: "write_queue_size".}: csize - - PStream* = ptr Stream - - Write* {.pure, final, importc: "uv_write_t", header: "uv.h".} = object - typ* {.importc: "type".}: ReqType - data* {.importc: "data".}: pointer - cb* {.importc: "cb".}: WriteProc - send_handle* {.importc: "send_handle".}: PStream - handle* {.importc: "handle".}: PStream - - PWrite* = ptr Write - - TTcp* {.pure, final, importc: "uv_tcp_t", header: "uv.h".} = object - loop* {.importc: "loop".}: PLoop - typ* {.importc: "type".}: HandleType - alloc_cb* {.importc: "alloc_cb".}: AllocProc - read_cb* {.importc: "read_cb".}: ReadProc - read2_cb* {.importc: "read2_cb".}: ReadProc2 - close_cb* {.importc: "close_cb".}: CloseProc - data* {.importc: "data".}: pointer - write_queue_size* {.importc: "write_queue_size".}: csize - - PTcp* = ptr TTcp - - Connect* {.pure, final, importc: "uv_connect_t", header: "uv.h".} = object - typ* {.importc: "type".}: ReqType - data* {.importc: "data".}: pointer - cb* {.importc: "cb".}: ConnectProc - handle* {.importc: "handle".}: PStream - - PConnect* = ptr Connect - - UdpFlags* = enum - UDP_IPV6ONLY = 1, UDP_PARTIAL = 2 - - ## XXX: better import this - cunsigned = int - - UdpSendProc* = proc (req: PUdpSend, status: cint) - UdpRecvProc* = proc (handle: PUdp, nread: cssize, buf: Buf, adr: ptr SockAddr, flags: cunsigned) - - TUdp* {.pure, final, importc: "uv_udp_t", header: "uv.h".} = object - loop* {.importc: "loop".}: PLoop - typ* {.importc: "type".}: HandleType - close_cb* {.importc: "close_cb".}: CloseProc - data* {.importc: "data".}: pointer - - PUdp* = ptr TUdp - - UdpSend* {.pure, final, importc: "uv_udp_send_t", header: "uv.h".} = object - typ* {.importc: "type".}: ReqType - data* {.importc: "data".}: pointer - handle* {.importc: "handle".}: PUdp - cb* {.importc: "cb".}: UdpSendProc - - PUdpSend* = ptr UdpSend - - tTTy* {.pure, final, importc: "uv_tty_t", header: "uv.h".} = object - loop* {.importc: "loop".}: PLoop - typ* {.importc: "type".}: HandleType - alloc_cb* {.importc: "alloc_cb".}: AllocProc - read_cb* {.importc: "read_cb".}: ReadProc - read2_cb* {.importc: "read2_cb".}: ReadProc2 - close_cb* {.importc: "close_cb".}: CloseProc - data* {.importc: "data".}: pointer - write_queue_size* {.importc: "write_queue_size".}: csize - - pTTy* = ptr tTTy - - Pipe* {.pure, final, importc: "uv_pipe_t", header: "uv.h".} = object - loop* {.importc: "loop".}: PLoop - typ* {.importc: "type".}: HandleType - alloc_cb* {.importc: "alloc_cb".}: AllocProc - read_cb* {.importc: "read_cb".}: ReadProc - read2_cb* {.importc: "read2_cb".}: ReadProc2 - close_cb* {.importc: "close_cb".}: CloseProc - data* {.importc: "data".}: pointer - write_queue_size* {.importc: "write_queue_size".}: csize - ipc {.importc: "ipc".}: int - - PPipe* = ptr Pipe - - TPrepare* {.pure, final, importc: "uv_prepare_t", header: "uv.h".} = object - loop* {.importc: "loop".}: PLoop - typ* {.importc: "type".}: HandleType - close_cb* {.importc: "close_cb".}: CloseProc - data* {.importc: "data".}: pointer - - PPrepare* = ptr TPrepare - - TCheck* {.pure, final, importc: "uv_check_t", header: "uv.h".} = object - loop* {.importc: "loop".}: PLoop - typ* {.importc: "type".}: HandleType - close_cb* {.importc: "close_cb".}: CloseProc - data* {.importc: "data".}: pointer - - PCheck* = ptr TCheck - - TIdle* {.pure, final, importc: "uv_idle_t", header: "uv.h".} = object - loop* {.importc: "loop".}: PLoop - typ* {.importc: "type".}: HandleType - close_cb* {.importc: "close_cb".}: CloseProc - data* {.importc: "data".}: pointer - - PIdle* = ptr TIdle - - TAsync* {.pure, final, importc: "uv_async_t", header: "uv.h".} = object - loop* {.importc: "loop".}: PLoop - typ* {.importc: "type".}: HandleType - close_cb* {.importc: "close_cb".}: CloseProc - data* {.importc: "data".}: pointer - - PAsync* = ptr TAsync - - TTimer* {.pure, final, importc: "uv_timer_t", header: "uv.h".} = object - loop* {.importc: "loop".}: PLoop - typ* {.importc: "type".}: HandleType - close_cb* {.importc: "close_cb".}: CloseProc - data* {.importc: "data".}: pointer - - PTimer* = ptr TTimer - - GetAddrInfo* {.pure, final, importc: "uv_getaddrinfo_t", header: "uv.h".} = object - typ* {.importc: "type".}: ReqType - data* {.importc: "data".}: pointer - loop* {.importc: "loop".}: PLoop - - PGetAddrInfo* = ptr GetAddrInfo - - ProcessOptions* {.pure, final, importc: "uv_process_options_t", header: "uv.h".} = object - exit_cb* {.importc: "exit_cb".}: ExitProc - file* {.importc: "file".}: cstring - args* {.importc: "args".}: cstringArray - env* {.importc: "env".}: cstringArray - cwd* {.importc: "cwd".}: cstring - windows_verbatim_arguments* {.importc: "windows_verbatim_arguments".}: cint - stdin_stream* {.importc: "stdin_stream".}: PPipe - stdout_stream* {.importc: "stdout_stream".}: PPipe - stderr_stream* {.importc: "stderr_stream".}: PPipe - - PProcessOptions* = ptr ProcessOptions - - TProcess* {.pure, final, importc: "uv_process_t", header: "uv.h".} = object - loop* {.importc: "loop".}: PLoop - typ* {.importc: "type".}: HandleType - close_cb* {.importc: "close_cb".}: CloseProc - data* {.importc: "data".}: pointer - exit_cb* {.importc: "exit_cb".}: ExitProc - pid* {.importc: "pid".}: cint - - PProcess* = ptr TProcess - - Work* {.pure, final, importc: "uv_work_t", header: "uv.h".} = object - typ* {.importc: "type".}: ReqType - data* {.importc: "data".}: pointer - loop* {.importc: "loop".}: PLoop - work_cb* {.importc: "work_cb".}: WorkProc - after_work_cb* {.importc: "after_work_cb".}: AfterWorkProc - - PWork* = ptr Work - - FsType* {.size: sizeof(cint).} = enum - FS_UNKNOWN = - 1, FS_CUSTOM, FS_OPEN, FS_CLOSE, FS_READ, FS_WRITE, - FS_SENDFILE, FS_STAT, FS_LSTAT, FS_FSTAT, FS_FTRUNCATE, FS_UTIME, FS_FUTIME, - FS_CHMOD, FS_FCHMOD, FS_FSYNC, FS_FDATASYNC, FS_UNLINK, FS_RMDIR, FS_MKDIR, - FS_RENAME, FS_READDIR, FS_LINK, FS_SYMLINK, FS_READLINK, FS_CHOWN, FS_FCHOWN - - FS* {.pure, final, importc: "uv_fs_t", header: "uv.h".} = object - typ* {.importc: "type".}: ReqType - data* {.importc: "data".}: pointer - loop* {.importc: "loop".}: PLoop - fs_type* {.importc: "fs_type".}: FsType - cb* {.importc: "cb".}: FsProc - result* {.importc: "result".}: cssize - fsPtr* {.importc: "ptr".}: pointer - path* {.importc: "path".}: cstring - errorno* {.importc: "errorno".}: cint - - PFS* = ptr FS - - Req* {.pure, final, importc: "uv_req_t", header: "uv.h".} = object - typ* {.importc: "type".}: ReqType - data* {.importc: "data".}: pointer - - PReq* = ptr Req - - AresOptions* {.pure, final, importc: "ares_options", header: "uv.h".} = object - flags* {.importc: "flags".}: int - timeout* {.importc: "timeout".}: int - tries* {.importc: "tries".}: int - ndots* {.importc: "ndots".}: int - udp_port* {.importc: "udp_port".}: Port - tcp_port* {.importc: "tcp_port".}: Port - socket_send_buffer_size* {.importc: "socket_send_buffer_size".}: int - socket_recv_buffer_size* {.importc: "socket_receive_buffer_size".}: int - servers* {.importc: "servers".}: ptr InAddr - nservers* {.importc: "nservers".}: int - domains* {.importc: "domains".}: ptr cstring - ndomains* {.importc: "ndomains".}: int - lookups* {.importc: "lookups".}: cstring - - #XXX: not yet exported - #ares_sock_state_cb sock_state_cb; - #void *sock_state_cb_data; - #struct apattern *sortlist; - #int nsort; - - PAresOptions* = ptr AresOptions - PAresChannel* = pointer -{.deprecated: [THandle: Handle, THandleType: HandleType, TAnyHandle: AnyHandle, - TAnyReq: AnyReq, TPort: Port, TErrorCode: ErrorCode, TReqType: ReqType, - TErr: Err, TFsEventType: FsEventType, - # TFsEvent: FsEvent, # Name conflict if we drop `T` - TFsEvents: FsEvents, TBuf: Buf, TCounters: Counters, TLoop: Loop, - TShutdown: Shutdown, TStream: Stream, TWrite: Write, - # TTcp: Tcp, # Name conflict if we drop `T` - TConnect: Connect, - TUdpFlags: UdpFlags, - # TUdp: Udp, # Name conflict if we drop `T` - TUdpSend: UdpSend, - # tTTy: TTy, # Name conflict if we drop `T` - TPipe: Pipe, - # TPrepare: Prepare, # Name conflict if we drop `T` - # TCheck: Check, # Name conflict if we drop `T` - # TIdle: Idle, # Name conflict if we drop `T` - # TAsync: Async, # Name conflict if we drop `T` - # TTimer: Timer, # Name conflict if we drop `T` - TGetAddrInfo: GetAddrInfo, TProcessOptions: ProcessOptions, - # TProcess: Process, # Name conflict if we drop `T` - TWork: Work, - TFsType: FsType, TFS: FS, TReq: Req, TAresOptions: AresOptions].} - -proc loop_new*(): PLoop{. - importc: "uv_loop_new", header: "uv.h".} - -proc loop_delete*(a2: PLoop){. - importc: "uv_loop_delete", header: "uv.h".} - -proc default_loop*(): PLoop{. - importc: "uv_default_loop", header: "uv.h".} - -proc run*(a2: PLoop): cint{. - importc: "uv_run", header: "uv.h".} - -proc addref*(a2: PLoop){. - importc: "uv_ref", header: "uv.h".} - -proc unref*(a2: PLoop){. - importc: "uv_unref", header: "uv.h".} - -proc update_time*(a2: PLoop){. - importc: "uv_update_time", header: "uv.h".} - -proc now*(a2: PLoop): int64{. - importc: "uv_now", header: "uv.h".} - -proc last_error*(a2: PLoop): Err{. - importc: "uv_last_error", header: "uv.h".} - -proc strerror*(err: Err): cstring{. - importc: "uv_strerror", header: "uv.h".} - -proc err_name*(err: Err): cstring{. - importc: "uv_err_name", header: "uv.h".} - -proc shutdown*(req: PShutdown, handle: PStream, cb: ShutdownProc): cint{. - importc: "uv_shutdown", header: "uv.h".} - -proc is_active*(handle: PHandle): cint{. - importc: "uv_is_active", header: "uv.h".} - -proc close*(handle: PHandle, close_cb: CloseProc){. - importc: "uv_close", header: "uv.h".} - -proc buf_init*(base: cstring, len: csize): Buf{. - importc: "uv_buf_init", header: "uv.h".} - -proc listen*(stream: PStream, backlog: cint, cb: ConnectionProc): cint{. - importc: "uv_listen", header: "uv.h".} - -proc accept*(server: PStream, client: PStream): cint{. - importc: "uv_accept", header: "uv.h".} - -proc read_start*(a2: PStream, alloc_cb: AllocProc, read_cb: ReadProc): cint{. - importc: "uv_read_start", header: "uv.h".} - -proc read_start*(a2: PStream, alloc_cb: AllocProc, read_cb: ReadProc2): cint{. - importc: "uv_read2_start", header: "uv.h".} - -proc read_stop*(a2: PStream): cint{. - importc: "uv_read_stop", header: "uv.h".} - -proc write*(req: PWrite, handle: PStream, bufs: ptr Buf, bufcnt: cint, cb: WriteProc): cint{. - importc: "uv_write", header: "uv.h".} - -proc write*(req: PWrite, handle: PStream, bufs: ptr Buf, bufcnt: cint, send_handle: PStream, cb: WriteProc): cint{. - importc: "uv_write2", header: "uv.h".} - -proc tcp_init*(a2: PLoop, handle: PTcp): cint{. - importc: "uv_tcp_init", header: "uv.h".} - -proc tcp_bind*(handle: PTcp, a3: SockAddrIn): cint{. - importc: "uv_tcp_bind", header: "uv.h".} - -proc tcp_bind6*(handle: PTcp, a3: TSockAddrIn6): cint{. - importc: "uv_tcp_bind6", header: "uv.h".} - -proc tcp_getsockname*(handle: PTcp, name: ptr SockAddr, namelen: var cint): cint{. - importc: "uv_tcp_getsockname", header: "uv.h".} - -proc tcp_getpeername*(handle: PTcp, name: ptr SockAddr, namelen: var cint): cint{. - importc: "uv_tcp_getpeername", header: "uv.h".} - -proc tcp_connect*(req: PConnect, handle: PTcp, address: SockAddrIn, cb: ConnectProc): cint{. - importc: "uv_tcp_connect", header: "uv.h".} - -proc tcp_connect6*(req: PConnect, handle: PTcp, address: TSockAddrIn6, cb: ConnectProc): cint{. - importc: "uv_tcp_connect6", header: "uv.h".} - -proc udp_init*(a2: PLoop, handle: PUdp): cint{. - importc: "uv_udp_init", header: "uv.h".} - -proc udp_bind*(handle: PUdp, adr: SockAddrIn, flags: cunsigned): cint{. - importc: "uv_udp_bind", header: "uv.h".} - -proc udp_bind6*(handle: PUdp, adr: TSockAddrIn6, flags: cunsigned): cint{. - importc: "uv_udp_bind6", header: "uv.h".} - -proc udp_getsockname*(handle: PUdp, name: ptr SockAddr, namelen: var cint): cint{. - importc: "uv_udp_getsockname", header: "uv.h".} - -proc udp_send*(req: PUdpSend, handle: PUdp, bufs: ptr Buf, bufcnt: cint, adr: SockAddrIn, send_cb: UdpSendProc): cint{. - importc: "uv_udp_send", header: "uv.h".} - -proc udp_send6*(req: PUdpSend, handle: PUdp, bufs: ptr Buf, bufcnt: cint, adr: TSockAddrIn6, send_cb: UdpSendProc): cint{. - importc: "uv_udp_send6", header: "uv.h".} - -proc udp_recv_start*(handle: PUdp, alloc_cb: AllocProc, recv_cb: UdpRecvProc): cint{. - importc: "uv_udp_recv_start", header: "uv.h".} - -proc udp_recv_stop*(handle: PUdp): cint{. - importc: "uv_udp_recv_stop", header: "uv.h".} - -proc tty_init*(a2: PLoop, a3: pTTy, fd: File): cint{. - importc: "uv_tty_init", header: "uv.h".} - -proc tty_set_mode*(a2: pTTy, mode: cint): cint{. - importc: "uv_tty_set_mode", header: "uv.h".} - -proc tty_get_winsize*(a2: pTTy, width: var cint, height: var cint): cint{. - importc: "uv_tty_get_winsize", header: "uv.h".} - -proc tty_reset_mode*() {. - importc: "uv_tty_reset_mode", header: "uv.h".} - -proc guess_handle*(file: File): HandleType{. - importc: "uv_guess_handle", header: "uv.h".} - -proc pipe_init*(a2: PLoop, handle: PPipe, ipc: int): cint{. - importc: "uv_pipe_init", header: "uv.h".} - -proc pipe_open*(a2: PPipe, file: File){. - importc: "uv_pipe_open", header: "uv.h".} - -proc pipe_bind*(handle: PPipe, name: cstring): cint{. - importc: "uv_pipe_bind", header: "uv.h".} - -proc pipe_connect*(req: PConnect, handle: PPipe, name: cstring, cb: ConnectProc): cint{. - importc: "uv_pipe_connect", header: "uv.h".} - -proc prepare_init*(a2: PLoop, prepare: PPrepare): cint{. - importc: "uv_prepare_init", header: "uv.h".} - -proc prepare_start*(prepare: PPrepare, cb: PrepareProc): cint{. - importc: "uv_prepare_start", header: "uv.h".} - -proc prepare_stop*(prepare: PPrepare): cint{. - importc: "uv_prepare_stop", header: "uv.h".} - -proc check_init*(a2: PLoop, check: PCheck): cint{. - importc: "uv_check_init", header: "uv.h".} - -proc check_start*(check: PCheck, cb: CheckProc): cint{. - importc: "uv_check_start", header: "uv.h".} - -proc check_stop*(check: PCheck): cint{. - importc: "uv_check_stop", header: "uv.h".} - -proc idle_init*(a2: PLoop, idle: PIdle): cint{. - importc: "uv_idle_init", header: "uv.h".} - -proc idle_start*(idle: PIdle, cb: IdleProc): cint{. - importc: "uv_idle_start", header: "uv.h".} - -proc idle_stop*(idle: PIdle): cint{. - importc: "uv_idle_stop", header: "uv.h".} - -proc async_init*(a2: PLoop, async: PAsync, async_cb: AsyncProc): cint{. - importc: "uv_async_init", header: "uv.h".} - -proc async_send*(async: PAsync): cint{. - importc: "uv_async_send", header: "uv.h".} - -proc timer_init*(a2: PLoop, timer: PTimer): cint{. - importc: "uv_timer_init", header: "uv.h".} - -proc timer_start*(timer: PTimer, cb: TimerProc, timeout: int64, repeat: int64): cint{. - importc: "uv_timer_start", header: "uv.h".} - -proc timer_stop*(timer: PTimer): cint{. - importc: "uv_timer_stop", header: "uv.h".} - -proc timer_again*(timer: PTimer): cint{. - importc: "uv_timer_again", header: "uv.h".} - -proc timer_set_repeat*(timer: PTimer, repeat: int64){. - importc: "uv_timer_set_repeat", header: "uv.h".} - -proc timer_get_repeat*(timer: PTimer): int64{. - importc: "uv_timer_get_repeat", header: "uv.h".} - -proc ares_init_options*(a2: PLoop, channel: PAresChannel, options: PAresOptions, optmask: cint): cint{. - importc: "uv_ares_init_options", header: "uv.h".} - -proc ares_destroy*(a2: PLoop, channel: PAresChannel){. - importc: "uv_ares_destroy", header: "uv.h".} - -proc getaddrinfo*(a2: PLoop, handle: PGetAddrInfo,getaddrinfo_cb: GetAddrInfoProc, node: cstring, service: cstring, hints: ptr AddrInfo): cint{. - importc: "uv_getaddrinfo", header: "uv.h".} - -proc freeaddrinfo*(ai: ptr AddrInfo){. - importc: "uv_freeaddrinfo", header: "uv.h".} - -proc spawn*(a2: PLoop, a3: PProcess, options: ProcessOptions): cint{. - importc: "uv_spawn", header: "uv.h".} - -proc process_kill*(a2: PProcess, signum: cint): cint{. - importc: "uv_process_kill", header: "uv.h".} - -proc queue_work*(loop: PLoop, req: PWork, work_cb: WorkProc, after_work_cb: AfterWorkProc): cint{. - importc: "uv_queue_work", header: "uv.h".} - -proc req_cleanup*(req: PFS){. - importc: "uv_fs_req_cleanup", header: "uv.h".} - -proc close*(loop: PLoop, req: PFS, file: File, cb: FsProc): cint{. - importc: "uv_fs_close", header: "uv.h".} - -proc open*(loop: PLoop, req: PFS, path: cstring, flags: cint, mode: cint, cb: FsProc): cint{. - importc: "uv_fs_open", header: "uv.h".} - -proc read*(loop: PLoop, req: PFS, file: File, buf: pointer, length: csize, offset: coff, cb: FsProc): cint{. - importc: "uv_fs_read", header: "uv.h".} - -proc unlink*(loop: PLoop, req: PFS, path: cstring, cb: FsProc): cint{. - importc: "uv_fs_unlink", header: "uv.h".} - -proc write*(loop: PLoop, req: PFS, file: File, buf: pointer, length: csize, offset: coff, cb: FsProc): cint{. - importc: "uv_fs_write", header: "uv.h".} - -proc mkdir*(loop: PLoop, req: PFS, path: cstring, mode: cint, cb: FsProc): cint{. - importc: "uv_fs_mkdir", header: "uv.h".} - -proc rmdir*(loop: PLoop, req: PFS, path: cstring, cb: FsProc): cint{. - importc: "uv_fs_rmdir", header: "uv.h".} - -proc readdir*(loop: PLoop, req: PFS, path: cstring, flags: cint, cb: FsProc): cint{. - importc: "uv_fs_readdir", header: "uv.h".} - -proc stat*(loop: PLoop, req: PFS, path: cstring, cb: FsProc): cint{. - importc: "uv_fs_stat", header: "uv.h".} - -proc fstat*(loop: PLoop, req: PFS, file: File, cb: FsProc): cint{. - importc: "uv_fs_fstat", header: "uv.h".} - -proc rename*(loop: PLoop, req: PFS, path: cstring, new_path: cstring, cb: FsProc): cint{. - importc: "uv_fs_rename", header: "uv.h".} - -proc fsync*(loop: PLoop, req: PFS, file: File, cb: FsProc): cint{. - importc: "uv_fs_fsync", header: "uv.h".} - -proc fdatasync*(loop: PLoop, req: PFS, file: File, cb: FsProc): cint{. - importc: "uv_fs_fdatasync", header: "uv.h".} - -proc ftruncate*(loop: PLoop, req: PFS, file: File, offset: coff, cb: FsProc): cint{. - importc: "uv_fs_ftruncate", header: "uv.h".} - -proc sendfile*(loop: PLoop, req: PFS, out_fd: File, in_fd: File, in_offset: coff, length: csize, cb: FsProc): cint{. - importc: "uv_fs_sendfile", header: "uv.h".} - -proc chmod*(loop: PLoop, req: PFS, path: cstring, mode: cint, cb: FsProc): cint{. - importc: "uv_fs_chmod", header: "uv.h".} - -proc utime*(loop: PLoop, req: PFS, path: cstring, atime: cdouble, mtime: cdouble, cb: FsProc): cint{. - importc: "uv_fs_utime", header: "uv.h".} - -proc futime*(loop: PLoop, req: PFS, file: File, atime: cdouble, mtime: cdouble, cb: FsProc): cint{. - importc: "uv_fs_futime", header: "uv.h".} - -proc lstat*(loop: PLoop, req: PFS, path: cstring, cb: FsProc): cint{. - importc: "uv_fs_lstat", header: "uv.h".} - -proc link*(loop: PLoop, req: PFS, path: cstring, new_path: cstring, cb: FsProc): cint{. - importc: "uv_fs_link", header: "uv.h".} - -proc symlink*(loop: PLoop, req: PFS, path: cstring, new_path: cstring, flags: cint, cb: FsProc): cint{. - importc: "uv_fs_symlink", header: "uv.h".} - -proc readlink*(loop: PLoop, req: PFS, path: cstring, cb: FsProc): cint{. - importc: "uv_fs_readlink", header: "uv.h".} - -proc fchmod*(loop: PLoop, req: PFS, file: File, mode: cint, cb: FsProc): cint{. - importc: "uv_fs_fchmod", header: "uv.h".} - -proc chown*(loop: PLoop, req: PFS, path: cstring, uid: cint, gid: cint, cb: FsProc): cint{. - importc: "uv_fs_chown", header: "uv.h".} - -proc fchown*(loop: PLoop, req: PFS, file: File, uid: cint, gid: cint, cb: FsProc): cint{. - importc: "uv_fs_fchown", header: "uv.h".} - -proc event_init*(loop: PLoop, handle: PFSEvent, filename: cstring, cb: FsEventProc): cint{. - importc: "uv_fs_event_init", header: "uv.h".} - -proc ip4_addr*(ip: cstring, port: cint): SockAddrIn{. - importc: "uv_ip4_addr", header: "uv.h".} - -proc ip6_addr*(ip: cstring, port: cint): TSockAddrIn6{. - importc: "uv_ip6_addr", header: "uv.h".} - -proc ip4_name*(src: ptr SockAddrIn, dst: cstring, size: csize): cint{. - importc: "uv_ip4_name", header: "uv.h".} - -proc ip6_name*(src: ptr TSockAddrIn6, dst: cstring, size: csize): cint{. - importc: "uv_ip6_name", header: "uv.h".} - -proc exepath*(buffer: cstring, size: var csize): cint{. - importc: "uv_exepath", header: "uv.h".} - -proc hrtime*(): uint64{. - importc: "uv_hrtime", header: "uv.h".} - -proc loadavg*(load: var array[0..2, cdouble]) {. - importc: "uv_loadavg", header: "uv.h"} - -proc get_free_memory*(): cdouble {. - importc: "uv_get_free_memory", header: "uv.h".} - -proc get_total_memory*(): cdouble {. - importc: "uv_get_total_memory", header: "uv.h".} - diff --git a/tests/parser/tletcolon.nim b/tests/parser/tletcolon.nim index eab7a8edd..7eaa5e3e5 100644 --- a/tests/parser/tletcolon.nim +++ b/tests/parser/tletcolon.nim @@ -4,7 +4,8 @@ discard """ 44 3 more body code yes -yes''' +yes +block expression works''' """ template x(body): untyped = @@ -50,3 +51,11 @@ let format = else: echo "Texture Format Unknown, assuming RGB" #This echo causes an error TextureInternalFormat.RGB + +# Block as expressions #3827 +block: + let x = block: + var y = 2 + echo "block expression works" + y*y + doAssert x == 4 \ No newline at end of file diff --git a/web/website.ini b/web/website.ini index 3274b0b6c..6c329a4f5 100644 --- a/web/website.ini +++ b/web/website.ini @@ -74,7 +74,7 @@ webdoc: "wrappers/mysql;wrappers/iup" webdoc: "wrappers/sqlite3;wrappers/postgres;wrappers/tinyc;wrappers/odbcsql" webdoc: "wrappers/pcre" webdoc: "wrappers/openssl" -webdoc: "wrappers/libuv;wrappers/joyent_http_parser" +webdoc: "wrappers/joyent_http_parser" webdoc: "posix/posix;wrappers/odbcsql" webdoc: "wrappers/libsvm.nim" |