Skip to content

Commit

Permalink
restrict new relaxed named arguments to zscript >= 4.13
Browse files Browse the repository at this point in the history
  • Loading branch information
RicardoLuis0 committed Jun 1, 2024
1 parent f4c35e1 commit 08620b1
Showing 1 changed file with 33 additions and 13 deletions.
46 changes: 33 additions & 13 deletions src/common/scripting/backend/codegen.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9546,6 +9546,8 @@ FxExpression *FxVMFunctionCall::Resolve(FCompileContext& ctx)

unsigned implicit = Function->GetImplicitArgs();

bool relaxed_named_arugments = (ctx.Version >= MakeVersion(4, 13));

if (!CheckAccessibility(ctx.Version))
{
delete this;
Expand Down Expand Up @@ -9613,25 +9615,43 @@ FxExpression *FxVMFunctionCall::Resolve(FCompileContext& ctx)
}
else
{
unsigned j;
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?
// 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 (argnames[j + implicit] == name)
{
if(!relaxed_named_arugments && !(argflags[j + implicit] & VARF_Optional))
{
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)
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))
{
ScriptPosition.Message(MSG_ERROR, "Named argument %s not found.", name.GetChars());
delete this;
return nullptr;
ScriptPosition.Message(MSG_ERROR, "Cannot use a named argument here - not all required arguments have been passed.");
}
}
}
Expand Down

0 comments on commit 08620b1

Please sign in to comment.