From ba2ea5d08b9ad9c56f6cc976ddb4a2751721a642 Mon Sep 17 00:00:00 2001 From: Emery Hemingway Date: Tue, 1 Aug 2023 11:03:47 +0100 Subject: [PATCH] Expose bindings values in during, onPublish, and onMessage --- src/syndicate.nim | 18 ++++++++++-------- src/syndicate/actors.nim | 4 ++-- syndicate.nimble | 2 +- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/syndicate.nim b/src/syndicate.nim index 6075df5..5396b75 100644 --- a/src/syndicate.nim +++ b/src/syndicate.nim @@ -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`)) diff --git a/src/syndicate/actors.nim b/src/syndicate/actors.nim index d2bd59d..d8a3abb 100644 --- a/src/syndicate/actors.nim +++ b/src/syndicate/actors.nim @@ -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) = diff --git a/syndicate.nimble b/syndicate.nimble index 470108d..466769e 100644 --- a/syndicate.nimble +++ b/syndicate.nimble @@ -1,6 +1,6 @@ # Package -version = "20230726" +version = "20230801" author = "Emery Hemingway" description = "Syndicated actors for conversational concurrency" license = "Unlicense"