file: job.t package: muf status: tentative
This function is used internally by ]signal
and kin to find handlers. It is not
normally called directly by the application
programmer, and may well change in future
releases. It is a specialCase hack tuned
specifically for the convenience of ]signal
and kin.
The [args] block is presumably the argument
block to be given to the selected handler(s). The
|getAllActiveHandlers[ does not modify
or inspect this block in any way, merely copies it
to be above the constructed [handlers] block.
The [handlers] block returned contains
k Events followed by k handlers,
pairs given originally to
]withHandlersDo{. Busy handler sets are
ignored: All handlers in the returned
[handlers] block are eligible to handle a
signal.
The lo and hi return values are
indices into the data stack delimiting the
Events portion of the
[handlers] block, such that
for i from lo below hi do{
i dupBth -> event
i k + dupBth -> handler
...
}
will correctly iterate over all event handler pairs, most recent bindings first.
Example:
Stack:
[ .err.warning :: ; | ]withHandlerDo{ [ | |getAllActiveHandlers[ }
Stack: [ #<event warning> #<c-fn _> | [ | 2 3 1
(Note: This example assumes an unrealistically simple runtime environment. Most actual Muq runtime environments will produce additional handlers if the example is run.)
Rationale: We fetch all active handlers in a block, rather than looping with a get-nth type function, because this reduces the work done from O(N^2) in the stack size to O(N) in the stack size. Probably not a major issue most of the time, but it is little if any extra work to avoid the possible O(N^2) blowup, and making the event system as efficient as practical may encourage its use.
Go to the first, previous, next, last section, table of contents.