// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// This file has been automatically generated. Please do not edit it manually.
// To regenerate the file, use the following command
// "generate_ffi_boilerplate.py".

import 'dart:async';
import 'dart:convert';
import 'dart:ffi';
import 'dart:io';
import 'dart:typed_data';
import 'package:ffi/ffi.dart';
import 'package:path/path.dart' as path;
import 'wasmer_api.dart';

class WasmImportDescriptor {
  int kind;
  String moduleName;
  String name;
  Pointer<WasmerFunctype> funcType;
  WasmImportDescriptor(this.kind, this.moduleName, this.name, this.funcType);

  String toString() {
    var kindName = wasmerExternKindName(kind);
    if (kind == WasmerExternKindFunction) {
      var runtime = WasmRuntime();
      var sig = WasmRuntime.getSignatureString("${moduleName}::${name}",
          runtime.getArgTypes(funcType), runtime.getReturnType(funcType));
      return "$kindName: $sig";
    } else {
      return "$kindName: ${moduleName}::${name}";
    }
  }
}

class WasmExportDescriptor {
  int kind;
  String name;
  Pointer<WasmerFunctype> funcType;
  WasmExportDescriptor(this.kind, this.name, this.funcType);

  String toString() {
    var kindName = wasmerExternKindName(kind);
    if (kind == WasmerExternKindFunction) {
      var runtime = WasmRuntime();
      var sig = WasmRuntime.getSignatureString(
          name, runtime.getArgTypes(funcType), runtime.getReturnType(funcType));
      return "$kindName: $sig";
    } else {
      return "$kindName: ${name}";
    }
  }
}

class WasmRuntime {
  static WasmRuntime? _inst;

  DynamicLibrary _lib;
  late Pointer<WasmerEngine> _engine;
  late WasmerWasiConfigInheritStderrFn _wasi_config_inherit_stderr;
  late WasmerWasiConfigInheritStdoutFn _wasi_config_inherit_stdout;
  late WasmerWasiConfigNewFn _wasi_config_new;
  late WasmerWasiEnvDeleteFn _wasi_env_delete;
  late WasmerWasiEnvNewFn _wasi_env_new;
  late WasmerWasiEnvReadStderrFn _wasi_env_read_stderr;
  late WasmerWasiEnvReadStdoutFn _wasi_env_read_stdout;
  late WasmerWasiEnvSetMemoryFn _wasi_env_set_memory;
  late WasmerWasiGetImportsFn _wasi_get_imports;
  late WasmerByteVecDeleteFn _byte_vec_delete;
  late WasmerByteVecNewFn _byte_vec_new;
  late WasmerByteVecNewEmptyFn _byte_vec_new_empty;
  late WasmerByteVecNewUninitializedFn _byte_vec_new_uninitialized;
  late WasmerEngineDeleteFn _engine_delete;
  late WasmerEngineNewFn _engine_new;
  late WasmerExporttypeNameFn _exporttype_name;
  late WasmerExporttypeTypeFn _exporttype_type;
  late WasmerExporttypeVecDeleteFn _exporttype_vec_delete;
  late WasmerExporttypeVecNewFn _exporttype_vec_new;
  late WasmerExporttypeVecNewEmptyFn _exporttype_vec_new_empty;
  late WasmerExporttypeVecNewUninitializedFn _exporttype_vec_new_uninitialized;
  late WasmerExternAsFuncFn _extern_as_func;
  late WasmerExternAsMemoryFn _extern_as_memory;
  late WasmerExternDeleteFn _extern_delete;
  late WasmerExternKindFn _extern_kind;
  late WasmerExternVecDeleteFn _extern_vec_delete;
  late WasmerExternVecNewFn _extern_vec_new;
  late WasmerExternVecNewEmptyFn _extern_vec_new_empty;
  late WasmerExternVecNewUninitializedFn _extern_vec_new_uninitialized;
  late WasmerExterntypeAsFunctypeFn _externtype_as_functype;
  late WasmerExterntypeDeleteFn _externtype_delete;
  late WasmerExterntypeKindFn _externtype_kind;
  late WasmerFuncAsExternFn _func_as_extern;
  late WasmerFuncCallFn _func_call;
  late WasmerFuncDeleteFn _func_delete;
  late WasmerFuncNewWithEnvFn _func_new_with_env;
  late WasmerFunctypeDeleteFn _functype_delete;
  late WasmerFunctypeParamsFn _functype_params;
  late WasmerFunctypeResultsFn _functype_results;
  late WasmerImporttypeModuleFn _importtype_module;
  late WasmerImporttypeNameFn _importtype_name;
  late WasmerImporttypeTypeFn _importtype_type;
  late WasmerImporttypeVecDeleteFn _importtype_vec_delete;
  late WasmerImporttypeVecNewFn _importtype_vec_new;
  late WasmerImporttypeVecNewEmptyFn _importtype_vec_new_empty;
  late WasmerImporttypeVecNewUninitializedFn _importtype_vec_new_uninitialized;
  late WasmerInstanceDeleteFn _instance_delete;
  late WasmerInstanceExportsFn _instance_exports;
  late WasmerInstanceNewFn _instance_new;
  late WasmerMemoryAsExternFn _memory_as_extern;
  late WasmerMemoryDataFn _memory_data;
  late WasmerMemoryDataSizeFn _memory_data_size;
  late WasmerMemoryDeleteFn _memory_delete;
  late WasmerMemoryGrowFn _memory_grow;
  late WasmerMemoryNewFn _memory_new;
  late WasmerMemorySizeFn _memory_size;
  late WasmerMemorytypeDeleteFn _memorytype_delete;
  late WasmerMemorytypeNewFn _memorytype_new;
  late WasmerModuleDeleteFn _module_delete;
  late WasmerModuleExportsFn _module_exports;
  late WasmerModuleImportsFn _module_imports;
  late WasmerModuleNewFn _module_new;
  late WasmerStoreDeleteFn _store_delete;
  late WasmerStoreNewFn _store_new;
  late WasmerTrapDeleteFn _trap_delete;
  late WasmerValtypeDeleteFn _valtype_delete;
  late WasmerValtypeKindFn _valtype_kind;
  late WasmerValtypeVecDeleteFn _valtype_vec_delete;
  late WasmerValtypeVecNewFn _valtype_vec_new;
  late WasmerValtypeVecNewEmptyFn _valtype_vec_new_empty;
  late WasmerValtypeVecNewUninitializedFn _valtype_vec_new_uninitialized;
  late WasmerWasmerLastErrorLengthFn _wasmer_last_error_length;
  late WasmerWasmerLastErrorMessageFn _wasmer_last_error_message;

