restrict new relaxed named arguments to zscript >= 4.13

This commit is contained in:
Ricardo Luís Vaz Silva 2024-06-01 11:24:12 -03:00
parent 20cf8befbf
commit 461c2f77b7

View file

@ -9546,6 +9546,8 @@ FxExpression *FxVMFunctionCall::Resolve(FCompileContext& ctx)
unsigned implicit = Function->GetImplicitArgs(); unsigned implicit = Function->GetImplicitArgs();
bool relaxed_named_arugments = (ctx.Version >= MakeVersion(4, 13));
if (!CheckAccessibility(ctx.Version)) if (!CheckAccessibility(ctx.Version))
{ {
delete this; delete this;
@ -9613,25 +9615,43 @@ FxExpression *FxVMFunctionCall::Resolve(FCompileContext& ctx)
} }
else else
{ {
unsigned j;
FName name = static_cast<FxNamedNode *>(ArgList[i])->name; FName name = static_cast<FxNamedNode *>(ArgList[i])->name;
for (j = 0; j < count; j++) if(argnames[index + implicit] != name)
{ {
if (argnames[j + implicit] == name) unsigned j;
for (j = 0; j < count; j++)
{ {
// i don't think this needs any further optimization? if (argnames[j + implicit] == name)
// O(N^2) complexity technically but N isn't likely to be large, {
// and the check itself is just an int comparison, so it should be fine if(!relaxed_named_arugments && !(argflags[j + implicit] & VARF_Optional))
index = j; {
break; ScriptPosition.Message(MSG_ERROR, "Cannot use a named argument here - not all required arguments have been passed.");
}
else if(!relaxed_named_arugments && j < index)
{
ScriptPosition.Message(MSG_ERROR, "Named argument %s comes before current position in argument list.", name.GetChars());
}
// i don't think this needs any further optimization?
// O(N^2) complexity technically but N isn't likely to be large,
// and the check itself is just an int comparison, so it should be fine
index = j;
break;
}
}
if(j == count)
{
ScriptPosition.Message(MSG_ERROR, "Named argument %s not found.", name.GetChars());
delete this;
return nullptr;
} }
} }
else if(!relaxed_named_arugments && !(argflags[index + implicit] & VARF_Optional))
if(j == count)
{ {
ScriptPosition.Message(MSG_ERROR, "Named argument %s not found.", name.GetChars()); ScriptPosition.Message(MSG_ERROR, "Cannot use a named argument here - not all required arguments have been passed.");
delete this;
return nullptr;
} }
} }
} }