Skip to content

Feature/Adding resource support#622

Closed
teleyos wants to merge 2 commits into
bytecodealliance:mainfrom
teleyos:feature/adding-missing-instance-methods
Closed

Feature/Adding resource support#622
teleyos wants to merge 2 commits into
bytecodealliance:mainfrom
teleyos:feature/adding-missing-instance-methods

Conversation

@teleyos

@teleyos teleyos commented Jul 3, 2026

Copy link
Copy Markdown

This PR aims to enable users of the gem to use resources and to improve the get_func docs to talk about the canonical way to point to a function [ "packagename/interface@x.x.x" , "[constructor]my-resource" ].

One caveat is that the GC won't free a resource in order to avoid double freeing or freeing before intended so we have to free by hand using resource drop.

Example :

IFACE = "somepackage/someinterface@x.x.x"

engine = Wasmtime::Engine.new

wasi = Wasmtime::WasiConfig.new
  .inherit_stdin
  .inherit_stderr
  .inherit_stdout
store = Wasmtime::Store.new(engine, wasi_config: wasi)

component = Wasmtime::Component::Component.from_file(engine, "./component_file.wasm")
linker = Wasmtime::Component::Linker.new(engine)
instance = linker.instantiate(store, component)

some_resource_constructor = instance.get_func([IFACE, "[constructor]some-resource"])
hello_func = instance.get_func([IFACE, "[method]some-resource.hello"])

abort "exports not found in #{IFACE}" if [some_resource_constructor, hello_func].any?(&:nil?)

some_resource = some_resource_constructor.call
at_exit { some_resource.resource_drop }

hello_func(some_resource)

i made this after #619

teleyos and others added 2 commits July 3, 2026 21:41
The `handle` param doc only said "the path of the function to retrieve",
leaving the accepted name formats to guesswork. Spell them out: plain
kebab-case export names, fully-qualified interface names including
namespace, package and version (e.g. "ns:pkg/iface@0.1.0"), and
canonical-ABI mangled resource function names ("[constructor]r",
"[method]r.f", "[static]r.f"), plus an example combining interface and
resource-constructor lookup.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Instance previously only exposed #get_func, making it impossible to fully
drive a component that exports a WIT `resource` (e.g. a constructor plus
instance methods) from Ruby: there was no way to look up the resource's
exported type, and Val::Resource/Type::Own/Type::Borrow conversions were
hard `not_implemented!` stubs.

- Instance#get_resource wraps wasmtime's method of the same name; the
  shared lookup helper now internally prefers get_export_index over
  get_export since the ComponentItem the latter returns is never used.
- New Wasmtime::Component::Resource wraps ResourceAny + its owning Store,
  requiring an explicit #resource_drop (wasmtime requires every ResourceAny,
  even borrows, to be explicitly dropped; there's no safe GC finalizer hook
  for re-entering a Store during collection).
- New Wasmtime::Component::ResourceType wraps the matching wasmtime type;
  it is inert Copy data with no Store dependency, so unlike Resource it
  needs no GC mark.
- convert.rs now lifts/lowers resource values for the Func::invoke path
  (calling exported functions), and guards against passing a Resource
  obtained from one Store into a call on a different Store, which would
  otherwise silently index into the wrong store's resource table.
- Host-defined import functions (Linker#root.func_new) still don't support
  resources in either direction; that path never had a Ruby-visible Store
  handle to thread through, and stays out of scope here.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@teleyos teleyos closed this Jul 3, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant