NAME
Wasm::Wasmtime - Perl interface to Wasmtime
VERSION
version 0.23
SYNOPSIS
use Wasm::Wasmtime;
use PeekPoke::FFI qw( poke );
my $store = Wasm::Wasmtime::Store->new;
my $module = Wasm::Wasmtime::Module->new($store->engine, wat => q{
(module
;; callback we can make back into perl space
(func $hello (import "" "hello"))
(func (export "call_hello") (call $hello))
;; plain WebAssembly function that we can call from Perl
(func (export "gcd") (param i32 i32) (result i32)
(local i32)
block ;; label = @1
block ;; label = @2
local.get 0
br_if 0 (;@2;)
local.get 1
local.set 2
br 1 (;@1;)
end
loop ;; label = @2
local.get 1
local.get 0
local.tee 2
i32.rem_u
local.set 0
local.get 2
local.set 1
local.get 0
br_if 0 (;@2;)
end
end
local.get 2
)
;; memory region that can be accessed from
;; either Perl or WebAssembly
(memory (export "memory") 2 3)
(func (export "load") (param i32) (result i32)
(i32.load8_s (local.get 0))
)
)
});
sub hello
{
print "hello world!\n";
}
my $instance = Wasm::Wasmtime::Instance->new( $module, $store, [\&hello] );
# call a WebAssembly function that calls back into Perl space
$instance->exports->call_hello;
# call plain WebAssembly function
my $gcd = $instance->exports->gcd;
print $gcd->(6,27), "\n"; # 3
# write to memory from Perl and read it from WebAssembly
my $memory = $instance->exports->memory;
poke($memory->data + 10, 42); # set offset 10 to 42
my $load = $instance->exports->load;
print $load->(10), "\n"; # 42
poke($memory->data + 10, 52); # set offset 10 to 52
print $load->(10), "\n"; # 52
DESCRIPTION
WARNING: WebAssembly and Wasmtime are a moving target and the interface for these modules is under active development. Use with caution.
This module pre-loads all the relevant Wasmtime modules so that you can just start using the appropriate classes.
If you are just getting your feet wet with WebAssembly and Perl then you probably want to take a look at Wasm, which is a simple interface that automatically imports functions from Wasm space into Perl space.
ENVIRONMENT
PERL_WASM_WASMTIME_MEMORY
This environment variable, if set, should be a colon separated list of values for static_memory_maximum_size
, static_memory_guard_size
and dynamic_memory_guard_size
. See Wasm::Wasmtime::Config for more details on these limits.
SEE ALSO
- Wasm
-
Simplified interface to WebAssembly that imports WebAssembly functions into Perl space.
- Wasm::Wasmtime::Module
-
Interface to WebAssembly module.
- Wasm::Wasmtime::Instance
-
Interface to a WebAssembly module instance.
- Wasm::Wasmtime::Func
-
Interface to WebAssembly function.
- Wasm::Wasmtime::Linker
-
Link together multiple WebAssembly modules into one program.
- Wasm::Wasmtime::Wat2Wasm
-
Tool to convert WebAssembly Text (WAT) to WebAssembly binary (Wasm).
- Wasm::Wasmtime::WasiInstance
-
WebAssembly System Interface (WASI).
- https://github.com/bytecodealliance/wasmtime
-
The rust library used by this module, via its C API, via FFI.
- https://github.com/bytecodealliance/wasmtime-py
-
These bindings here heavily influenced by the Python Wasmtime bindings.
AUTHOR
Graham Ollis <plicease@cpan.org>
COPYRIGHT AND LICENSE
This software is copyright (c) 2020-2022 by Graham Ollis.
This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.