nextCallContext method

Context nextCallContext(
  1. VFunction func,
  2. int argCount,
  3. bool gotSelf,
  4. Value? resultStorage,
)

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;
}