Skip to content

Restore enclosing stream on popStream instead of clearing to main - #42

Merged
MahtraDR merged 1 commit into
elanthia-online:mainfrom
MahtraDR:fix/nested-stream-stack
Aug 6, 2026
Merged

Restore enclosing stream on popStream instead of clearing to main#42
MahtraDR merged 1 commit into
elanthia-online:mainfrom
MahtraDR:fix/nested-stream-stack

Conversation

@MahtraDR

@MahtraDR MahtraDR commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

Stream routing tracked the active stream with a single scalar that popStream always reset to nil (the main window). The GemStone/DR protocol nests streams, and asynchronous scripts (e.g. moonwatch repainting the moonWindow side stream) can inject a push/pop between a game stream's open and close. With a scalar pointer, that inner popStream closed the outer game stream, so its remaining text spilled into the main window and, in the reverse case, foreign content was stranded in the wrong window.

Add StreamStack: the stack of enclosing streams suspended while a nested stream is active. handle_stream_open pushes the previously active stream; handle_stream_close pops to resume it, falling back to the main window (nil) only when nothing is suspended. Unmatched pops can never underflow.

@current_stream keeps its role as the active stream, so all existing read sites are unchanged; only open/close mutate the nesting. Adds a StreamStack unit spec and nested-restoration coverage in the tag handler spec, and updates the one prior spec that asserted the old clear-to-nil behavior.

Stream routing tracked the active stream with a single scalar that
popStream always reset to nil (the main window). The GemStone/DR protocol
nests streams, and asynchronous scripts (e.g. moonwatch repainting the
moonWindow side stream) can inject a push/pop between a game stream's open
and close. With a scalar pointer, that inner popStream closed the *outer*
game stream, so its remaining text spilled into the main window and, in
the reverse case, foreign content was stranded in the wrong window.

Add StreamStack: the stack of enclosing streams suspended while a nested
stream is active. handle_stream_open pushes the previously active stream;
handle_stream_close pops to resume it, falling back to the main window
(nil) only when nothing is suspended. Unmatched pops can never underflow.

@current_stream keeps its role as the active stream, so all existing read
sites are unchanged; only open/close mutate the nesting. Adds a StreamStack
unit spec and nested-restoration coverage in the tag handler spec, and
updates the one prior spec that asserted the old clear-to-nil behavior.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@MahtraDR
MahtraDR merged commit 80b6fa0 into elanthia-online:main Aug 6, 2026
3 checks passed
@MahtraDR
MahtraDR deleted the fix/nested-stream-stack branch August 6, 2026 01:20
MahtraDR added a commit that referenced this pull request Aug 6, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant