Registrieren fremder lfuns verhindern.
Closures auf fremde/objekt-externe lfuns konnten angemeldet
werden, aber nicht wieder abgemeldet.
Ausserdem kann das zu Inkonsistenzen fuehren, da der Code
davon ausgeht, dass das nicht stattfindet.
Daher abfangen - wenn das sein muss, muss der Rest vom Code
angepasst werden.
Change-Id: Id07395bf48dcf10926ecc51b9c22f5d97d5e6ab1
diff --git a/p/service/padreic/mnpc/walk_master.c b/p/service/padreic/mnpc/walk_master.c
index 9be49fb..fedc26d 100644
--- a/p/service/padreic/mnpc/walk_master.c
+++ b/p/service/padreic/mnpc/walk_master.c
@@ -54,12 +54,7 @@
#define ERROR(x) raise_error(sprintf(x, previous_object()));
-// Man muss selbst darauf aufpassen, das sich ein NPC immer nur einmal
-// anmeldet, da sonst auch mehrere Paralelle Walk-Ketten laufen!!!
-// Am besten nie direkt sondern nur ueber einen Standardnpc benutzen.
-// Bemerkung: man kann hiermit andere Objekt registrieren. Aber nur das Objekt
-// selber kann spaeter seine Registrierung pruefen oder sich abmelden...
-// (Fraglich, ob das so gewollt ist.)
+// Am besten nicht direkt sondern nur ueber einen Standardnpc benutzen.
public varargs void RegisterWalker(int time, int rand, closure walk_closure)
{
// pruefen ob die Paramter zulaessig sind...
@@ -82,6 +77,14 @@
if (!func)
raise_error("RegisterWalker() call from Object without Walk() function.\n");
}
+ else
+ {
+ // Closures auf fremde lfuns fuehren zu Inkonsistenzen/Fehlers und man
+ // kann sie auch nicht wieder abmelden. Daher abfangen.
+ if (get_type_info(func, 2) != previous_object())
+ raise_error(sprintf("Anmeldung von Closures auf fremde lfuns ist nicht "
+ "erlaubt. Closure: %O\n",func));
+ }
if (!sizeof(clients)) {
set_heart_beat(1);
}