fix: count subscript parameters in wrenMakeCallHandle for bracket signatures

Add missing loop to count underscore parameters in subscript operator signatures
starting with '['. Previously only counted parameters in parenthesized signatures,
causing incorrect arity for methods like `[_,_]` and `[_,_]=(_)`. Also adds
validation assertions for null and empty signatures, and extends test coverage
with unary, binary, subscript, and subscript-set operator call handles.
This commit is contained in:
Bob Nystrom
2016-05-04 13:29:44 +00:00
parent 1c08148cc8
commit d717f0f174
3 changed files with 66 additions and 4 deletions
+14 -3
View File
@@ -1197,16 +1197,27 @@ static WrenInterpretResult runInterpreter(WrenVM* vm, register ObjFiber* fiber)
WrenValue* wrenMakeCallHandle(WrenVM* vm, const char* signature)
{
ASSERT(signature != NULL, "Signature cannot be NULL.");
int signatureLength = (int)strlen(signature);
ASSERT(signatureLength > 0, "Signature cannot be empty.");
// Count the number parameters the method expects.
int numParams = 0;
if (signature[signatureLength - 1] == ')')
{
for (const char* s = signature + signatureLength - 2;
s > signature && *s != '('; s--)
for (int i = signatureLength - 1; i > 0 && signature[i] != '('; i--)
{
if (*s == '_') numParams++;
if (signature[i] == '_') numParams++;
}
}
// Count subscript arguments.
if (signature[0] == '[')
{
for (int i = 0; i < signatureLength && signature[i] != ']'; i++)
{
if (signature[i] == '_') numParams++;
}
}