Set(): switch umformuliert
Der switch enthielt multiple Fallthroughs und war schwer zu lesen.
Die Fallthroughs wurden entfernt, auch wenn jetzt ein Teil des Codes
dupliziert ist.
In Folge dessen auch folgende Verbesserungen:
1. (Zurueck-)Setzen von SETMAPPED verbessert, hier konnte u.U. ein
inkonsistenter Eintrag entstehen, wenn ein Laufzeitfehler auftrat.
2. kein Zulassen von nicht-closures als F_QUERY_METHOD oder F_SET_MAPPER
Change-Id: I6b346d9ca91b3b6c935d0213a8e8b27424d46bad
diff --git a/std/thing/properties.c b/std/thing/properties.c
index 4f5e18b..d910b41 100644
--- a/std/thing/properties.c
+++ b/std/thing/properties.c
@@ -140,40 +140,90 @@
switch(Type)
{
// Je nach Modus Flags veraendern
- case F_MODE_AS: prop[F_MODE][name]|= Value;
- return prop[F_MODE][name];
- case F_MODE_AD: prop[F_MODE][name]&= ~Value;
- if (!prop[F_MODE][name]) prop[F_MODE]-=([name]);
- return prop[F_MODE][name];
- case F_MODE: prop[F_MODE][name]^= Value;
- if (!prop[F_MODE][name]) prop[F_MODE]-=([name]);
- return prop[F_MODE][name];
+ case F_MODE_AS:
+ prop[F_MODE][name]|= Value;
+ return prop[F_MODE][name];
+ case F_MODE_AD:
+ prop[F_MODE][name]&= ~Value;
+ if (!prop[F_MODE][name]) prop[F_MODE]-=([name]);
+ return prop[F_MODE][name];
+ case F_MODE:
+ prop[F_MODE][name]^= Value;
+ if (!prop[F_MODE][name]) prop[F_MODE]-=([name]);
+ return prop[F_MODE][name];
- // Query- und Setmethoden laufen ab hier durch.
case F_SET_METHOD:
- case F_SET_MAPPER:
- // SETMAPPED passend setzen
- if (Type==F_SET_METHOD)
- prop[F_MODE][name] &= ~SETMAPPED;
- else
- prop[F_MODE][name] |= SETMAPPED;
- // Ab hier alles gleich
- // -1 als Setz-Methode: Nosetmethod setzen
+ if (!Value)
+ {
+ prop[Type]-=([name]);
+ break;
+ }
+ // Ungebundene Lambda_Closure? Heutzutage ein Fehler.
+ if (closurep(Value) && !query_closure_object(Value))
+ {
+ raise_error("Ungebundene Lambdas sind als Setmethoden "
+ "nicht mehr unterstuetzt.\n");
+ }
+ // -1 als Setz-Methode: Stattdessen NOSETMETHOD setzen (deprecated!)
if (Value == -1)
{
prop[F_SET_METHOD]-=([name]);
prop[F_MODE][name] |= NOSETMETHOD;
return 0;
}
- // Kein break! Rest wie Querymethod
+ // Zur Sicherheit SETMAPPED loeschen
+ prop[F_MODE][name] &= ~SETMAPPED;
+ prop[Type][name] = Value;
+ break;
+
+ case F_SET_MAPPER:
+ // Als Type F_SET_METHOD speichern/eintragen.
+ Type = F_SET_METHOD;
+ if (!Value)
+ {
+ prop[F_MODE][name] &= ~SETMAPPED;
+ prop[Type]-=([name]);
+ break;
+ }
+ // Da wir hier keine Ruecksicht auf historischen Kram nehmen muessen,
+ // werden nur Closures akzeptiert. Und auch keine -1 als Alias fuer
+ // NOSETMETHOD.
+ if (!closurep(Value))
+ {
+ raise_error("Fuer F_SET_MAPPER werden nur Closures unterstuetzt.\n");
+ }
+ // Und keine ungebundenen Lambda-Closures.
+ if (!query_closure_object(Value))
+ {
+ raise_error("Ungebundene Lambdas sind als Mapper "
+ "nicht unterstuetzt.\n");
+ }
+ // SETMAPPED setzen
+ prop[F_MODE][name] |= SETMAPPED;
+ prop[Type][name] = Value;
+ break;
+
case F_QUERY_METHOD:
- // Ungebundene Lambda_Closure? Heutzutage ein Fehler.
- if (closurep(Value) && !query_closure_object(Value))
+ if (!Value)
+ {
+ prop[Type]-=([name]);
+ break;
+ }
+ // Jetzt wirklich mal nen Fehler werfen und den Zopf abschneiden.
+ if (!closurep(Value))
+ {
+ raise_error("Fuer F_QUERY_METHOD werden nur noch Closures "
+ "unterstuetzt.\n");
+ }
+ // Ungebundene Lambda-Closure? Heutzutage ein Fehler.
+ if (!query_closure_object(Value))
{
raise_error("Ungebundene Lambdas sind als Querymethoden "
"nicht mehr unterstuetzt.\n");
}
- // Kein break!
+ prop[Type][name] = Value;
+ break;
+
default:
if (!Value) prop[Type]-=([name]);
else prop[Type][name] = Value;