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

View File

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

View File

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