  factory WasmRuntime() {
    return _inst ??= WasmRuntime._init();
  }

  static String _getLibName() {
    if (Platform.isMacOS) return "libwasmer.dylib";
    if (Platform.isLinux) return "libwasmer.so";
    // TODO(dartbug.com/37882): Support more platforms.
    throw Exception("Wasm not currently supported on this platform");
  }

  static String _getLibDir() {
    // The common case, and how cli_util.dart computes the Dart SDK directory,
    // path.dirname called twice on Platform.resolvedExecutable.
    var commonLibDir = path.join(
        path.absolute(path.dirname(path.dirname(Platform.resolvedExecutable))),
        'bin',
        'third_party',
        'wasmer');
    if (Directory(commonLibDir).existsSync()) {
      return commonLibDir;
    }

    // This is the less common case where the user is in the checked out Dart
    // SDK, and is executing dart via:
    // ./out/ReleaseX64/dart ...
    var checkedOutLibDir = path.join(
        path.absolute(path.dirname(Platform.resolvedExecutable)),
        'dart-sdk',
        'bin',
        'third_party',
        'wasmer');
    if (Directory(checkedOutLibDir).existsSync()) {
      return checkedOutLibDir;
    }

    // If neither returned above, we return the common case:
    return commonLibDir;
  }

