blob: 5c4a42df88b9d7bc10f33acf53ce78299cd787cd [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001GESCHUETZT
2SYNOPSIS
Zesstrad59c3892019-11-28 20:53:39 +01003 void set_this_object(object objekt-an-stelle-von-originalobjekt)
MG Mud User88f12472016-06-24 23:31:02 +02004
5BESCHREIBUNG
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
Zesstrad59c3892019-11-28 20:53:39 +010015 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 User88f12472016-06-24 23:31:02 +020021
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
Zesstrad59c3892019-11-28 20:53:39 +010030 (die auch Pointers auf globale Arrays enthalten duerfen), einfache
MG Mud User88f12472016-06-24 23:31:02 +020031 Arithmetik und der Zuweisungs-Operator.
32
Zesstrad59c3892019-11-28 20:53:39 +010033FEHLER
MG Mud User88f12472016-06-24 23:31:02 +020034 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
Zesstrad59c3892019-11-28 20:53:39 +010045 private void tuwas(object dings) {
MG Mud User88f12472016-06-24 23:31:02 +020046 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
Zesstrad59c3892019-11-28 20:53:39 +010055GESCHICHTE
MG Mud User88f12472016-06-24 23:31:02 +020056 LDMud 3.2.10 verhindert aktiv die Referenz auf globale Variablen und
Zesstrad59c3892019-11-28 20:53:39 +010057 Funktionsaufrufe nach Adresse, waehrend set_this_object() gilt.
MG Mud User88f12472016-06-24 23:31:02 +020058
59SIEHE AUCH
60 this_object(E), set_this_player(E)