invoke method

dynamic invoke(
  1. String func, {
  2. bool ignoreUndefined = false,
  3. String? namespace,
  4. String? module,
  5. bool isConstructor = false,
  6. List positionalArgs = const [],
  7. Map<String, dynamic> namedArgs = const {},
})

Invoke a top level function defined in a certain namespace. It's possible to use this method to invoke a HTClass or HTNamedStruct name as a contruct call, you will get a HTInstance or HTStruct as return value.

Implementation

dynamic invoke(
  String func, {
  bool ignoreUndefined = false,
  String? namespace,
  String? module,
  bool isConstructor = false,
  List<dynamic> positionalArgs = const [],
  Map<String, dynamic> namedArgs = const {},
  // List<HTType> typeArgs = const [],
}) {
  try {
    stackTraceList.clear();
    final savedModuleName = _currentBytecodeModule.id;
    HTNamespace nsp;
    if (module != null) {
      nsp = globalNamespace;
      if (_currentBytecodeModule.id != module) {
        _currentBytecodeModule = cachedModules[module]!;
      }
      assert(_currentBytecodeModule.namespaces.isNotEmpty);
      nsp = _currentBytecodeModule.namespaces.values.last;
    } else {
      nsp = currentNamespace;
    }

    dynamic callee;
    if (namespace != null) {
      HTObject fromNsp = nsp.memberGet(namespace, isRecursive: true);
      callee = fromNsp.memberGet(func, ignoreUndefined: ignoreUndefined);
    } else {
      callee = nsp.memberGet(func,
          isRecursive: true, ignoreUndefined: ignoreUndefined);
    }
    if (callee == null) {
      if (ignoreUndefined == false) {
        throw HTError.callNullObject(func);
      } else if (ignoreUndefined == true) {
        if (config.debugMode) {
          print('${kConsoleColorYellow}hetu: $func is not defined.');
        }
      }
    } else {
      final result = _call(
        callee,
        positionalArgs: positionalArgs,
        namedArgs: namedArgs,
        // typeArgs: typeArgs,
      );
      if (_currentBytecodeModule.id != savedModuleName) {
        _currentBytecodeModule = cachedModules[savedModuleName]!;
      }
      return result;
    }
  } catch (error, stackTrace) {
    if (config.processError) {
      processError(error, stackTrace);
    } else {
      rethrow;
    }
  }
}