Lyx-Eigenheiten
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.
Die Sprache
| 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:
constattconst, und die Zuweisung ist:=, nicht=.- Reservierte Wortformen, die als Bezeichner nicht gehen:
layout, to, Set, u32, k32, f32.
- Groß- und Kleinschreibung zählt.
- Zeichenketten sind
pchar; Speicher wird überpeek*/poke*
angesprochen.
disposeruftDestroy.super.X()läuft die ganze Vererbungskette hoch (seit 1.1.2J).ClassName()liefert die echte Klasse, auch über eine Variable
des Basistyps (seit 1.1.3D). Es gibt nur die eigene Klasse — kein
''ClassParent'', kein ''InheritsFrom''.
Fallen, die Zeit gekostet haben
Caption speichert nur die Adresse
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.
Modulvariablen vor der ersten Verwendung
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.
Unbekanntes Feld wird still angenommen
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.
Zwei Methoden gleichen Namens
Ü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.
Vorwärtsverweis auf eine spätere Klasse
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.
Weitere
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''.
Compilerbefunde melden
Alles, was nach einem Compilerfehler aussieht, gehört als Ticket nach
https://github.com/SEOLizer/LyX-Compiler/issues
Was sich bewährt hat:
- Minimalfall beilegen — aber wenn fünf Nachbauten nicht auslösen,
war die Annahme über die Fundstelle falsch, nicht der Nachbau zu klein.
- Schreiben, was man ausschließen konnte. Das spart dem nächsten die
Sackgassen.
- Messreihen statt Eindrücken. „Alles bis 0xfb8 läuft, beides darüber
nicht“ ist ein Befund; „manchmal stürzt es ab„ ist keiner.
