Changed some asyncio macro code to use the new genSym.

This commit is contained in:
Dominik Picheta 2013-07-25 22:13:37 +01:00
commit c5ff9650f7
2 changed files with 30 additions and 21 deletions

View file

@ -839,22 +839,27 @@ proc len*(disp: PDispatcher): int =
# ---- Async macro # ---- Async macro
proc createRequestNode(varName, proc createRequestNode(varName,
reqArgs: string): PNimrodNode {.compiletime.} = reqArgs: string, sym: var PNimrodNode): PNimrodNode {.compiletime.} =
result = newNimNode(nnkStmtList) result = newNimNode(nnkStmtList)
var reqObj = parseExpr( sym = genSym(nskVar, varName)
"""var $# = PRequest($#)""" % var reqObj = newVarStmt(sym,
[varName, reqArgs]) parseExpr("PRequest($#)" % [reqArgs]))
result.add reqObj result.add reqObj
result.add parseExpr("yield $#" % [varName]) result.add newNimNode(nnkYieldStmt).add(sym)
# Check for exception # Check for exception
result.add parseStmt("if $1.hasException: raise $1.exc" % [varName]) result.add newIfStmt(
(newDotExpr(sym, newIdentNode("hasException")),
newNimNode(nnkRaiseStmt).add(
newDotExpr(sym, newIdentNode("exc")))))
echo treeRepr(result)
proc toYieldVar(n: PNimrodNode): seq[PNimrodNode] {.compiletime.} = proc toYieldVar(n: PNimrodNode): seq[PNimrodNode] {.compiletime.} =
## Transforms a var/let section ## Transforms a var/let section
## E.g: ## E.g:
## let client = await(accept(server)) ## let client = await(accept(server))
result = @[] result = @[]
let nameIdent = n[0][0].ident # Var name let nameIdent = n[0][0] # Var name
expectLen(n[0], 3) # IdentDefs expectLen(n[0], 3) # IdentDefs
let insideAwait = n[0][2][1] let insideAwait = n[0][2][1]
let reqCall = $insideAwait[0].ident let reqCall = $insideAwait[0].ident
@ -864,25 +869,26 @@ proc toYieldVar(n: PNimrodNode): seq[PNimrodNode] {.compiletime.} =
case reqCall.normalize case reqCall.normalize
of "accept": of "accept":
let acceptReqVar = "acceptReq" let acceptReqVar = "acceptReq"
# TODO: Random var names which do not conflict. or wait for gensym? var sym: PNimrodNode
result.add createRequestNode(acceptReqVar, result.add createRequestNode(acceptReqVar,
"socket: $#, kind: reqAccept, client: nil" % sockName) "socket: $#, kind: reqAccept, client: nil" % sockName, sym)
case n.kind case n.kind
of nnkLetSection: of nnkLetSection:
result.add parseExpr("let $# = $#.client" % [$nameIdent, acceptReqVar]) result.add newLetStmt(nameIdent, newDotExpr(sym, newIdentNode("client")))
of nnkVarSection: of nnkVarSection:
result.add parseExpr("var $# = $#.client" % [$nameIdent, acceptReqVar]) result.add newVarStmt(nameIdent, newDotExpr(sym, newIdentNode("client")))
else: error "Bad node kind in toYieldVar" else: error "Bad node kind in toYieldVar"
of "readline": of "readline":
let readReqVar = "readLineReq" let readReqVar = "readLineReq"
# TODO: Random var names which do not conflict. or wait for gensym? var sym: PNimrodNode
result.add createRequestNode(readReqVar, result.add createRequestNode(readReqVar,
"socket: $#, kind: reqReadLine, line: \"\"" % sockName) "socket: $#, kind: reqReadLine, line: \"\"" % sockName, sym)
case n.kind case n.kind
of nnkLetSection: of nnkLetSection:
result.add parseExpr("let $# = $#.line" % [$nameIdent, readReqVar]) result.add newLetStmt(nameIdent, newDotExpr(sym, newIdentNode("line")))
of nnkVarSection: of nnkVarSection:
result.add parseExpr("var $# = $#.line" % [$nameIdent, readReqVar]) result.add newVarStmt(nameIdent, newDotExpr(sym, newIdentNode("line")))
else: error "Bad node kind in toYieldVar" else: error "Bad node kind in toYieldVar"
else: else:
error(reqCall & " is not a valid async call") error(reqCall & " is not a valid async call")
@ -924,9 +930,10 @@ proc toYieldCall(n: PNimrodNode): seq[PNimrodNode] {.compileTime.} =
of "send": of "send":
let socketName = $n[1][1].ident let socketName = $n[1][1].ident
let toWrite = n[1][2] let toWrite = n[1][2]
var sym: PNimrodNode
result.add createRequestNode("sendReq", result.add createRequestNode("sendReq",
"socket: $#, kind: reqWrite, toWrite: $#" % "socket: $#, kind: reqWrite, toWrite: $#" %
[socketName, $(toWrite.toStrLit)]) [socketName, $(toWrite.toStrLit)], sym)
else: else:
result.add(transformCallWithArg(n)) result.add(transformCallWithArg(n))
# reqRegister # reqRegister
@ -987,13 +994,13 @@ proc declareArgsInBody(procName: string,
## Creates a local immutable var by casting the PRequest.param. ## Creates a local immutable var by casting the PRequest.param.
## Immutable vars are then defined as specified in the proc's params. ## Immutable vars are then defined as specified in the proc's params.
result = newNimNode(nnkStmtList) result = newNimNode(nnkStmtList)
result.add(parseExpr("let passedInParams = P$#ArgObject(x.param)" % procName)) var sym = genSym(ident = "passedInParams")
result.add newLetStmt(sym, parseExpr("P$#ArgObject(x.param)" % procName))
# Fields take the form ``dummy<i>``. # Fields take the form ``dummy<i>``.
for i in 1 .. formalParams.len-1: for i in 1 .. formalParams.len-1:
expectKind(formalParams[i], nnkIdentDefs) expectKind(formalParams[i], nnkIdentDefs)
result.add(parseExpr("let $1: $2 = passedInParams.$3" % result.add newLetStmt(formalParams[i][0],
[$formalParams[i][0].ident, $formalParams[i][1].ident, newDotExpr(sym, newIdentNode("dummy" & $i)))
"dummy" & $i]))
proc isDocumentation(n: PNimrodNode): bool {.compiletime.} = proc isDocumentation(n: PNimrodNode): bool {.compiletime.} =
## Determines whether this proc def is a docs stub. ## Determines whether this proc def is a docs stub.

View file

@ -7,6 +7,8 @@ proc processRequest(client: PAsyncSocket, test: string) {.async.} =
let line = await(readLine(client)) let line = await(readLine(client))
echo("Read: ", line) echo("Read: ", line)
await send(client, "Goodbye.\c\L")
await send(client, "Goodbye.\c\L")
await send(client, "Goodbye.\c\L") await send(client, "Goodbye.\c\L")
client.close() client.close()