This module implements generator logic for the VM. Generators are functions used during evaluation which can suspend their execution during their control flow, and request that the VM do something.
This is used to keep the VM’s stack size constant even when evaluating deeply nested recursive data structures.
We implement generators using the
- This is a generator which stores its state on the heap.
- Messages that can be sent from generators to the VM. In most cases, the VM will suspend the generator when receiving a message and enter some other frame to process the request.
- Responses returned to generators from the VM.
- Emit a runtime warning with the span of the current generator.
- Helper function to provide type annotations which are otherwise difficult to infer.
- Call the given value as a callable. The argument(s) must already be prepared on the stack.
- Helper function to call the given value with the provided list of arguments. This uses the StackPush and Call messages under the hood.
- Deep-force any value and return the evaluated result from the VM.
- Force any value and return the evaluated result from the VM.
- Request that the VM pop a value from the stack and return it to the generator.
- Request that the VM place the given value on its stack.