Ereigniszustellung und Hostgrenzen korrigieren und Change archivieren

This commit is contained in:
2026-09-05 19:15:31 +02:00
parent 57d6386a5a
commit 644a86212f
39 changed files with 2013 additions and 271 deletions

View File

@@ -6,8 +6,8 @@
//! oder das Zurücklesen per `SCREEN(z, s)` nicht transportieren
//! (Entscheidung 2026-09-03, D2).
//!
//! Host-Aufrufe dürfen blockieren; kooperative Zustellpunkte bringt erst die
//! Ereignisschleife der Forms-Engine (Phase 4).
//! Der Host besitzt Zeit und Warten; die VM liefert nur an kooperativen
//! Zustellpunkten aus.
use std::collections::VecDeque;
@@ -165,6 +165,12 @@ pub trait Host {
/// wenn nichts anliegt (Grundlage von `INKEY$`).
fn next_event(&mut self, blockierend: bool) -> Option<Ereignis>;
/// Wartet auf Eingabe oder eine absolute Deadline in `jetzt_ms`-Zeit.
/// `None` bedeutet: Deadline erreicht. Ohne Deadline wird bis zu einem
/// Ereignis (gegebenenfalls explizitem Eingabeende) gewartet. Virtuelle
/// Hosts steuern den Zeitfortschritt selbst; keine reale Rückfalluhr.
fn warten(&mut self, deadline_ms: Option<u64>) -> Option<Ereignis>;
/// Monotone Zeit in Millisekunden seit Programmstart.
///
/// Die Fälligkeit der Zeit-Traps rechnet die Laufzeit daraus aus; sie
@@ -260,6 +266,19 @@ impl Host for CaptureHost {
self.ereignisse.pop_front()
}
fn warten(&mut self, deadline_ms: Option<u64>) -> Option<Ereignis> {
if let Some(event) = self.next_event(false) {
return Some(event);
}
match deadline_ms {
Some(deadline) => {
self.uhr_ms = self.uhr_ms.max(deadline);
None
}
None => Some(Ereignis::Ende),
}
}
fn jetzt_ms(&mut self) -> u64 {
self.uhr_ms
}