  WasmRuntime._init()
      : _lib = DynamicLibrary.open(path.join(_getLibDir(), _getLibName())) {
    _wasi_config_inherit_stderr = _lib.lookupFunction<
        NativeWasmerWasiConfigInheritStderrFn,
        WasmerWasiConfigInheritStderrFn>('wasi_config_inherit_stderr');
    _wasi_config_inherit_stdout = _lib.lookupFunction<
        NativeWasmerWasiConfigInheritStdoutFn,
        WasmerWasiConfigInheritStdoutFn>('wasi_config_inherit_stdout');
    _wasi_config_new =
        _lib.lookupFunction<NativeWasmerWasiConfigNewFn, WasmerWasiConfigNewFn>(
            'wasi_config_new');
    _wasi_env_delete =
        _lib.lookupFunction<NativeWasmerWasiEnvDeleteFn, WasmerWasiEnvDeleteFn>(
            'wasi_env_delete');
    _wasi_env_new =
        _lib.lookupFunction<NativeWasmerWasiEnvNewFn, WasmerWasiEnvNewFn>(
            'wasi_env_new');
    _wasi_env_read_stderr = _lib.lookupFunction<NativeWasmerWasiEnvReadStderrFn,
        WasmerWasiEnvReadStderrFn>('wasi_env_read_stderr');
    _wasi_env_read_stdout = _lib.lookupFunction<NativeWasmerWasiEnvReadStdoutFn,
        WasmerWasiEnvReadStdoutFn>('wasi_env_read_stdout');
    _wasi_env_set_memory = _lib.lookupFunction<NativeWasmerWasiEnvSetMemoryFn,
        WasmerWasiEnvSetMemoryFn>('wasi_env_set_memory');
    _wasi_get_imports = _lib.lookupFunction<NativeWasmerWasiGetImportsFn,
        WasmerWasiGetImportsFn>('wasi_get_imports');
    _byte_vec_delete =
        _lib.lookupFunction<NativeWasmerByteVecDeleteFn, WasmerByteVecDeleteFn>(
            'wasm_byte_vec_delete');
    _byte_vec_new =
        _lib.lookupFunction<NativeWasmerByteVecNewFn, WasmerByteVecNewFn>(
            'wasm_byte_vec_new');
    _byte_vec_new_empty = _lib.lookupFunction<NativeWasmerByteVecNewEmptyFn,
        WasmerByteVecNewEmptyFn>('wasm_byte_vec_new_empty');
    _byte_vec_new_uninitialized = _lib.lookupFunction<
        NativeWasmerByteVecNewUninitializedFn,
        WasmerByteVecNewUninitializedFn>('wasm_byte_vec_new_uninitialized');
    _engine_delete =
        _lib.lookupFunction<NativeWasmerEngineDeleteFn, WasmerEngineDeleteFn>(
            'wasm_engine_delete');
    _engine_new =
        _lib.lookupFunction<NativeWasmerEngineNewFn, WasmerEngineNewFn>(
            'wasm_engine_new');
    _exporttype_name = _lib.lookupFunction<NativeWasmerExporttypeNameFn,
        WasmerExporttypeNameFn>('wasm_exporttype_name');
    _exporttype_type = _lib.lookupFunction<NativeWasmerExporttypeTypeFn,
        WasmerExporttypeTypeFn>('wasm_exporttype_type');
    _exporttype_vec_delete = _lib.lookupFunction<
        NativeWasmerExporttypeVecDeleteFn,
        WasmerExporttypeVecDeleteFn>('wasm_exporttype_vec_delete');
    _exporttype_vec_new = _lib.lookupFunction<NativeWasmerExporttypeVecNewFn,
        WasmerExporttypeVecNewFn>('wasm_exporttype_vec_new');
    _exporttype_vec_new_empty = _lib.lookupFunction<
        NativeWasmerExporttypeVecNewEmptyFn,
        WasmerExporttypeVecNewEmptyFn>('wasm_exporttype_vec_new_empty');
    _exporttype_vec_new_uninitialized = _lib.lookupFunction<
            NativeWasmerExporttypeVecNewUninitializedFn,
            WasmerExporttypeVecNewUninitializedFn>(
        'wasm_exporttype_vec_new_uninitialized');
    _extern_as_func =
        _lib.lookupFunction<NativeWasmerExternAsFuncFn, WasmerExternAsFuncFn>(
            'wasm_extern_as_func');
    _extern_as_memory = _lib.lookupFunction<NativeWasmerExternAsMemoryFn,
        WasmerExternAsMemoryFn>('wasm_extern_as_memory');
    _extern_delete =
        _lib.lookupFunction<NativeWasmerExternDeleteFn, WasmerExternDeleteFn>(
            'wasm_extern_delete');
    _extern_kind =
        _lib.lookupFunction<NativeWasmerExternKindFn, WasmerExternKindFn>(
            'wasm_extern_kind');
    _extern_vec_delete = _lib.lookupFunction<NativeWasmerExternVecDeleteFn,
        WasmerExternVecDeleteFn>('wasm_extern_vec_delete');
    _extern_vec_new =
        _lib.lookupFunction<NativeWasmerExternVecNewFn, WasmerExternVecNewFn>(
            'wasm_extern_vec_new');
    _extern_vec_new_empty = _lib.lookupFunction<NativeWasmerExternVecNewEmptyFn,
        WasmerExternVecNewEmptyFn>('wasm_extern_vec_new_empty');
    _extern_vec_new_uninitialized = _lib.lookupFunction<
        NativeWasmerExternVecNewUninitializedFn,
        WasmerExternVecNewUninitializedFn>('wasm_extern_vec_new_uninitialized');
    _externtype_as_functype = _lib.lookupFunction<
        NativeWasmerExterntypeAsFunctypeFn,
        WasmerExterntypeAsFunctypeFn>('wasm_externtype_as_functype');
    _externtype_delete = _lib.lookupFunction<NativeWasmerExterntypeDeleteFn,
        WasmerExterntypeDeleteFn>('wasm_externtype_delete');
    _externtype_kind = _lib.lookupFunction<NativeWasmerExterntypeKindFn,
        WasmerExterntypeKindFn>('wasm_externtype_kind');
    _func_as_extern =
        _lib.lookupFunction<NativeWasmerFuncAsExternFn, WasmerFuncAsExternFn>(
            'wasm_func_as_extern');
    _func_call = _lib.lookupFunction<NativeWasmerFuncCallFn, WasmerFuncCallFn>(
        'wasm_func_call');
    _func_delete =
        _lib.lookupFunction<NativeWasmerFuncDeleteFn, WasmerFuncDeleteFn>(
            'wasm_func_delete');
    _func_new_with_env = _lib.lookupFunction<NativeWasmerFuncNewWithEnvFn,
        WasmerFuncNewWithEnvFn>('wasm_func_new_with_env');
    _functype_delete = _lib.lookupFunction<NativeWasmerFunctypeDeleteFn,
        WasmerFunctypeDeleteFn>('wasm_functype_delete');
    _functype_params = _lib.lookupFunction<NativeWasmerFunctypeParamsFn,
        WasmerFunctypeParamsFn>('wasm_functype_params');
    _functype_results = _lib.lookupFunction<NativeWasmerFunctypeResultsFn,
        WasmerFunctypeResultsFn>('wasm_functype_results');
    _importtype_module = _lib.lookupFunction<NativeWasmerImporttypeModuleFn,
        WasmerImporttypeModuleFn>('wasm_importtype_module');
    _importtype_name = _lib.lookupFunction<NativeWasmerImporttypeNameFn,
        WasmerImporttypeNameFn>('wasm_importtype_name');
    _importtype_type = _lib.lookupFunction<NativeWasmerImporttypeTypeFn,
        WasmerImporttypeTypeFn>('wasm_importtype_type');
    _importtype_vec_delete = _lib.lookupFunction<
        NativeWasmerImporttypeVecDeleteFn,
        WasmerImporttypeVecDeleteFn>('wasm_importtype_vec_delete');
    _importtype_vec_new = _lib.lookupFunction<NativeWasmerImporttypeVecNewFn,
        WasmerImporttypeVecNewFn>('wasm_importtype_vec_new');
    _importtype_vec_new_empty = _lib.lookupFunction<
        NativeWasmerImporttypeVecNewEmptyFn,
        WasmerImporttypeVecNewEmptyFn>('wasm_importtype_vec_new_empty');
    _importtype_vec_new_uninitialized = _lib.lookupFunction<
            NativeWasmerImporttypeVecNewUninitializedFn,
            WasmerImporttypeVecNewUninitializedFn>(
        'wasm_importtype_vec_new_uninitialized');
    _instance_delete = _lib.lookupFunction<NativeWasmerInstanceDeleteFn,
        WasmerInstanceDeleteFn>('wasm_instance_delete');
    _instance_exports = _lib.lookupFunction<NativeWasmerInstanceExportsFn,
        WasmerInstanceExportsFn>('wasm_instance_exports');
    _instance_new =
        _lib.lookupFunction<NativeWasmerInstanceNewFn, WasmerInstanceNewFn>(
            'wasm_instance_new');
    _memory_as_extern = _lib.lookupFunction<NativeWasmerMemoryAsExternFn,
        WasmerMemoryAsExternFn>('wasm_memory_as_extern');
    _memory_data =
        _lib.lookupFunction<NativeWasmerMemoryDataFn, WasmerMemoryDataFn>(
            'wasm_memory_data');
    _memory_data_size = _lib.lookupFunction<NativeWasmerMemoryDataSizeFn,
        WasmerMemoryDataSizeFn>('wasm_memory_data_size');
    _memory_delete =
        _lib.lookupFunction<NativeWasmerMemoryDeleteFn, WasmerMemoryDeleteFn>(
            'wasm_memory_delete');
    _memory_grow =
        _lib.lookupFunction<NativeWasmerMemoryGrowFn, WasmerMemoryGrowFn>(
            'wasm_memory_grow');
    _memory_new =
        _lib.lookupFunction<NativeWasmerMemoryNewFn, WasmerMemoryNewFn>(
            'wasm_memory_new');
    _memory_size =
        _lib.lookupFunction<NativeWasmerMemorySizeFn, WasmerMemorySizeFn>(
            'wasm_memory_size');
    _memorytype_delete = _lib.lookupFunction<NativeWasmerMemorytypeDeleteFn,
        WasmerMemorytypeDeleteFn>('wasm_memorytype_delete');
    _memorytype_new =
        _lib.lookupFunction<NativeWasmerMemorytypeNewFn, WasmerMemorytypeNewFn>(
            'wasm_memorytype_new');
    _module_delete =
        _lib.lookupFunction<NativeWasmerModuleDeleteFn, WasmerModuleDeleteFn>(
            'wasm_module_delete');
    _module_exports =
        _lib.lookupFunction<NativeWasmerModuleExportsFn, WasmerModuleExportsFn>(
            'wasm_module_exports');
    _module_imports =
        _lib.lookupFunction<NativeWasmerModuleImportsFn, WasmerModuleImportsFn>(
            'wasm_module_imports');
    _module_new =
        _lib.lookupFunction<NativeWasmerModuleNewFn, WasmerModuleNewFn>(
            'wasm_module_new');
    _store_delete =
        _lib.lookupFunction<NativeWasmerStoreDeleteFn, WasmerStoreDeleteFn>(
            'wasm_store_delete');
    _store_new = _lib.lookupFunction<NativeWasmerStoreNewFn, WasmerStoreNewFn>(
        'wasm_store_new');
    _trap_delete =
        _lib.lookupFunction<NativeWasmerTrapDeleteFn, WasmerTrapDeleteFn>(
            'wasm_trap_delete');
    _valtype_delete =
        _lib.lookupFunction<NativeWasmerValtypeDeleteFn, WasmerValtypeDeleteFn>(
            'wasm_valtype_delete');
    _valtype_kind =
        _lib.lookupFunction<NativeWasmerValtypeKindFn, WasmerValtypeKindFn>(
            'wasm_valtype_kind');
    _valtype_vec_delete = _lib.lookupFunction<NativeWasmerValtypeVecDeleteFn,
        WasmerValtypeVecDeleteFn>('wasm_valtype_vec_delete');
    _valtype_vec_new =
        _lib.lookupFunction<NativeWasmerValtypeVecNewFn, WasmerValtypeVecNewFn>(
            'wasm_valtype_vec_new');
    _valtype_vec_new_empty = _lib.lookupFunction<
        NativeWasmerValtypeVecNewEmptyFn,
        WasmerValtypeVecNewEmptyFn>('wasm_valtype_vec_new_empty');
    _valtype_vec_new_uninitialized = _lib.lookupFunction<
            NativeWasmerValtypeVecNewUninitializedFn,
            WasmerValtypeVecNewUninitializedFn>(
        'wasm_valtype_vec_new_uninitialized');
    _wasmer_last_error_length = _lib.lookupFunction<
        NativeWasmerWasmerLastErrorLengthFn,
        WasmerWasmerLastErrorLengthFn>('wasmer_last_error_length');
    _wasmer_last_error_message = _lib.lookupFunction<
        NativeWasmerWasmerLastErrorMessageFn,
        WasmerWasmerLastErrorMessageFn>('wasmer_last_error_message');

    _engine = _engine_new();
  }

