nextCallContext method
Get a context for the next call, which includes any parameter arguments that have been set.
Implementation
Context nextCallContext(
VFunction func,
int argCount,
bool gotSelf,
Value? resultStorage,
) {
final result = Context(func.code!);
result.resultStorage = resultStorage;
result.parent = this;
result.vm = vm;
/// Stuff arguments, stored in our 'args' stack,
/// into local variables corrersponding to parameter names.
/// As a special case, skip over the first parameter if it is named 'self'
/// and we were invoked with dot syntax.
final selfParam = (gotSelf &&
func.parameters.isNotEmpty &&
func.parameters[0].name == "self")
? 1
: 0;
for (int i = 0; i < argCount; i++) {
// Careful -- when we pop them off, they're in reverse order.
final argument = args!.removeLast();
final paramNum = argCount - 1 - i + selfParam;
if (paramNum >= func.parameters.length) {
throw TooManyArgumentsException();
}
final param = func.parameters[paramNum].name;
if (param == "self") {
result.self = argument;
} else {
result.setVar(param, argument);
}
}
// And fill in the rest with default values
for (var paramNum = argCount + selfParam;
paramNum < func.parameters.length;
paramNum++) {
result.setVar(
func.parameters[paramNum].name,
func.parameters[paramNum].defaultValue,
);
}
return result;
}