MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame^] | 1 | SYNOPSIS |
| 2 | object previous_object(); |
| 3 | object previous_object(int i); |
| 4 | |
| 5 | BESCHREIBUNG |
| 6 | Liefert einen Pointer auf das letzte Objekt, das einen Aufruf (mittels |
| 7 | call_other(), funcall() etc.) auf das aktuelle Objekt this_object() |
| 8 | gemacht hat. Wenn dieses aufrufende Objekt inzwischen zerstoert wurde, |
| 9 | liefert previous_object() 0. |
| 10 | Bei einem Aufruf einer eigenen Funktion durch ein Objekt bleibt das |
| 11 | bisherige previous_object() unveraendert. |
| 12 | |
| 13 | Wird das Argument <i> angegeben, so verfolgt previous_object() den |
| 14 | Aufruf <i> Stufen zurueck. Zum Beispiel liefert previous_object(1) das |
| 15 | aufrufende Objekt des aufrufenden Objekts. Fuer <i> muss gelten: |
| 16 | 0 <= i < call_stack_depth(). Ein Wert <i> < 0 liefert das erste |
| 17 | aufrufende Object zurueck. |
| 18 | |
| 19 | Es gibt einen wichtigen Spezialfall: in Funktionen, die vom Gamedriver |
| 20 | auf Grund eines externen Ereignises aufgerufen wurden (zum Beispiel |
| 21 | Kommandi, die mit add_action() definiert wurden), liefert |
| 22 | previous_object() this_object(), previous_object(0) hingegen 0. |
| 23 | |
| 24 | BEISPIEL |
| 25 | int sicherheitscheck() |
| 26 | { |
| 27 | object prev; |
| 28 | if(!(prev=previous_object())); |
| 29 | else if(getuid(prev)!=getuid(this_object())); |
| 30 | else if(geteuid(prev)!=geteuid(this_object())); |
| 31 | else return 1; |
| 32 | return 0; |
| 33 | } |
| 34 | void sensible_funktion() |
| 35 | { |
| 36 | if(!sicherheitscheck()) |
| 37 | return; |
| 38 | ... |
| 39 | } |
| 40 | |
| 41 | Diese Funktion zeigt, wie man ueberpruefen kann, ob der letzte Aufruf |
| 42 | einer Funktion im aktuellen Objekt sicher war, oder ob die |
| 43 | Verarbeitung abgebrochen werden sollte. |
| 44 | |
| 45 | FEHLER |
| 46 | Werte von <i> < 0 werden wie <i> == 0 behandelt - dies ist historisch. |
| 47 | |
| 48 | SIEHE AUCH |
| 49 | call_other(E), this_object(E), this_player(E) |
| 50 | caller_stack(E), caller_stack_depth(E), extern_call(E) |