Expose bindings values in during, onPublish, and onMessage

This commit is contained in:
Emery Hemingway 2023-08-01 11:03:47 +01:00
parent 9c5e26e8f1
commit ba2ea5d08b
3 changed files with 13 additions and 11 deletions

View File

@ -20,7 +20,7 @@ export patterns
export Actor, Assertion, Facet, Handle, Cap, Ref, Symbol, Turn, TurnAction,
`$`, addCallback, analyse, asyncCheck, bootDataspace,
facet, future, inFacet, message, newDataspace, onStop, publish,
retract, replace, run, spawn, stop, unembed, unpackLiterals
retract, replace, run, spawn, stop, stopActor, unembed, unpackLiterals
proc `!`*(typ: static typedesc): Pattern {.inline.} =
patterns.dropType(typ)
@ -99,8 +99,9 @@ proc wrapPublishHandler(turn, handler: NimNode): NimNode =
generateHandlerNodes(handler)
handleSym = ident"handle"
handlerSym = genSym(nskProc, "publish")
bindingsSym = ident"bindings"
quote do:
proc `handlerSym`(`turn`: var Turn; bindings: Assertion; `handleSym`: Handle) =
proc `handlerSym`(`turn`: var Turn; `bindingsSym`: Assertion; `handleSym`: Handle) =
`varSection`
if fromPreserve(`valuesSym`, bindings):
`publishBody`
@ -110,8 +111,9 @@ proc wrapMessageHandler(turn, handler: NimNode): NimNode =
(valuesSym, varSection, body) =
generateHandlerNodes(handler)
handlerSym = genSym(nskProc, "message")
bindingsSym = ident"bindings"
quote do:
proc `handlerSym`(`turn`: var Turn; bindings: Assertion) =
proc `handlerSym`(`turn`: var Turn; `bindingsSym`: Assertion) =
`varSection`
if fromPreserve(`valuesSym`, bindings):
`body`
@ -146,7 +148,7 @@ macro onPublish*(turn: untyped; ds: Cap; pattern: Pattern; handler: untyped) =
handlerProc = wrapPublishHandler(turn, handler)
handlerSym = handlerProc[0]
result = quote do:
if `pattern`.analyse.capturePaths.len != `argCount`:
if `argCount` != 0 and `pattern`.analyse.capturePaths.len != `argCount`:
raiseAssert($`pattern`.analyse.capturePaths.len & " values captured but handler has " & $`argCount` & " arguments")
`handlerProc`
discard observe(`turn`, `ds`, `pattern`, ClosureEntity(publishImpl: `handlerSym`))
@ -158,7 +160,7 @@ macro onMessage*(turn: untyped; ds: Cap; pattern: Pattern; handler: untyped) =
handlerProc = wrapMessageHandler(turn, handler)
handlerSym = handlerProc[0]
result = quote do:
if `pattern`.analyse.capturePaths.len != `argCount`:
if `argCount` != 0 and `pattern`.analyse.capturePaths.len != `argCount`:
raiseAssert($`pattern`.analyse.capturePaths.len & " values captured but handler has " & $`argCount` & " arguments")
`handlerProc`
discard observe(`turn`, `ds`, `pattern`, ClosureEntity(messageImpl: `handlerSym`))
@ -176,7 +178,7 @@ macro during*(turn: untyped; ds: Cap; pattern: Pattern; publishBody, retractBody
callbackProc = wrapDuringHandler(turn, publishBody, retractBody)
callbackSym = callbackProc[0]
result = quote do:
if `pattern`.analyse.capturePaths.len != `argCount`:
if `argCount` != 0 and `pattern`.analyse.capturePaths.len != `argCount`:
raiseAssert($`pattern`.analyse.capturePaths.len & " values captured but handler has " & $`argCount` & " arguments")
`callbackProc`
discard observe(`turn`, `ds`, `pattern`, during(`callbackSym`))
@ -184,11 +186,11 @@ macro during*(turn: untyped; ds: Cap; pattern: Pattern; publishBody, retractBody
macro during*(turn: untyped; ds: Cap; pattern: Pattern; publishBody: untyped) =
## Variant of `during` without a retract body.
let
argCount = argumentCount(publishBody)
`argCount` = argumentCount(publishBody)
callbackProc = wrapDuringHandler(turn, publishBody, nil)
callbackSym = callbackProc[0]
result = quote do:
if `pattern`.analyse.capturePaths.len != `argCount`:
if `argCount` != 0 and `pattern`.analyse.capturePaths.len != `argCount`:
raiseAssert($`pattern`.analyse.capturePaths.len & " values captured but handler has " & $`argCount` & " arguments")
`callbackProc`
discard observe(`turn`, `ds`, `pattern`, during(`callbackSym`))

View File

@ -75,7 +75,7 @@ type
Turn* = object # an object that should remain on the stack
facet: Facet
queues: Queues # a ref object that can outlive Turn
when defined(traceSyndicate):
when tracing:
desc: TurnDescription[void]
Facet* = ref FacetObj
@ -587,7 +587,7 @@ proc onStop*(facet: Facet; act: TurnAction) =
proc stopActor*(turn: var Turn) =
let actor = turn.facet.actor
enqueue(turn, turn.facet.actor.root) do (turn: var Turn):
enqueue(turn, actor.root) do (turn: var Turn):
terminate(actor, turn, nil)
proc freshen*(turn: var Turn, act: TurnAction) =

View File

@ -1,6 +1,6 @@
# Package
version = "20230726"
version = "20230801"
author = "Emery Hemingway"
description = "Syndicated actors for conversational concurrency"
license = "Unlicense"