MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 1 | GESCHUETZT |
| 2 | SYNOPSIS |
Zesstra | 5481d49 | 2021-04-08 20:07:06 +0200 | [diff] [blame^] | 3 | void set_this_object(object|lwobject objekt-an-stelle-von-originalobjekt) |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 4 | |
| 5 | BESCHREIBUNG |
| 6 | Dies ist eine geschuetzte Funktion, die nur vom Master-Objekt und im |
| 7 | Simul-Efun-Objekt genutzt werden darf. Bei sonstiger Benutzung |
| 8 | erzeugt diese Funktion einen Fehler. |
| 9 | |
| 10 | Die Funktion aendert das Resultat von this_object() in der laufenden |
| 11 | Funktion, ebenso das Resultat von previous_object() in Funktionen in |
| 12 | anderen Objekten, die einen call_other() Aufruf machen. |
| 13 | |
| 14 | Der Effekt von set_this_object() bleibt bestehen, bis ein externer |
Zesstra | d59c389 | 2019-11-28 20:53:39 +0100 | [diff] [blame] | 15 | Funktionsaufruf abgeschlossen ist oder bis zu einem erneuten Aufruf |
| 16 | von set_this_object(). Waehrend der Ausfuehrung von Code im |
| 17 | Master-Objekt oder im Simul-Efun-Objekt ist set_this_object() |
| 18 | garantiert, auch wenn this_object() durch set_this_object() |
| 19 | veraendert wird. Die gilt nicht fuer Funktionen, die aus anderen |
| 20 | Programmen geerbt werden. |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 21 | |
| 22 | Diese Funktion darf nur mit hoechster Sorgfalt verwendet werden, um |
| 23 | Inkonsistenzen zu vermeiden. Nach einem Aufruf von set_this_object() |
| 24 | koennen sich gewisse LPC-Konstrukte merkwuerdig verhalten oder gar |
| 25 | das System zum Absturz bringen. Insbesondere die Verwendung von |
| 26 | globalen Variablen oder der Aufruf von lokalen Funktionen (ausser |
| 27 | durch call_other()) ist unzulaessig und wird aktiv verhindert. |
| 28 | |
| 29 | Erlaubt sind call_other(), map(), der Zugriff auf lokale Variablen |
Zesstra | d59c389 | 2019-11-28 20:53:39 +0100 | [diff] [blame] | 30 | (die auch Pointers auf globale Arrays enthalten duerfen), einfache |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 31 | Arithmetik und der Zuweisungs-Operator. |
| 32 | |
Zesstra | d59c389 | 2019-11-28 20:53:39 +0100 | [diff] [blame] | 33 | FEHLER |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 34 | Es ist momentan nicht moeglich, das originale gueltige Objekt wieder |
| 35 | herzustellen. Anstelle von: |
| 36 | |
| 37 | object ich = this_object(); |
| 38 | set_this_object(dings); |
| 39 | <irgendwelcher Code> |
| 40 | set_this_object(ich); |
| 41 | <mehr Code> |
| 42 | |
| 43 | muss das ueber einen Umweg geloest werden: |
| 44 | |
Zesstra | d59c389 | 2019-11-28 20:53:39 +0100 | [diff] [blame] | 45 | private void tuwas(object dings) { |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 46 | set_this_object(dings); |
| 47 | <irgendwelcher code> |
| 48 | } |
| 49 | |
| 50 | funcall(#'tuwas, dings); |
| 51 | <mehr Code> |
| 52 | |
| 53 | Manche Leute bezeichnen das als Feature. |
| 54 | |
Zesstra | d59c389 | 2019-11-28 20:53:39 +0100 | [diff] [blame] | 55 | GESCHICHTE |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 56 | LDMud 3.2.10 verhindert aktiv die Referenz auf globale Variablen und |
Zesstra | d59c389 | 2019-11-28 20:53:39 +0100 | [diff] [blame] | 57 | Funktionsaufrufe nach Adresse, waehrend set_this_object() gilt. |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 58 | |
| 59 | SIEHE AUCH |
| 60 | this_object(E), set_this_player(E) |