- Sema zum Lowering-Pass umgebaut: typisiertes HIR (Slots, explizite Konvertierungsknoten) als Codegen-Eingabe; BYREF verlangt exakten Typ - Bytecode-Feindesign umgesetzt: monomorpher Opcode-Satz, .tbc-Container (Formatversion 1) mit eigenem Writer/Reader - Codegenerator HIR -> Bytecode (Fixup-Listen, keine globalen Passes) - TBVM-Interpreter: Kontrollfluss, GOSUB-Stack je Frame, BYREF/BYVAL, STATIC, DEF FN, DATA/READ/RESTORE, ON [LOCAL] ERROR/RESUME/ERR/ERL, Breakpoints/Einzelschritt/Inspektion, STOP fortsetzbar - Runtime-Scheibe: Host-Trait (Konsole/Capture), Builtin-Tabelle, Konvertierungsmatrix, PRINT-Formatierung/Druckzonen, Stringfunktionen - tbc run/build/check mit Exit-Codes nach Entscheidung D6 - Korpus-Harness (byte-genauer Vergleich) + 3 neue Korpusdateien (konvertierung, fehlerbehandlung, byref); 137 Tests gruen - Benchmarks: Einzelmodul 1,2 ms / Projekt 49.760 Zeilen 124 ms (Budgets eingehalten), VM ~5 Mio Schleifeniterationen/s - Doku fortgeschrieben (tbvm-design, sprachreferenz, PLAN); verlagerte Punkte als explizite Aufgaben in Phase 3 - OpenSpec-Change phase-2-bytecode-vm (27/27 Tasks) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
3.2 KiB
Purpose
Die BASIC-Fehlersemantik (ON ERROR GOTO, ON LOCAL ERROR, RESUME,
ERR/ERL) ist Teil des Kompatibilitätsvertrags: Programme des Vorbilds
verlassen sich auf Handler-Scoping, Propagation und Wiederaufnahme exakt
wie dokumentiert.
ADDED Requirements
Requirement: Handler-Scoping nach Vorbild
ON ERROR GOTO label SHALL einen modulweiten Handler aktivieren (auch
wenn die Anweisung in einer Prozedur steht); ON LOCAL ERROR GOTO label
SHALL einen prozedurlokalen Handler aktivieren, der den modulweiten für
die Dauer des Prozedurlaufs verdeckt. ON [LOCAL] ERROR GOTO 0
deaktiviert den jeweiligen Handler. Tritt ein Fehler in einer Prozedur
ohne zuständigen Handler auf, SHALL er die Aufrufkette hochpropagieren,
bis ein aktiver Handler gefunden ist; ohne Handler bricht das Programm
mit der Fehlermeldung und der Quellzeile ab.
Scenario: Modulweiter Handler fängt Prozedurfehler
- WHEN das Hauptprogramm
ON ERROR GOTO Fehlergesetzt hat und eine gerufene SUB Fehler 6 auslöst - THEN springt die Ausführung in den Handler
FehlerundERRist 6
Scenario: Lokaler Handler verdeckt modulweiten
- WHEN eine Prozedur
ON LOCAL ERROR GOTO Lgesetzt hat und in ihr ein Fehler auftritt - THEN behandelt
Lden Fehler, nicht der modulweite Handler
Scenario: Ohne Handler bricht das Programm ab
- WHEN Fehler 9 ohne aktiven Handler auftritt
- THEN endet das Programm mit der Meldung „Subscript out of range" und der Quellzeile
Requirement: ERR und ERL
Beim Eintritt in einen Handler SHALL ERR den Fehlercode liefern und
ERL die zuletzt vor dem Fehler ausgeführte numerische Zeilennummer
(0, wenn keine numerischen Zeilennummern durchlaufen wurden —
alphanumerische Labels zählen nicht). ERROR n SHALL Fehler n
künstlich auslösen und dieselbe Maschinerie durchlaufen.
Scenario: ERL bei Label-Programm
- WHEN ein Programm ohne numerische Zeilennummern einen Fehler behandelt
- THEN liefert
ERL0
Scenario: ERROR-Anweisung
- WHEN
ERROR 53bei aktivem Handler ausgeführt wird - THEN wird der Handler mit
ERR= 53 betreten
Requirement: RESUME-Semantik
Im Handler SHALL RESUME (bzw. RESUME 0) die fehlerauslösende
Anweisung wiederholen, RESUME NEXT mit der Anweisung danach
fortfahren und RESUME label an das Ziel springen. RESUME außerhalb
einer aktiven Fehlerbehandlung MUST Fehler 20 „RESUME without error"
auslösen. Nach RESUME gilt die Fehlerbehandlung als abgeschlossen
(ERR wird zurückgesetzt).
Scenario: RESUME NEXT
- WHEN ein Handler nach Fehler 11 (
Division by zero)RESUME NEXTausführt - THEN wird die auf die Division folgende Anweisung ausgeführt
Scenario: RESUME ohne Fehler
- WHEN
RESUMEaußerhalb eines Handlers ausgeführt wird - THEN tritt Laufzeitfehler 20 auf
Requirement: Fehler im Handler ist fatal
Tritt ein Fehler auf, während die Fehlerbehandlung aktiv ist (zwischen
Handler-Eintritt und RESUME), SHALL das Programm ohne erneute
Handler-Suche mit der Fehlermeldung abbrechen (keine Fehlerkaskaden,
Verhalten des Vorbilds).
Scenario: Kein Kaskadieren
- WHEN im aktiven Handler selbst Fehler 6 auftritt
- THEN bricht das Programm mit „Overflow" ab, auch wenn ein Handler registriert ist