  Pointer<WasmerStore> newStore() {
    return _store_new(_engine);
  }

  Pointer<WasmerModule> compile(Pointer<WasmerStore> store, Uint8List data) {
    var dataPtr = allocate<Uint8>(count: data.length);
    for (int i = 0; i < data.length; ++i) {
      dataPtr[i] = data[i];
    }
    var dataVec = allocate<WasmerByteVec>();
    dataVec.ref.data = dataPtr;
    dataVec.ref.length = data.length;

    var modulePtr = _module_new(store, dataVec);

    free(dataPtr);
    free(dataVec);

    return _checkNotEqual(modulePtr, nullptr, "Wasm module compile failed.");
  }

  List<WasmExportDescriptor> exportDescriptors(Pointer<WasmerModule> module) {
    var exportsVec = allocate<WasmerExporttypeVec>();
    _module_exports(module, exportsVec);
    var exps = <WasmExportDescriptor>[];
    for (var i = 0; i < exportsVec.ref.length; ++i) {
      var exp = exportsVec.ref.data[i];
      var extern = _exporttype_type(exp);
      var kind = _externtype_kind(extern);
      var fnType = kind == WasmerExternKindFunction
          ? _externtype_as_functype(extern)
          : nullptr;
      exps.add(WasmExportDescriptor(
          kind, _exporttype_name(exp).ref.toString(), fnType));
    }
    free(exportsVec);
    return exps;
  }

