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:

  • con statt const, 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 ü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 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.