Use frame cursors in stack introspection.
Introduced the framecursorref type. This is to solve performance problem when the stack is very deep. The API is still stateless, but a frame cursor is mutable. A frame cursor can only be created from a stack in the READY<Ts> state, may iterate downwards, and must be explicitly closed. Concurrent introspection that races with stack modification (pop frames/push frames/resuming a stack) has undefined behaviour. Also used "resumption point" to simplify the description of stack binding. The semantics is not changed. In the concrete syntax, resumption points are "beginning of function", "OSR point instruction" or "the appropriate place for native function". The Mu cases can be mapped to the resumption points in the formal model: entry of the %entry block, and the exit of the block where the OSR point instruction is in.
Showing with 264 additions and 115 deletions