From edd1359010ce32d5ff6a3b77fcb6bbe7e21b5703 Mon Sep 17 00:00:00 2001 From: Markus Mittendrein Date: Sun, 13 Feb 2022 21:13:36 +0100 Subject: Update to map based DTMenu --- System.c4g/DTCallback.c | 35 +++++++++++++++++++++++------------ 1 file changed, 23 insertions(+), 12 deletions(-) (limited to 'System.c4g/DTCallback.c') diff --git a/System.c4g/DTCallback.c b/System.c4g/DTCallback.c index 91730d2..58f6403 100644 --- a/System.c4g/DTCallback.c +++ b/System.c4g/DTCallback.c @@ -1,5 +1,5 @@ /*-- Extensible callback system --*/ -#strict 2 +#strict 3 static const CallbackTarget_Bind = -1; static const CallbackTarget_Global = -2; @@ -9,9 +9,9 @@ static const CallbackTarget_Scenario = -3; global func GlobalCallback(string name) { return [CallbackTarget_Global, name]; } global func ScenarioCallback(string name) { return [CallbackTarget_Scenario, name]; } -global func ObjectCallback(string name, bool fast, object target) { return [target || this || FatalError("ObjectCallback without target object"), name, fast]; } -global func DefinitionCallback(string name, bool fast, id target) { return [target || GetID() || FatalError("DefinitionCallback without target definition"), name, fast]; } -global func Callback(string name, target) { return [target || this || GetID() || CallbackTarget_Global, name]; } +global func ObjectCallback(string name, bool fast, object target) { return [target ?? this ?? FatalError("ObjectCallback without target object"), name, fast]; } +global func DefinitionCallback(string name, bool fast, id target) { return [target ?? GetID() ?? FatalError("DefinitionCallback without target definition"), name, fast]; } +global func Callback(string name, target) { return [target ?? this ?? GetID() ?? CallbackTarget_Global, name]; } global func BindCallback(callback, array binding) { return [CallbackTarget_Bind, callback, binding]; } static const BindCallback_Bind_Value = -1; @@ -58,13 +58,24 @@ global func CallA(callback, args, bool safe, array refs) return _inherited(callback, args, ...); } + args ??= []; + var i = GetLength(args) - 1; + for (; i >= 0; --i) + { + if (args[i] != nil) + { + break; + } + } + SetLength(args, i + 1); + var target = callback[0], function = callback[1]; if((GetType(target) == C4V_C4Object || GetType(target) == C4V_C4ID) && GetLength(callback) == 3 && callback[2] && (!refs || refs == []) && GetLength(args) <= 8) // fast callback { if(GetType(target) == C4V_C4Object) { - return ObjectCall(target, function, args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7]); + return PrivateCall(target, function, args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7]); } else if(GetType(target) == C4V_C4ID) { @@ -95,15 +106,15 @@ global func CallA(callback, args, bool safe, array refs) { if(pos > 0) { - argsStr = Format("%s, ", argsStr); + argsStr ..= ", "; } if(refs[pos]) { - argsStr = Format("%sScopedVar(%s)", argsStr, Serialize(arg)); + argsStr ..= Format("ScopedVar(%s)", Serialize(arg)); } else { - argsStr = Format("%s%s", argsStr, Serialize(arg)); + argsStr ..= Serialize(arg); } ++pos; } @@ -147,7 +158,7 @@ global func BindArgs_ArgumentArrayPart(array binding, array args, bool safe) } else { - return 0; + return nil; } } return ret; @@ -223,9 +234,9 @@ global func BindArgs(array binding, array args, bool safe, array& refs) global func GlobalEval(string code) { - var effect = AddEffect("IntGlobalEval", 0, 1); - var ret = EffectCall(0, effect, "Eval", code); - RemoveEffect(0, 0, effect); + var effect = AddEffect("IntGlobalEval", nil, 1); + var ret = EffectCall(nil, effect, "Eval", code); + RemoveEffect(nil, nil, effect); return ret; } -- cgit v1.2.3-54-g00ecf