🌻 📖 Wasm::Wasmtime::Linker

NAME

Wasm::Wasmtime::Linker - Wasmtime linker class

VERSION

version 0.24

SYNOPSIS

 use Wasm::Wasmtime;
 
 my $store  = Wasm::Wasmtime::Store->new;
 my $linker = Wasm::Wasmtime::Linker->new($store);
 
 # Configure WASI on the store and define the WASI imports in the linker
 $store->set_wasi(
   Wasm::Wasmtime::WasiConfig
     ->new
     ->inherit_stdout
 );
 $linker->define_wasi;
 
 # Create a logger module + instance
 my $logger = $linker->instantiate(
   Wasm::Wasmtime::Module->new(
     $store->engine,
     wat => q{
       (module
         (type $fd_write_ty (func (param i32 i32 i32 i32) (result i32)))
         (import "wasi_snapshot_preview1" "fd_write" (func $fd_write (type $fd_write_ty)))
 
         (func (export "log") (param i32 i32)
           ;; store the pointer in the first iovec field
           i32.const 4
           local.get 0
           i32.store
 
           ;; store the length in the first iovec field
           i32.const 4
           local.get 1
           i32.store offset=4
 
           ;; call the `fd_write` import
           i32.const 1     ;; stdout fd
           i32.const 4     ;; iovs start
           i32.const 1     ;; number of iovs
           i32.const 0     ;; where to write nwritten bytes
           call $fd_write
           drop
         )
 
         (memory (export "memory") 2)
         (global (export "memory_offset") i32 (i32.const 65536))
       )
     },
   )
 );
 $linker->define_instance("logger", $logger);
 
 # Create a caller module + instance
 my $caller = $linker->instantiate(
   Wasm::Wasmtime::Module->new(
     $store->engine,
     wat => q{
       (module
         (import "logger" "log" (func $log (param i32 i32)))
         (import "logger" "memory" (memory 1))
         (import "logger" "memory_offset" (global $offset i32))
 
         (func (export "run")
           ;; Our `data` segment initialized our imported memory, so let's print the
           ;; string there now.
           global.get $offset
           i32.const 14
           call $log
         )
 
         (data (global.get $offset) "Hello, world!\n")
       )
     },
   ),
 );
 $caller->exports->run->();

DESCRIPTION

WARNING: WebAssembly and Wasmtime are a moving target and the interface for these modules is under active development. Use with caution.

This class represents a WebAssembly linker.

CONSTRUCTOR

new

 my $linker = Wasm::Wasmtime::Linker->new(
   $store,        # Wasm::Wasmtime::Store
 );

Create a new WebAssembly linker object.

METHODS

allow_shadowing

 $linker->allow_shadowing($bool);

define

 $linker->define($module, $name, $extern);

Define the given extern (a Wasm::Wasmtime::Func, ::Memory, ::Global or ::Table).

define_wasi

 $linker->define_wasi;

Define the WASI imports in this linker. The WASI state itself must be configured on the store with $store->set_wasi($wasi_config). Any argument is accepted and ignored for backwards compatibility.

define_instance

 $linker->define_instance($name, $instance);

instantiate

 my $instance = $linker->instantiate($module);

Instantiate the module using the linker. Returns a Wasm::Wasmtime::Instance.

get_one_by_name

 my $extern = $linker->get_one_by_name($module, $name);

Returns the Wasm::Wasmtime::Extern for the given $module and $name. Throws an exception if there is no such item.

get_default

 my $func = $linker->get_default($name);

Acquires the "default export" of the named module. Returns a Wasm::Wasmtime::Func.

store

 my $store = $linker->store;

Returns the Wasm::Wasmtime::Store for the linker.

SEE ALSO

Wasm
Wasm::Wasmtime

AUTHOR

Graham Ollis <plicease@cpan.org>

COPYRIGHT AND LICENSE

This software is copyright (c) 2020-2026 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.