execute method

FutureOr<ASTValue> execute(
  1. String entryFunctionName,
  2. List? positionalParameters,
  3. Map? namedParameters, {
  4. ApolloExternalFunctionMapper? externalFunctionMapper,
  5. VMObject? classInstanceObject,
  6. Map<String, ASTValue>? classInstanceFields,
  7. VMTypeResolver? typeResolver,
})

Implementation

FutureOr<ASTValue> execute(
  String entryFunctionName,
  List? positionalParameters,
  Map? namedParameters, {
  ApolloExternalFunctionMapper? externalFunctionMapper,
  VMObject? classInstanceObject,
  Map<String, ASTValue>? classInstanceFields,
  VMTypeResolver? typeResolver,
}) async {
  var rootContext =
      await _initializeEntryPointBlock(externalFunctionMapper, typeResolver);

  ApolloExternalFunctionMapper? prevExternalFunctionMapper;
  if (externalFunctionMapper != null) {
    prevExternalFunctionMapper = rootContext.externalFunctionMapper;
    rootContext.externalFunctionMapper = externalFunctionMapper;
  }

  var prevContext = VMContext.setCurrent(rootContext);
  try {
    var fSignature =
        ASTFunctionSignature.from(positionalParameters, namedParameters);

    var f = getFunction(entryFunctionName, fSignature, rootContext,
        caseInsensitive: true);
    if (f == null) {
      throw ApolloVMRuntimeError(
          "Can't find entry function: $entryFunctionName");
    }

    var context = rootContext;

    if (!f.modifiers.isStatic) {
      if (this is ASTClass) {
        var clazz = this as ASTClass;
        var classContext = clazz._createContext(typeResolver, rootContext);
        var obj =
            (await clazz.createInstance(classContext, ASTRunStatus.dummy))!;

        if (classInstanceObject != null) {
          await clazz.setInstanceByVMObject(
              classContext, ASTRunStatus.dummy, obj, classInstanceObject);
        }

        if (classInstanceFields != null) {
          await clazz.setInstanceByMap(
              classContext, ASTRunStatus.dummy, obj, classInstanceFields);
        }

        classContext.setClassInstance(obj);
        context = classContext;
      } else {
        throw ApolloVMRuntimeError(
            "Can't call non-static function without a class context: $this");
      }
    }

    return await f.call(context,
        positionalParameters: positionalParameters,
        namedParameters: namedParameters);
  } finally {
    VMContext.setCurrent(prevContext);
    if (identical(
        rootContext.externalFunctionMapper, externalFunctionMapper)) {
      rootContext.externalFunctionMapper = prevExternalFunctionMapper;
    }
  }
}