Save/Restore von Properties ins Objekt verlegt.
Bislang wurden die Properties von den sefun save_object() und
restore_object() objekt-extern verarbeitet, um gespeicherte
Properties zu selektieren und in eine Speicherform zu ueberfuehren.
Diese Aenderung verlegt dieses jetzt in das zu speichernde bzw.
zu restaurierende Objekt und die sefuns informieren dieses
lediglich.
Objektdaten sollen eigentlich soviel wie moeglich innerhalb des
Objektes verbleiben und nicht extern verarbeitet werden und so
wenig wie moeglich zu anderen Objekten gereicht werden.
Change-Id: I1df63b113425f2c8bdf17bbed8e819910a11dbd2
diff --git a/secure/simul_efun/spare/simul_efun.c b/secure/simul_efun/spare/simul_efun.c
index aa1f706..2b1c18c 100644
--- a/secure/simul_efun/spare/simul_efun.c
+++ b/secure/simul_efun/spare/simul_efun.c
@@ -902,29 +902,10 @@
}
}
- save = m_allocate(0, 2);
- properties = previous_object()->QueryProperties();
+ // prepare properties
+ previous_object()->_prop_prepare_save();
- if(mappingp(properties))
- {
- // delete all entries in mapping properties without SAVE flag!
- index = m_indices(properties);
- for(i = sizeof(index)-1; i>=0;i--)
- {
- if(properties[index[i], F_MODE] & SAVE)
- {
- save[index[i]] = properties[index[i]];
- save[index[i], F_MODE] =
- properties[index[i], F_MODE] &
- (~(SETMNOTFOUND|QUERYMNOTFOUND|QUERYCACHED|SETCACHED));
- }
- }
- }
- else save = ([]);
-
- // save object!
- previous_object()->_set_save_data(save);
- // format: wie definiert in config.h
+ // actual save object (format version: wie definiert in config.h)
if (stringp(name)) {
res = funcall(bind_lambda(#'efun::save_object, previous_object()), name,
__LIB__SAVE_FORMAT_VERSION__);
@@ -938,7 +919,7 @@
res = funcall(bind_lambda(#'efun::save_object, previous_object()),
__LIB__SAVE_FORMAT_VERSION__);
- previous_object()->_set_save_data(0);
+ previous_object()->_prop_finalize_save();
#ifdef IOSTATS
// Stats...
@@ -1002,36 +983,12 @@
}
}
- // get actual property settings (by create())
- properties = previous_object()->QueryProperties();
-
-// DEBUG(sprintf("RESTORE %O\n",name));
+ // DEBUG(sprintf("RESTORE %O\n",name));
// restore object
result=funcall(bind_lambda(#'efun::restore_object, previous_object()), name);
//'))
- //_get_save_data liefert tatsaechlich mixed zurueck, wenn das auch immer ein
- //mapping sein sollte.
- save = previous_object()->_get_save_data();
- if((save))
- {
- index = m_indices(save);
- for(i = sizeof(index)-1; i>=0; i--)
- {
- properties[index[i]] = save[index[i]];
- properties[index[i], F_MODE] = save[index[i], F_MODE]
- &~(SETCACHED|QUERYCACHED);
- }
- }
- else properties = ([]);
- // restore properties
- funcall(
- bind_lambda(
- unbound_lambda(({'arg}), //'})
- ({#'call_other,({#'this_object}),
- "SetProperties",'arg})),//')
- previous_object()),properties);
- previous_object()->_set_save_data(0);
+ previous_object()->_prop_finalize_restore();
#ifdef IOSTATS
// Stats...