  List<WasmImportDescriptor> importDescriptors(Pointer<WasmerModule> module) {
    var importsVec = allocate<WasmerImporttypeVec>();
    _module_imports(module, importsVec);
    var imps = <WasmImportDescriptor>[];
    for (var i = 0; i < importsVec.ref.length; ++i) {
      var imp = importsVec.ref.data[i];
      var extern = _importtype_type(imp);
      var kind = _externtype_kind(extern);
      var fnType = kind == WasmerExternKindFunction
          ? _externtype_as_functype(extern)
          : nullptr;
      imps.add(WasmImportDescriptor(
          kind,
          _importtype_module(imp).ref.toString(),
          _importtype_name(imp).ref.toString(),
          fnType));
    }
    free(importsVec);
    return imps;
  }

  Pointer<WasmerInstance> instantiate(Pointer<WasmerStore> store,
      Pointer<WasmerModule> module, Pointer<Pointer<WasmerExtern>> imports) {
    return _checkNotEqual(_instance_new(store, module, imports, nullptr),
        nullptr, "Wasm module instantiation failed.");
  }

  Pointer<WasmerExternVec> exports(Pointer<WasmerInstance> instancePtr) {
    var exports = allocate<WasmerExternVec>();
    _instance_exports(instancePtr, exports);
    return exports;
  }

