Verbesserung Kompiler
Informationen
- Kategorien: Kernel | Klassenformeln
- Version: 17.0.0.6231
- Veröffentlichungsdatum: Freitag, 13. Juni 2014
- Entwickler: Fischer
- Benötigt Datenbankänderung: Nein
- Betreff: Entity byref
Beschreibung
Bei einigen existierenden Projekten wurden von den Projektentwicklern Funktionen geschrieben, bei denen ein Argument vom Typ 'Entity' unnötigerweise als byref deklariert wurde. Beim Aufruf dieser Funktion wurde dann die (konstante) this-Variable übergeben, was normalerweise ein Fehler ist. Leider hat der Compiler zuvor diesen Fehler nicht erkannt und den Aufruf zugelassen.
Innerhalb der Funktion wird dann das Argument (das die this-Variablen der aufrufenden Funktion abbildet) selbst nicht verändert, nur evtl. Attribute des Entity. Der Inhalt der this-Variablen konstant, die Situation ist somit nicht kritisch.
Um diese Projekte noch kompilierbar zu halten, wird in diesem Fall nur eine passende Warnung ausgegeben. Die Sonderbehandlung dieser Situation wird nun sehr spezifisch durchgeführt, d.h. Änderungen der this-Variablen an anderer Stelle werden als Fehler behandelt (z.B. bei this = $r; ).
Zusätzlich wird bei Funktionen, die ein Argument byref deklarieren, dieses aber nie ändern, eine Warnung ausgegeben (da das byref dann unnötig ist).
Nochmal kurz zur Verdeutlichung, hier die typische Situation bei einigen Projekten:
function void DoSomethingWithEntity( byref ::Room $room ) // unnötige byref-Deklaration, Inhalt von $room wird in Funktion nicht verändert. { $room.Name_number = "X"; // verändert nur das Attribut des Entity, aber nicht den Inhalt der Variablen.
}
oncallfunction { // Fehler (wird ausnahmsweise akzeptiert, Warnung wird ausgegeben) // Die Situation ist nur deshalb unkritisch, weil Funktion DoSomethingWithEntity this (bzw. das Argument $room) nicht ändert. // DoSomethingWithEntity( this ); }
Und hier die kritische Situation:
function void DoSomethingWithEntity( byref ::Room $room ) // byref ist korrekt, die Funktion soll den geänderten Wert von $room zurückliefern { $room = CreateEntity( descr_of( $room) ); // ein neues Entity wird erzeugt und $room zugewiesen }
oncallfunction { var ::Room $r;
$r = this;
DoSomethingWithEntity( this ); // kritisch
if ( this != $r )
{
; // this wurde geändert !!!
}
}
Der Compiler weiß beim Übersetzen des Funktionsaufrufs nicht, was die aufgerufene Funktion genau macht. Er weiß nur, die Funktion KANN die übergebene Variable ändern (da byref deklariert).