diff options
author | Andreas Rumpf <rumpf_a@web.de> | 2020-11-02 14:17:09 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-11-02 14:17:09 +0100 |
commit | dfd8a83f3557164fd41714c11c6f92b65eef9018 (patch) | |
tree | aa0fcff8f308e8b59137d28dd9e72f4883a69664 /lib/pure/asyncmacro.nim | |
parent | eb429988cd15555f2af35389d52256b06e00e900 (diff) | |
download | Nim-dfd8a83f3557164fd41714c11c6f92b65eef9018.tar.gz |
fixes #15804 (#15820)
* fixes #15804 * fix the existing test * add the testcase for #15804 Co-authored-by: narimiran <narimiran@disroot.org>
Diffstat (limited to 'lib/pure/asyncmacro.nim')
-rw-r--r-- | lib/pure/asyncmacro.nim | 21 |
1 files changed, 9 insertions, 12 deletions
diff --git a/lib/pure/asyncmacro.nim b/lib/pure/asyncmacro.nim index 65cf2f3b9..579e9fede 100644 --- a/lib/pure/asyncmacro.nim +++ b/lib/pure/asyncmacro.nim @@ -129,6 +129,15 @@ proc verifyReturnType(typeName: string, node: NimNode = nil) {.compileTime.} = error("Expected return type of 'Future' got '$1'" % typeName, node) +template await*(f: typed): untyped {.used.} = + static: + error "await expects Future[T], got " & $typeof(f) + +template await*[T](f: Future[T]): auto {.used.} = + var internalTmpFuture: FutureBase = f + yield internalTmpFuture + (cast[typeof(f)](internalTmpFuture)).read() + proc asyncSingleProc(prc: NimNode): NimNode {.compileTime.} = ## This macro transforms a single procedure into a closure iterator. ## The ``async`` macro supports a stmtList holding multiple async procedures. @@ -262,20 +271,8 @@ proc asyncSingleProc(prc: NimNode): NimNode {.compileTime.} = result.params[0] = parseExpr("owned(Future[void])") # based on the yglukhov's patch to chronos: https://github.com/status-im/nim-chronos/pull/47 - # however here the overloads are placed inside each expanded async - var awaitDefinition = quote: - template await(f: typed): untyped {.used.} = - static: - error "await expects Future[T], got " & $typeof(f) - - template await[T](f: Future[T]): auto {.used.} = - var internalTmpFuture: FutureBase = f - yield internalTmpFuture - (cast[type(f)](internalTmpFuture)).read() - if procBody.kind != nnkEmpty: body2.add quote do: - `awaitDefinition` `outerProcBody` result.body = body2 |