using System;
using System.Collections.Generic;
namespace Wasmtime.Exports
{
///
/// Represents the exports of a WebAssembly module.
///
public class Exports
{
internal Exports(Module module)
{
Interop.wasm_exporttype_vec_t exports;
Interop.wasm_module_exports(module.Handle, out exports);
try
{
var all = new List((int)exports.size);
var functions = new List();
var globals = new List();
var tables = new List();
var memories = new List();
for (int i = 0; i < (int)exports.size; ++i)
{
unsafe
{
var exportType = exports.data[i];
var externType = Interop.wasm_exporttype_type(exportType);
switch (Interop.wasm_externtype_kind(externType))
{
case Interop.wasm_externkind_t.WASM_EXTERN_FUNC:
var function = new FunctionExport(exportType, externType);
functions.Add(function);
all.Add(function);
break;
case Interop.wasm_externkind_t.WASM_EXTERN_GLOBAL:
var global = new GlobalExport(exportType, externType);
globals.Add(global);
all.Add(global);
break;
case Interop.wasm_externkind_t.WASM_EXTERN_TABLE:
var table = new TableExport(exportType, externType);
tables.Add(table);
all.Add(table);
break;
case Interop.wasm_externkind_t.WASM_EXTERN_MEMORY:
var memory = new MemoryExport(exportType, externType);
memories.Add(memory);
all.Add(memory);
break;
default:
throw new NotSupportedException("Unsupported export extern type.");
}
}
}
Functions = functions;
Globals = globals;
Tables = tables;
Memories = memories;
All = all;
}
finally
{
Interop.wasm_exporttype_vec_delete(ref exports);
}
}
///
/// The exported functions of a WebAssembly module.
///
public IReadOnlyList Functions { get; private set; }
///
/// The exported globals of a WebAssembly module.
///
public IReadOnlyList Globals { get; private set; }
///
/// The exported tables of a WebAssembly module.
///
public IReadOnlyList Tables { get; private set; }
///
/// The exported memories of a WebAssembly module.
///
public IReadOnlyList Memories { get; private set; }
internal List All { get; private set; }
}
}