Entferne Wiederherstellen von Properties
Diese Funktionalitaet ist schon lange extrem kaputt.
1. Es wird zwar nach Closures gefiltert, allerdings erst, nachdem das
Objekt zerstört wurde. Closures auf this_object() sind jetzt 0, damit
werden diese beim Wiederherstellen überschrieben.
2. Nach Objekten wird gar nicht gefiltert.
Diese Probleme sind quasi nicht zu fixen. Vor dem Zerstören filtern
bringt auch nichts, da nicht bekannt ist, welche Objekte oder Closures
im remove() noch mit zerstört werden.
Da die aktuelle Funktionsweise bei Fehlerhafter Anwendung Objekte
ernsthaft kaputtmachen kann (z.B. Waffen mit P_HIT_FUNC =
this_object()), ist sie auszubauen die beste Lösung.
Change-Id: I0b66fa0f9230cba44e3849713547de1f19c63cfe
diff --git a/std/shells/magier/upd.c b/std/shells/magier/upd.c
index ebee975..7482156 100644
--- a/std/shells/magier/upd.c
+++ b/std/shells/magier/upd.c
@@ -260,37 +260,6 @@
return ret;
}
-
-//
-// _illegal_closure(): ist closure in arg an objekt gebunden?
-// arg: closure(-array/mapping)
-// Rueckgabe: 0 wenn alles okay
-// 1 wenn closure geloescht werden muss
-//
-
-private int _illegal_closure( mixed arg )
-{
- int i, j;
- string *indices;
-
- if ( closurep(arg) && !objectp(query_closure_object(arg)) )
- return 1;
-
- if ( pointerp(arg) ){
- for ( i = sizeof(arg); i--; )
- if ( _illegal_closure(arg[i]) )
- return 1;
- }
- else if ( mappingp(arg) ){
- indices = m_indices(arg);
- for ( i = sizeof(indices); i--; )
- for ( j = get_type_info( arg, 1 ); j--; )
- if ( _illegal_closure(arg[indices[i], j]) )
- return 1;
- }
- return 0;
-}
-
//
// _make(): Update file
// file: Filename
@@ -361,24 +330,18 @@
mixed configdata;
int restore_config;
- // Wenn Objekt existiert, dann Inhalt und ggf. Daten aus Configure() oder
- // Props sichern:
+ // Wenn Objekt existiert, dann Inhalt und ggf. Daten aus Configure() sichern
if (obj)
{
- // im Fall UPD_C erfolgt _kein_ Auslesen und _keine_ Restauration
- // mittels Configure()
- if ( ! (flags & UPD_C ) )
+ catch(restore_config=call_resolved(&configdata,obj,
+ "Configure",0);
+ publish);
+ // Wenn UPD_CONF gesetzt wird, _muss_ das Objekt ein oeffentliches
+ // Configure() definieren, sonst erfolgt Abbruch.
+ if ((flags & UPD_CONF) && !restore_config)
{
- catch(restore_config=call_resolved(&configdata,obj,
- "Configure",0);
- publish);
- // Wenn UPD_CONF gesetzt wird, _muss_ das Objekt ein oeffentliches
- // Configure() definieren, sonst erfolgt Abbruch.
- if ((flags & UPD_CONF) && !restore_config)
- {
- printf("upd: %s: hat kein Configure(), Zerstoerung abgebrochen.\n",file);
- return RET_FAIL;
- }
+ printf("upd: %s: hat kein Configure(), Zerstoerung abgebrochen.\n",file);
+ return RET_FAIL;
}
if (!(flags&UPD_D)&&(flags&(UPD_L|UPD_R)))
{
@@ -404,10 +367,6 @@
inv=map( deep_inventory(obj), #'_save/*'*/, inv_saver )-({0});
}
env = environment(obj);
- if ( flags & UPD_C )
- {
- pro = ({mapping})(obj->QueryProperties());
- }
}
else inv = ({});
@@ -431,33 +390,12 @@
if ( obj = _reload( blue,inst,flags, &err ) )
msg += ", " + (inst ? "neu geclont" : "neu geladen");
-// Neu geladen: Properties wiederherstellen, Closures filtern
+// Neu geladen: Konfiguration wiederherstellen
if (!err)
{
if (!obj) obj = find_object(file);
- // Wenn gewuenscht, Props zurueckschreiben (hat Prioritaet vor
- // Configure(), weil explizit vom Magier angefordert).
- if ( pro && (flags & UPD_C) )
- {
- string *names;
-
- names = m_indices(pro);
-
- // Closures in (mittlerweile) zerstoerten Objekten
- // rausfiltern, damit die (hoffentlich korrekten) Closures
- // im neu geclonten Objekt erhalten bleiben
- for ( i = sizeof(names); i--; )
- if ( _illegal_closure(pro[names[i], F_VALUE]) ||
- _illegal_closure(pro[names[i], F_QUERY_METHOD]) ||
- _illegal_closure(pro[names[i], F_SET_METHOD]) )
- m_delete( pro, names[i] );
-
- ({mapping})obj->SetProperties(pro);
- msg += ", Properties gesetzt";
- }
- // Wenn kein UPD_C, wird ggf. das Ergebnis von Configure() wieder
- // uebergeben.
- else if (restore_config)
+ // Ggf. Ergebnis von Configure() uebergeben
+ if (restore_config)
{
int conf_res;
if (!catch(conf_res=({int})obj->Configure(configdata); publish)
@@ -517,11 +455,6 @@
args=parseargs(cmdline,&flags,UPD_OPTS,1);
if(flags==-1||!sizeof(args))
return USAGE("upd [-"+UPD_OPTS+"] <datei> [<datei> ..]");
- if ((flags & UPD_C) && (flags & UPD_CONF))
- {
- printf("upd: -c und -C gleichzeitig werden nicht unterstuetzt.\n");
- return 1;
- }
args=file_list(args,MODE_UPD,0,"/");
if(!sizeof(args)) return printf("upd: Keine passende Datei gefunden!\n"),1;