  int externKind(Pointer<WasmerExtern> extern) {
    return _extern_kind(extern);
  }

  Pointer<WasmerFunc> externToFunction(Pointer<WasmerExtern> extern) {
    return _extern_as_func(extern);
  }

  Pointer<WasmerExtern> functionToExtern(Pointer<WasmerFunc> func) {
    return _func_as_extern(func);
  }

  List<int> getArgTypes(Pointer<WasmerFunctype> funcType) {
    var types = <int>[];
    var args = _functype_params(funcType);
    for (var i = 0; i < args.ref.length; ++i) {
      types.add(_valtype_kind(args.ref.data[i]));
    }
    return types;
  }

  int getReturnType(Pointer<WasmerFunctype> funcType) {
    var rets = _functype_results(funcType);
    if (rets.ref.length == 0) {
      return WasmerValKindVoid;
    } else if (rets.ref.length > 1) {
      throw Exception("Multiple return values are not supported");
    }
    return _valtype_kind(rets.ref.data[0]);
  }

  void call(Pointer<WasmerFunc> func, Pointer<WasmerVal> args,
      Pointer<WasmerVal> results) {
    _func_call(func, args, results);
  }

  Pointer<WasmerMemory> externToMemory(Pointer<WasmerExtern> extern) {
    return _extern_as_memory(extern);
  }

  Pointer<WasmerExtern> memoryToExtern(Pointer<WasmerMemory> memory) {
    return _memory_as_extern(memory);
  }

