|
|
|
const Engine = @import("./engine.zig").Engine;
|
|
|
|
const Diagnostics = @import("./diagnostics.zig").Diagnostics;
|
|
|
|
const Error = @import("./error.zig").Error;
|
|
|
|
const ByteVec = @import("./vec.zig").ByteVec;
|
|
|
|
|
|
|
|
const _instance = @import("./instance.zig");
|
|
|
|
const ImportTypeVec = _instance.ImportTypeVec;
|
|
|
|
const ExportTypeVec = _instance.ExportTypeVec;
|
|
|
|
|
|
|
|
const wat2wasm = @import("./wat2wasm.zig").wat2wasm;
|
|
|
|
|
|
|
|
/// A compiled Wasmtime module.
|
|
|
|
///
|
|
|
|
/// This type represents a compiled WebAssembly module. The compiled module is
|
|
|
|
/// ready to be instantiated and can be inspected for imports/exports. It is
|
|
|
|
/// safe to use a module across multiple threads simultaneously.
|
|
|
|
pub const Module = opaque {
|
|
|
|
/// Compiles a WebAssembly binary into a `Module`.
|
|
|
|
pub fn init(engine: *Engine, wasm_bytes: []const u8, diag: ?*Diagnostics) !*Module {
|
|
|
|
var result: *Module = undefined;
|
|
|
|
const err = wasmtime_module_new(engine, wasm_bytes.ptr, wasm_bytes.len, &result);
|
|
|
|
return Diagnostics.handleError(err, error.ModuleInit, result, diag);
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn initFromWat(engine: *Engine, wat_bytes: []const u8, diag: ?*Diagnostics) !*Module {
|
|
|
|
const wasm_bytes = try wat2wasm(wat_bytes, diag);
|
|
|
|
defer wasm_bytes.deinit();
|
|
|
|
return init(engine, wasm_bytes.toSlice(), diag);
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn deinit(self: *Module) void {
|
|
|
|
wasmtime_module_delete(self);
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Creates a shallow clone of the specified module, increasing the
|
|
|
|
/// internal reference count.
|
|
|
|
pub fn clone(self: *Module) *Module {
|
|
|
|
return wasmtime_module_clone(self);
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Returns the list of imports that this module expects.
|
|
|
|
///
|
|
|
|
/// The list of imports returned are the types of items expected to be
|
|
|
|
/// passed to `Instance.init`. You can use `Import.getType` to learn about
|
|
|
|
/// the expected type of each import.
|
|
|
|
pub fn getImports(self: *Module) ImportTypeVec {
|
|
|
|
var result: ImportTypeVec = undefined;
|
|
|
|
wasmtime_module_imports(self, &result);
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Returns the list of exports that this module provides.
|
|
|
|
///
|
|
|
|
/// The list of exports returned are in the same order as the items
|
|
|
|
/// returned by `Instance.getExports`.
|
|
|
|
pub fn getExports(self: *Module) ExportTypeVec {
|
|
|
|
var result: ExportTypeVec = undefined;
|
|
|
|
wasmtime_module_exports(self, &result);
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Validate a WebAssembly binary.
|
|
|
|
///
|
|
|
|
/// This function will validate the provided byte sequence to determine if
|
|
|
|
/// it is a valid WebAssembly binary within the context of the engine
|
|
|
|
/// provided.
|
|
|
|
pub fn validate(engine: *Engine, wasm_bytes: []const u8, diag: ?*Diagnostics) !void {
|
|
|
|
const err = wasmtime_module_validate(engine, wasm_bytes.ptr, wasm_bytes.len);
|
|
|
|
try Diagnostics.handleError(err, error.ModuleValidate, {}, diag);
|
|
|
|
}
|
|
|
|
|
|
|
|
/// This function serializes compiled module artifacts as blob data.
|
|
|
|
pub fn serialize(self: *Module, diag: ?*Diagnostics) !ByteVec {
|
|
|
|
var result: ByteVec = undefined;
|
|
|
|
const err = wasmtime_module_serialize(self, &result);
|
|
|
|
return Diagnostics.handleError(err, error.ModuleSerialize, result, diag);
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Build a module from serialized data.
|
|
|
|
///
|
|
|
|
/// This function is not safe to receive arbitrary user input. See the
|
|
|
|
/// Rust documentation for more information on what inputs are safe to
|
|
|
|
/// pass in here (e.g. only that of `Module.serialize`).
|
|
|
|
pub fn deserialize(engine: *Engine, bytes: []const u8, diag: ?*Diagnostics) !*Module {
|
|
|
|
var result: *Module = undefined;
|
|
|
|
const err = wasmtime_module_deserialize(engine, bytes.ptr, bytes.len, &result);
|
|
|
|
return Diagnostics.handleError(err, error.ModuleDeserialize, result, diag);
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Deserialize a module from an on-disk file.
|
|
|
|
///
|
|
|
|
/// This function is the same as `Module.deserialize` except that it reads
|
|
|
|
/// the data for the serialized module from the path on disk. This can be
|
|
|
|
/// faster than the alternative which may require copying the data around.
|
|
|
|
///
|
|
|
|
/// This function is not safe to receive arbitrary user input. See the
|
|
|
|
/// Rust documentation for more information on what inputs are safe to
|
|
|
|
/// pass in here (e.g. only that of `Module.serialize`).
|
|
|
|
pub fn deserializeFromFile(engine: *Engine, path: [*]const u8, diag: ?*Diagnostics) !*Module {
|
|
|
|
var result: *Module = undefined;
|
|
|
|
const err = wasmtime_module_deserialize_file(engine, path.ptr, &result);
|
|
|
|
return Diagnostics.handleError(err, error.ModuleDeserializeFromFile, result, diag);
|
|
|
|
}
|
|
|
|
|
|
|
|
extern "c" fn wasmtime_module_new(*Engine, [*]const u8, usize, **Module) ?*Error;
|
|
|
|
extern "c" fn wasmtime_module_delete(*Module) void;
|
|
|
|
extern "c" fn wasmtime_module_clone(*Module) *Module;
|
|
|
|
extern "c" fn wasmtime_module_imports(*const Module, *ImportTypeVec) void;
|
|
|
|
extern "c" fn wasmtime_module_exports(*const Module, *ExportTypeVec) void;
|
|
|
|
extern "c" fn wasmtime_module_validate(*Engine, [*]const u8, usize) ?*Error;
|
|
|
|
extern "c" fn wasmtime_module_serialize(*Module, *ByteVec) ?*Error;
|
|
|
|
extern "c" fn wasmtime_module_deserialize(*Engine, [*]const u8, usize, **Module) ?*Error;
|
|
|
|
extern "c" fn wasmtime_module_deserialize_file(*Engine, [*]const u8, **Module) ?*Error;
|
|
|
|
};
|