From d105526fbc3593759e1a205c773f1b4be71e65ec Mon Sep 17 00:00:00 2001 From: Markus Mittendrein Date: Sun, 13 Feb 2022 22:40:18 +0100 Subject: #strict 3 DTCallback --- DTCallback.c | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) (limited to 'DTCallback.c') diff --git a/DTCallback.c b/DTCallback.c index 2c2e057..58f6403 100644 --- a/DTCallback.c +++ b/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,6 +58,17 @@ 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 @@ -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