  Pointer<WasmerMemory> newMemory(
      Pointer<WasmerStore> store, int pages, int? maxPages) {
    var limPtr = allocate<WasmerLimits>();
    limPtr.ref.min = pages;
    limPtr.ref.max = maxPages ?? wasm_limits_max_default;
    var memType = _memorytype_new(limPtr);
    free(limPtr);
    return _checkNotEqual(
        _memory_new(store, memType), nullptr, "Failed to create memory.");
  }

  void growMemory(Pointer<WasmerMemory> memory, int deltaPages) {
    _checkNotEqual(
        _memory_grow(memory, deltaPages), 0, "Failed to grow memory.");
  }

  int memoryLength(Pointer<WasmerMemory> memory) {
    return _memory_size(memory);
  }

  Uint8List memoryView(Pointer<WasmerMemory> memory) {
    return _memory_data(memory).asTypedList(_memory_data_size(memory));
  }

  Pointer<WasmerFunc> newFunc(
      Pointer<WasmerStore> store,
      Pointer<WasmerFunctype> funcType,
      Pointer func,
      Pointer env,
      Pointer finalizer) {
    return _func_new_with_env(
        store, funcType, func.cast(), env.cast(), finalizer.cast());
  }

  Pointer<WasmerWasiConfig> newWasiConfig() {
    var name = allocate<Uint8>();
    name[0] = 0;
    var config = _wasi_config_new(name);
    free(name);
    return _checkNotEqual(config, nullptr, "Failed to create WASI config.");
  }

  void captureWasiStdout(Pointer<WasmerWasiConfig> config) {
    _wasi_config_inherit_stdout(config);
  }

  void captureWasiStderr(Pointer<WasmerWasiConfig> config) {
    _wasi_config_inherit_stderr(config);
  }

  Pointer<WasmerWasiEnv> newWasiEnv(Pointer<WasmerWasiConfig> config) {
    return _checkNotEqual(
        _wasi_env_new(config), nullptr, "Failed to create WASI environment.");
  }

  void wasiEnvSetMemory(
      Pointer<WasmerWasiEnv> env, Pointer<WasmerMemory> memory) {
    _wasi_env_set_memory(env, memory);
  }

  void getWasiImports(Pointer<WasmerStore> store, Pointer<WasmerModule> mod,
      Pointer<WasmerWasiEnv> env, Pointer<Pointer<WasmerExtern>> imports) {
    _checkNotEqual(_wasi_get_imports(store, mod, env, imports), 0,
        "Failed to fill WASI imports.");
  }

  Stream<List<int>> getWasiStdoutStream(Pointer<WasmerWasiEnv> env) {
    return Stream.fromIterable(_WasiStreamIterable(env, _wasi_env_read_stdout));
  }

  Stream<List<int>> getWasiStderrStream(Pointer<WasmerWasiEnv> env) {
    return Stream.fromIterable(_WasiStreamIterable(env, _wasi_env_read_stderr));
  }

  String _getLastError() {
    var length = _wasmer_last_error_length();
    var buf = allocate<Uint8>(count: length);
    _wasmer_last_error_message(buf, length);
    String message = utf8.decode(buf.asTypedList(length));
    free(buf);
    return message;
  }

  T _checkNotEqual<T>(T x, T y, String errorMessage) {
    if (x == y) {
      throw Exception("$errorMessage\n${_getLastError()}");
    }
    return x;
  }

  static String getSignatureString(
      String name, List<int> argTypes, int returnType) {
    return "${wasmerValKindName(returnType)} $name" +
        "(${argTypes.map(wasmerValKindName).join(", ")})";
  }
}

class _WasiStreamIterator implements Iterator<List<int>> {
  static final int _bufferLength = 1024;
  Pointer<WasmerWasiEnv> _env;
  Function _reader;
  Pointer<Uint8> _buf = allocate<Uint8>(count: _bufferLength);
  int _length = 0;
  _WasiStreamIterator(this._env, this._reader) {}

  bool moveNext() {
    _length = _reader(_env, _buf, _bufferLength);
    return true;
  }

  List<int> get current => _buf.asTypedList(_length);
}

class _WasiStreamIterable extends Iterable<List<int>> {
  Pointer<WasmerWasiEnv> _env;
  Function _reader;
  _WasiStreamIterable(this._env, this._reader) {}
  @override
  Iterator<List<int>> get iterator => _WasiStreamIterator(_env, _reader);
}
