summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--DTCallback.c27
1 files changed, 19 insertions, 8 deletions
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;
}