Phase 4: Ereignisschleife und klassische Traps
This commit is contained in:
@@ -114,3 +114,44 @@ Programmbestandteil.
|
||||
#### Scenario: STOP im Runner
|
||||
- **WHEN** ein per `tbc run` gestartetes Programm `STOP` in Zeile 7 ausführt
|
||||
- **THEN** endet der Prozess mit Exit-Code ungleich 0 und die Meldung nennt Zeile 7
|
||||
|
||||
### Requirement: Ereigniszustellung an Anweisungsgrenzen
|
||||
Die VM SHALL an Anweisungsgrenzen prüfen, ob ein Ereignis zuzustellen
|
||||
ist, und in diesem Fall das `GOSUB`-Ziel des zugehörigen Traps
|
||||
ausführen. Der unterbrochene Zustand — Aufrufkette, Schleifen, Locals,
|
||||
`GOSUB`-Stapel und Fehlerzustand — MUST dabei erhalten bleiben; mit
|
||||
`RETURN` SHALL die Ausführung an der unterbrochenen Stelle fortfahren.
|
||||
Die Prüfung MUST NOT pro Opcode erfolgen; solange kein Trap definiert ist,
|
||||
MUST sie auf einen einzelnen Test hinauslaufen und MUST NOT die Uhr lesen.
|
||||
|
||||
#### Scenario: Trap aus einer Prozedur heraus
|
||||
- **WHEN** ein Ereignis zugestellt wird, während eine `SUB` läuft, und das Trap-Ziel im Modulrumpf liegt
|
||||
- **THEN** läuft der Handler und nach `RETURN` setzt die `SUB` an der unterbrochenen Anweisung fort
|
||||
|
||||
#### Scenario: Ohne aktiven Trap wird die Uhr nicht gelesen
|
||||
- **WHEN** ein Programm ohne jede `ON …`-Trap-Definition ausgeführt wird
|
||||
- **THEN** fragt die Ausführung an keiner Anweisungsgrenze die Zeit ab, und der Durchsatz bleibt im Rahmen der Messgenauigkeit unverändert
|
||||
|
||||
### Requirement: Jede Schleife trägt eine Anweisungsgrenze im Kreis
|
||||
Der zurückspringende Zweig jeder Schleife (`FOR`/`NEXT`, `WHILE`/`WEND`,
|
||||
`DO`/`LOOP` in allen Bedingungsformen) MUST über mindestens eine
|
||||
Anweisungsgrenze führen, auch wenn der Schleifenrumpf leer ist. Andernfalls
|
||||
gäbe es in einer Warteschleife keinen Zustellpunkt: kein Ereignis, kein
|
||||
Breakpoint und kein Abbruch würden dort wirken.
|
||||
|
||||
#### Scenario: Leere Warteschleife
|
||||
- **WHEN** `FOR i% = 1 TO 10000` unmittelbar von `NEXT` gefolgt wird
|
||||
- **THEN** führt der Rücksprung über eine Anweisungsgrenze und ein aktiver Zeit-Trap wird darin zugestellt
|
||||
|
||||
#### Scenario: Leere Schleife in jeder Form
|
||||
- **WHEN** eine `WHILE`/`WEND`-, `DO WHILE`/`LOOP`- oder `DO`/`LOOP UNTIL`-Schleife ohne Rumpf übersetzt wird
|
||||
- **THEN** liegt zwischen Rücksprungziel und Rücksprung eine Anweisungsgrenze
|
||||
|
||||
### Requirement: DOEVENTS gibt die Kontrolle ab
|
||||
`DOEVENTS` SHALL anstehende Ereignisse zustellen und danach einen Wert
|
||||
liefern. Solange keine Formulare geladen werden können, SHALL der Wert 0
|
||||
sein.
|
||||
|
||||
#### Scenario: DOEVENTS in einer Warteschleife
|
||||
- **WHEN** ein Programm in einer Schleife `DOEVENTS` aufruft und ein Trap fällig wird
|
||||
- **THEN** läuft der Handler innerhalb dieser Schleife
|
||||
|
||||
Reference in New Issue
Block a user