summaryrefslogtreecommitdiffstats
path: root/System.c4g/DTCallback.c
diff options
context:
space:
mode:
Diffstat (limited to 'System.c4g/DTCallback.c')
-rw-r--r--System.c4g/DTCallback.c35
1 files changed, 23 insertions, 12 deletions
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;
}