Code/Wasm/Interpret/ModuleCompiler.cs
using System.Collections.Generic;

namespace WasmBox.Wasm.Interpret {
    /// <summary>
    /// A base class for objects that turn module definition functions into module instance functions.
    /// </summary>
    public abstract class ModuleCompiler {
        /// <summary>
        /// Declares all functions in a module.
        /// </summary>
        /// <param name="module">The module to declare functions for.</param>
        /// <param name="offset">The index of the first function to define.</param>
        /// <param name="types">A list of function types, one for each function declaration.</param>
        public abstract void Initialize(ModuleInstance module, int offset, IReadOnlyList<FunctionType> types);

        /// <summary>
        /// Compiles a single function by generating code that is equivalent to <paramref name="body"/>.
        /// </summary>
        /// <param name="index">The index of the function to compile.</param>
        /// <param name="body">The function body to compile.</param>
        /// <returns>A compiled function that runs <paramref name="body"/>.</returns>
        public abstract FunctionDefinition Compile(int index, FunctionBody body);

        /// <summary>
        /// Finalizes the module's code generation.
        /// </summary>
        public abstract void Finish();
    }

    /// <summary>
    /// A module compiler that "compiles" WebAssembly function definitions by wrapping them in
    /// interpreted function instances.
    /// </summary>
    public sealed class InterpreterCompiler : ModuleCompiler {
        private ModuleInstance module;
        private IReadOnlyList<FunctionType> types;

        /// <inheritdoc/>
        public override void Initialize(ModuleInstance module, int offset, IReadOnlyList<FunctionType> types) {
            this.module = module;
            this.types = types;
        }

        /// <inheritdoc/>
        public override FunctionDefinition Compile(int index, FunctionBody body) {
            return new WasmFunctionDefinition(types[index], body, module);
        }

        /// <inheritdoc/>
        public override void Finish() {
        }
    }
}