Vor dem ersten Beitrag lesen. Die meisten Merkwürdigkeiten in Vegas Quelltext haben hier ihren Grund. Wer sie nicht kennt, „räumt auf„ und bricht dabei etwas.
| Was fehlt | Womit Vega arbeitet |
|---|---|
property | Paare aus GetX / SetX, gebündelt in IControlProps |
| Überladung | eindeutige Namen — IsSelected neben Selected |
| Methodenzeiger | freie Funktionen plus Funktionszeiger-Haken |
| Generics | TObjectList mit int64-Einträgen und Cast |
| Reflexion | Tabellen: Klassenregistry, Eigenschaftsregistry, Handler-Tabelle |
| zyklische Imports | Funktionszeiger-Haken, …Ptr-Felder als int64 |
| bedingte Übersetzung | getrennte Verzeichnisse im Include-Pfad |
Weitere Punkte:
con statt const, und die Zuweisung ist :=, nicht =.
layout, to, Set, u32, k32, f32.
pchar; Speicher wird über peek*/poke*angesprochen.
dispose ruft Destroy.super.X() läuft die ganze Vererbungskette hoch (seit 1.1.2J).ClassName() liefert die echte Klasse, auch über eine Variabledes Basistyps (seit 1.1.3D). Es gibt nur die eigene Klasse — kein
''ClassParent'', kein ''InheritsFrom''.
TControl.Caption und Hint halten einen pchar, keinen Text. In
der Bibliothek stehen dort Literale, die ewig leben. Wer eine Beschriftung
aus einem Puffer setzt und den Puffer freigibt, hat danach ein leeres
Label — und merkt es erst beim nächsten Zeichnen.
Der LFM-Lader legt deshalb jede solche Zeichenkette über LfmKeepString
in einen Vorrat, der die Formulare überlebt.
Eine Modulvariable, die nach ihrer ersten Verwendung deklariert wird, zerfiel still in zwei Variablen (lyxc #1665, behoben in 1.1.3D — die Reihenfolge spielt jetzt keine Rolle mehr). Der Schreibzugriff oben traf die eine, der Lesezugriff unten die andere.
Zusammen mit #1619 (globale Objektvariable ist nicht null) wurde daraus
ein Absturz beim Schließen jedes Dateidialogs. Gefunden hat ihn erst
ein –map-file.
tools/check-varorder.sh prüft das jetzt bei jedem Testlauf.
Stammte die Basisklasse aus einer anderen Unit, nahm lyxc eine
Zuweisung an ein nicht vorhandenes Feld stillschweigend an (#1666, behoben in
1.1.3D — es kommt jetzt unknown field). In
Vega trug TComboBox dadurch monatelang einen kopierten
Mehrfachauswahl-Block, dessen Felder es dort nie gab.
Bemerkbar machte sich das erst indirekt — als undefined function 'Get'
ohne Klasse und ohne Zeile, und die einzige Klasse, die den Namen
wirklich kannte, war eine andere. Vier Compilerversionen Suche an der
falschen Stelle.
tools/check-fields.sh prüft jetzt jeden self.X-Zugriff.
Übersetzte ohne Fehler (#1668, behoben in 1.1.3G — es kommt jetzt
Methode 'X' ist in TDing bereits deklariert), und die zuerst deklarierte
gewann. Wer
eine Methode überarbeitet und die neue Fassung unten anfügt — der übliche
Reflex —, bekommt stumm die alte. In TMemo lagen SetLines und
AddLine je doppelt; die neuere, bessere Fassung war toter Code.
tools/check-dupmethods.sh prüft das jetzt.
Innerhalb einer Unit liefert ein Feldzugriff auf eine später deklarierte
Klasse still 0, ein Methodenaufruf bricht ab (#1663, behoben in 1.1.3
— Klassenlayouts werden jetzt vorgezogen). Deshalb schiebt TToolBar
ihren Zustand in die Knöpfe, statt dass diese ihn holen.
PrintLn(x.ClassName()) gab bis lyxc 1.1.3O die Adresse aus —
der Typ des Methodenaufrufs stand bei der Auswahl der Print-Fassung
nicht zur Verfügung. Gemeldet als lyxc #1683 und **seit 1.1.4A behoben**
(nachgemessen). Mit älteren Compilern hilft eine ''pchar''-Zwischenvariable.
* ''peek32'' liefert **vorzeichenlos** — RECT-Felder können negativ sein.
* ''ExtensionOf'' liefert die Endung **mit** Punkt (''".ttf"'').
* Inline-Arrays von Klassen (''[64]TFoo'') speicherten Kopien statt
Referenzen (#1646, behoben in 1.1.2G). Vega benutzt seitdem
durchgehend ''TObjectList''.
Alles, was nach einem Compilerfehler aussieht, gehört als Ticket nach
https://github.com/SEOLizer/LyX-Compiler/issues
Was sich bewährt hat:
war die Annahme über die Fundstelle falsch, nicht der Nachbau zu klein.
Sackgassen.
nicht“ ist ein Befund; „manchmal stürzt es ab„ ist keiner.