From 519b858967414358b217cb18cf68a3a515da0578 Mon Sep 17 00:00:00 2001 From: ZverGuy Date: Sun, 3 May 2026 00:36:50 +0300 Subject: [PATCH 01/26] feat(components): introduce Component class for component model loading Adds Wasmtime.Components namespace with Component (compile/load/serialize/ deserialize) and ComponentExport (cached export index) wrappers around the wasmtime_component_* C API surface available in wasmtime v34+. This is the first step toward WASI 0.2 host-side Component Model support (issue #324). Subsequent commits will add ComponentLinker, ComponentInstance, ComponentFunction, ComponentValue, resources, and a WIT source generator. Based on the sketch in PR #346 by Martin Evans, with corrections: - ObjectDisposedException now reports the correct type - file paths marshalled as LPUTF8Str for non-ASCII paths - block-scoped namespace matching the rest of the codebase Co-Authored-By: Martin Evans Co-Authored-By: Claude Signed-off-by: ZverGuy --- src/Components/Component.cs | 253 ++++++++++++++++++++++++++++++ src/Components/ComponentExport.cs | 59 +++++++ 2 files changed, 312 insertions(+) create mode 100644 src/Components/Component.cs create mode 100644 src/Components/ComponentExport.cs diff --git a/src/Components/Component.cs b/src/Components/Component.cs new file mode 100644 index 00000000..8db4a5bc --- /dev/null +++ b/src/Components/Component.cs @@ -0,0 +1,253 @@ +using System; +using System.IO; +using System.Runtime.InteropServices; +using Microsoft.Win32.SafeHandles; + +namespace Wasmtime.Components +{ + /// + /// Represents a compiled WebAssembly component. + /// + public class Component : IDisposable + { + /// + /// Creates a from a span of bytes. + /// + /// The engine to use for the component. + /// The bytes of the component. + /// Returns a new . + public static Component FromBytes(Engine engine, ReadOnlySpan bytes) + { + if (engine is null) + { + throw new ArgumentNullException(nameof(engine)); + } + + unsafe + { + fixed (byte* ptr = bytes) + { + var error = Native.wasmtime_component_new(engine.NativeHandle, ptr, (UIntPtr)bytes.Length, out var handle); + if (error != IntPtr.Zero) + { + throw new WasmtimeException($"WebAssembly component is not valid: {WasmtimeException.FromOwnedError(error).Message}"); + } + + return new Component(handle); + } + } + } + + /// + /// Creates a from a file path. + /// + /// The engine to use for the component. + /// The path to the WebAssembly component file. + /// Returns a new . + public static Component FromFile(Engine engine, string path) + { + if (engine is null) + { + throw new ArgumentNullException(nameof(engine)); + } + + if (path is null) + { + throw new ArgumentNullException(nameof(path)); + } + + return FromBytes(engine, File.ReadAllBytes(path)); + } + + /// + /// Serializes the component to an array of bytes. + /// + /// Returns the serialized component as an array of bytes. + public byte[] Serialize() + { + var error = Native.wasmtime_component_serialize(NativeHandle, out var array); + if (error != IntPtr.Zero) + { + throw WasmtimeException.FromOwnedError(error); + } + + using (array) + { + var len = checked((int)array.size); + var bytes = new byte[len]; + unsafe + { + Marshal.Copy((IntPtr)array.data, bytes, 0, len); + } + return bytes; + } + } + + /// + /// Deserializes a previously serialized component from a span of bytes. + /// + /// The engine to use to deserialize the component. + /// The previously serialized component bytes. + /// Returns the that was previously serialized. + /// The passed bytes must come from a previous call to . + public static Component Deserialize(Engine engine, ReadOnlySpan bytes) + { + if (engine is null) + { + throw new ArgumentNullException(nameof(engine)); + } + + unsafe + { + fixed (byte* ptr = bytes) + { + var error = Native.wasmtime_component_deserialize(engine.NativeHandle, ptr, (UIntPtr)bytes.Length, out var handle); + if (error != IntPtr.Zero) + { + throw WasmtimeException.FromOwnedError(error); + } + + return new Component(handle); + } + } + } + + /// + /// Deserializes a previously serialized component from a file. + /// + /// The engine to deserialize the component with. + /// The path to the previously serialized component. + /// Returns the that was previously serialized. + /// The file's contents must come from a previous call to . + public static Component DeserializeFile(Engine engine, string path) + { + if (engine is null) + { + throw new ArgumentNullException(nameof(engine)); + } + + if (path is null) + { + throw new ArgumentNullException(nameof(path)); + } + + var error = Native.wasmtime_component_deserialize_file(engine.NativeHandle, path, out var handle); + if (error != IntPtr.Zero) + { + throw WasmtimeException.FromOwnedError(error); + } + + return new Component(handle); + } + + /// + /// Looks up an export by name on this component. + /// + /// The name of the export to look up. + /// The export index if found; otherwise . + public ComponentExport? GetExport(string name) + { + if (name is null) + { + throw new ArgumentNullException(nameof(name)); + } + + var index = Native.wasmtime_component_get_export_index(NativeHandle, IntPtr.Zero, name, (nuint)name.Length); + if (index == IntPtr.Zero) + { + return null; + } + + return new ComponentExport(index); + } + + /// + /// Looks up an export by name within a nested instance export. + /// + /// The name of the export to look up. + /// The export index of the parent instance to search within. + /// The export index if found; otherwise . + public ComponentExport? GetExport(string name, ComponentExport instanceExportIndex) + { + if (name is null) + { + throw new ArgumentNullException(nameof(name)); + } + + if (instanceExportIndex is null) + { + throw new ArgumentNullException(nameof(instanceExportIndex)); + } + + var index = Native.wasmtime_component_get_export_index(NativeHandle, instanceExportIndex.NativeHandle.DangerousGetHandle(), name, (nuint)name.Length); + if (index == IntPtr.Zero) + { + return null; + } + + return new ComponentExport(index); + } + + /// + public void Dispose() + { + handle.Dispose(); + } + + internal Component(IntPtr handle) + { + this.handle = new Handle(handle); + } + + internal Handle NativeHandle + { + get + { + if (handle.IsInvalid || handle.IsClosed) + { + throw new ObjectDisposedException(typeof(Component).FullName); + } + + return handle; + } + } + + internal class Handle : SafeHandleZeroOrMinusOneIsInvalid + { + public Handle(IntPtr handle) + : base(true) + { + SetHandle(handle); + } + + protected override bool ReleaseHandle() + { + Native.wasmtime_component_delete(handle); + return true; + } + } + + internal static class Native + { + [DllImport(Engine.LibraryName)] + public static extern unsafe IntPtr wasmtime_component_new(Engine.Handle engine, byte* bytes, UIntPtr size, out IntPtr handle); + + [DllImport(Engine.LibraryName)] + public static extern void wasmtime_component_delete(IntPtr component); + + [DllImport(Engine.LibraryName)] + public static extern IntPtr wasmtime_component_serialize(Handle component, out ByteArray bytes); + + [DllImport(Engine.LibraryName)] + public static extern unsafe IntPtr wasmtime_component_deserialize(Engine.Handle engine, byte* bytes, UIntPtr size, out IntPtr handle); + + [DllImport(Engine.LibraryName)] + public static extern IntPtr wasmtime_component_deserialize_file(Engine.Handle engine, [MarshalAs(Extensions.LPUTF8Str)] string path, out IntPtr handle); + + [DllImport(Engine.LibraryName)] + public static extern IntPtr wasmtime_component_get_export_index(Handle component, IntPtr instanceExportIndex, [MarshalAs(Extensions.LPUTF8Str)] string name, nuint nameLength); + } + + private readonly Handle handle; + } +} diff --git a/src/Components/ComponentExport.cs b/src/Components/ComponentExport.cs new file mode 100644 index 00000000..ed322b9b --- /dev/null +++ b/src/Components/ComponentExport.cs @@ -0,0 +1,59 @@ +using System; +using System.Runtime.InteropServices; +using Microsoft.Win32.SafeHandles; + +namespace Wasmtime.Components +{ + /// + /// Represents a cached lookup index for a component export. + /// + public class ComponentExport : IDisposable + { + /// + public void Dispose() + { + handle.Dispose(); + } + + internal ComponentExport(IntPtr handle) + { + this.handle = new Handle(handle); + } + + internal Handle NativeHandle + { + get + { + if (handle.IsInvalid || handle.IsClosed) + { + throw new ObjectDisposedException(typeof(ComponentExport).FullName); + } + + return handle; + } + } + + internal class Handle : SafeHandleZeroOrMinusOneIsInvalid + { + public Handle(IntPtr handle) + : base(true) + { + SetHandle(handle); + } + + protected override bool ReleaseHandle() + { + Native.wasmtime_component_export_index_delete(handle); + return true; + } + } + + internal static class Native + { + [DllImport(Engine.LibraryName)] + public static extern void wasmtime_component_export_index_delete(IntPtr exportIndex); + } + + private readonly Handle handle; + } +} From 512e4d17549fa3688d05f3b6bed3822dbb705745 Mon Sep 17 00:00:00 2001 From: ZverGuy Date: Sun, 3 May 2026 00:40:11 +0300 Subject: [PATCH 02/26] feat(components): add ComponentLinker and instantiation support MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Introduces: - ComponentLinker — wraps wasmtime_component_linker_t with constructor, Root() to obtain the root linker instance, AddWasiPreview2() to enable WASI 0.2 imports, and Instantiate() returning a ComponentInstance. - ComponentLinkerInstance — wraps wasmtime_component_linker_instance_t, exposes Instance() to define nested instances and AddModule() to provide a core wasm module as an import. - ComponentInstance — managed wrapper holding the value-typed wasmtime_component_instance_t (16 bytes: store_id + private index). Lifetime tied to Store, no explicit dispose. Function definition (DefineFunc) and call paths (GetFunction, Call) are deferred to subsequent commits since they require ComponentValue marshalling. Co-Authored-By: Claude Signed-off-by: ZverGuy --- src/Components/ComponentInstance.cs | 30 ++++ src/Components/ComponentLinker.cs | 162 ++++++++++++++++++++++ src/Components/ComponentLinkerInstance.cs | 149 ++++++++++++++++++++ 3 files changed, 341 insertions(+) create mode 100644 src/Components/ComponentInstance.cs create mode 100644 src/Components/ComponentLinker.cs create mode 100644 src/Components/ComponentLinkerInstance.cs diff --git a/src/Components/ComponentInstance.cs b/src/Components/ComponentInstance.cs new file mode 100644 index 00000000..b9c7851f --- /dev/null +++ b/src/Components/ComponentInstance.cs @@ -0,0 +1,30 @@ +using System; + +namespace Wasmtime.Components +{ + /// + /// Represents an instantiated within a . + /// + /// + /// A has the same lifetime as the + /// it was created in: it is automatically reclaimed when the store is disposed and does not + /// require explicit cleanup. + /// + public class ComponentInstance + { + internal ComponentInstance(Store store, WasmtimeComponentInstance instance) + { + Store = store; + this.instance = instance; + } + + /// + /// The store this instance lives in. + /// + public Store Store { get; } + + internal WasmtimeComponentInstance Raw => instance; + + private readonly WasmtimeComponentInstance instance; + } +} diff --git a/src/Components/ComponentLinker.cs b/src/Components/ComponentLinker.cs new file mode 100644 index 00000000..f605dc70 --- /dev/null +++ b/src/Components/ComponentLinker.cs @@ -0,0 +1,162 @@ +using System; +using System.Runtime.InteropServices; +using Microsoft.Win32.SafeHandles; + +namespace Wasmtime.Components +{ + /// + /// Resolves imports for a and instantiates it within a . + /// + /// + /// A describes the imports a component requires. + /// Use or + /// to define functions, modules, or nested instances, then call + /// to create a runnable + /// . + /// + public class ComponentLinker : IDisposable + { + /// + /// Creates a new for the specified engine. + /// + /// The engine the linker belongs to. + public ComponentLinker(Engine engine) + { + if (engine is null) + { + throw new ArgumentNullException(nameof(engine)); + } + + handle = new Handle(Native.wasmtime_component_linker_new(engine.NativeHandle)); + } + + /// + /// Returns the root , used to define names in the root namespace. + /// + /// + /// While the returned instance is alive, the linker must not be used directly. Dispose the instance + /// before invoking other linker operations. + /// + public ComponentLinkerInstance Root() + { + return new ComponentLinkerInstance(Native.wasmtime_component_linker_root(NativeHandle)); + } + + /// + /// Adds all WASI 0.2 (preview 2) interfaces to this linker. + /// + public void AddWasiPreview2() + { + var error = Native.wasmtime_component_linker_add_wasip2(NativeHandle); + if (error != IntPtr.Zero) + { + throw WasmtimeException.FromOwnedError(error); + } + } + + /// + /// Instantiates the given within , satisfying + /// its imports from this linker. + /// + /// The store the instance lives in. + /// The component to instantiate. + /// A usable until is disposed. + public ComponentInstance Instantiate(Store store, Component component) + { + if (store is null) + { + throw new ArgumentNullException(nameof(store)); + } + + if (component is null) + { + throw new ArgumentNullException(nameof(component)); + } + + var error = Native.wasmtime_component_linker_instantiate( + NativeHandle, + store.Context.handle, + component.NativeHandle, + out var raw); + + GC.KeepAlive(store); + GC.KeepAlive(component); + + if (error != IntPtr.Zero) + { + throw WasmtimeException.FromOwnedError(error); + } + + return new ComponentInstance(store, raw); + } + + /// + public void Dispose() + { + handle.Dispose(); + } + + internal Handle NativeHandle + { + get + { + if (handle.IsInvalid || handle.IsClosed) + { + throw new ObjectDisposedException(typeof(ComponentLinker).FullName); + } + + return handle; + } + } + + internal class Handle : SafeHandleZeroOrMinusOneIsInvalid + { + public Handle(IntPtr handle) + : base(true) + { + SetHandle(handle); + } + + protected override bool ReleaseHandle() + { + Native.wasmtime_component_linker_delete(handle); + return true; + } + } + + internal static class Native + { + [DllImport(Engine.LibraryName)] + public static extern IntPtr wasmtime_component_linker_new(Engine.Handle engine); + + [DllImport(Engine.LibraryName)] + public static extern void wasmtime_component_linker_delete(IntPtr linker); + + [DllImport(Engine.LibraryName)] + public static extern IntPtr wasmtime_component_linker_root(Handle linker); + + [DllImport(Engine.LibraryName)] + public static extern IntPtr wasmtime_component_linker_add_wasip2(Handle linker); + + [DllImport(Engine.LibraryName)] + public static extern IntPtr wasmtime_component_linker_instantiate( + Handle linker, + IntPtr context, + Component.Handle component, + out WasmtimeComponentInstance instanceOut); + } + + private readonly Handle handle; + } + + /// + /// Mirror of `wasmtime_component_instance_t` — the value-typed handle that wasmtime fills in + /// when a component is instantiated. + /// + [StructLayout(LayoutKind.Sequential)] + internal struct WasmtimeComponentInstance + { + public ulong StoreId; + public uint Private; + } +} diff --git a/src/Components/ComponentLinkerInstance.cs b/src/Components/ComponentLinkerInstance.cs new file mode 100644 index 00000000..9cea8eaa --- /dev/null +++ b/src/Components/ComponentLinkerInstance.cs @@ -0,0 +1,149 @@ +using System; +using System.Runtime.InteropServices; +using Microsoft.Win32.SafeHandles; + +namespace Wasmtime.Components +{ + /// + /// Represents an instance scope within a in which functions, + /// modules, and nested instances can be defined. + /// + /// + /// Obtained via or . + /// While alive, holds an exclusive lock on its parent linker. + /// + public class ComponentLinkerInstance : IDisposable + { + /// + /// Defines a nested instance within this instance. + /// + /// The name of the nested instance. + /// The newly created nested . + public ComponentLinkerInstance Instance(string name) + { + if (name is null) + { + throw new ArgumentNullException(nameof(name)); + } + + var nameBytes = System.Text.Encoding.UTF8.GetBytes(name); + unsafe + { + fixed (byte* ptr = nameBytes) + { + var error = Native.wasmtime_component_linker_instance_add_instance( + NativeHandle, + ptr, + (UIntPtr)nameBytes.Length, + out var nestedHandle); + + if (error != IntPtr.Zero) + { + throw WasmtimeException.FromOwnedError(error); + } + + return new ComponentLinkerInstance(nestedHandle); + } + } + } + + /// + /// Defines a core within this instance, providing it as an import to a component. + /// + /// The name to bind the module to. + /// The module to expose. + public void AddModule(string name, Module module) + { + if (name is null) + { + throw new ArgumentNullException(nameof(name)); + } + + if (module is null) + { + throw new ArgumentNullException(nameof(module)); + } + + var nameBytes = System.Text.Encoding.UTF8.GetBytes(name); + unsafe + { + fixed (byte* ptr = nameBytes) + { + var error = Native.wasmtime_component_linker_instance_add_module( + NativeHandle, + ptr, + (UIntPtr)nameBytes.Length, + module.NativeHandle); + + GC.KeepAlive(module); + + if (error != IntPtr.Zero) + { + throw WasmtimeException.FromOwnedError(error); + } + } + } + } + + /// + public void Dispose() + { + handle.Dispose(); + } + + internal ComponentLinkerInstance(IntPtr handle) + { + this.handle = new Handle(handle); + } + + internal Handle NativeHandle + { + get + { + if (handle.IsInvalid || handle.IsClosed) + { + throw new ObjectDisposedException(typeof(ComponentLinkerInstance).FullName); + } + + return handle; + } + } + + internal class Handle : SafeHandleZeroOrMinusOneIsInvalid + { + public Handle(IntPtr handle) + : base(true) + { + SetHandle(handle); + } + + protected override bool ReleaseHandle() + { + Native.wasmtime_component_linker_instance_delete(handle); + return true; + } + } + + internal static class Native + { + [DllImport(Engine.LibraryName)] + public static extern void wasmtime_component_linker_instance_delete(IntPtr linkerInstance); + + [DllImport(Engine.LibraryName)] + public static extern unsafe IntPtr wasmtime_component_linker_instance_add_instance( + Handle linkerInstance, + byte* name, + UIntPtr nameLength, + out IntPtr nestedOut); + + [DllImport(Engine.LibraryName)] + public static extern unsafe IntPtr wasmtime_component_linker_instance_add_module( + Handle linkerInstance, + byte* name, + UIntPtr nameLength, + Module.Handle module); + } + + private readonly Handle handle; + } +} From d0e529be13dcb124f6640533e317debcab5152d2 Mon Sep 17 00:00:00 2001 From: ZverGuy Date: Sun, 3 May 2026 00:43:12 +0300 Subject: [PATCH 03/26] feat(components): add primitive ComponentValue, ComponentFunction, function lookup MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds the call/return path for component functions taking and returning primitive values: - ComponentValue — blittable struct mirroring wasmtime_component_val_t (32 bytes: 1 byte kind + 7 bytes padding + 24 byte union). Factory helpers and accessors are provided for bool, s8/u8/s16/u16/s32/u32/s64/u64, f32/f64, and char. The underlying union is sized for the largest case (variant, 24 bytes); composite cases (string, list, record, tuple, variant, enum, option, result, flags) are reserved by size and will gain typed accessors in the marshalling phase. - ComponentValueKind — public enum mirroring WASMTIME_COMPONENT_* discriminants. - ComponentFunction — wraps the value-typed wasmtime_component_func_t. Call invokes wasmtime_component_func_call followed by wasmtime_component_func_post_return automatically; PostReturn is exposed for callers that drive the lifecycle manually. - ComponentInstance — adds GetExport, GetFunction(name), and GetFunction(export) using wasmtime_component_instance_get_export_index and wasmtime_component_instance_get_func. Co-Authored-By: Claude Signed-off-by: ZverGuy --- src/Components/ComponentFunction.cs | 128 ++++++++++++++ src/Components/ComponentInstance.cs | 124 +++++++++++++- src/Components/ComponentValue.cs | 255 ++++++++++++++++++++++++++++ 3 files changed, 505 insertions(+), 2 deletions(-) create mode 100644 src/Components/ComponentFunction.cs create mode 100644 src/Components/ComponentValue.cs diff --git a/src/Components/ComponentFunction.cs b/src/Components/ComponentFunction.cs new file mode 100644 index 00000000..45d9612b --- /dev/null +++ b/src/Components/ComponentFunction.cs @@ -0,0 +1,128 @@ +using System; +using System.Runtime.InteropServices; + +namespace Wasmtime.Components +{ + /// + /// Represents a callable function exported by a . + /// + /// + /// A is bound to its originating and + /// becomes invalid once that store is disposed. Like a core wasm function, it does not need + /// explicit cleanup. + /// + public class ComponentFunction + { + /// + /// Invokes the function with the given arguments and writes results into . + /// + /// The arguments to pass; their kinds must match the function signature. + /// A span sized to the number of results the function produces. + /// + /// After a successful call, must be invoked before the next call on this + /// function. The call helper invokes it automatically; only call it manually if you handle the + /// raw P/Invoke. + /// + public void Call(ReadOnlySpan arguments, Span results) + { + var store = Store; + + unsafe + { + fixed (ComponentValue* argsPtr = arguments) + fixed (ComponentValue* resultsPtr = results) + fixed (WasmtimeComponentFunc* funcPtr = &func) + { + var error = Native.wasmtime_component_func_call( + funcPtr, + store.Context.handle, + argsPtr, + (UIntPtr)arguments.Length, + resultsPtr, + (UIntPtr)results.Length); + + if (error != IntPtr.Zero) + { + throw WasmtimeException.FromOwnedError(error); + } + + var postReturnError = Native.wasmtime_component_func_post_return(funcPtr, store.Context.handle); + if (postReturnError != IntPtr.Zero) + { + throw WasmtimeException.FromOwnedError(postReturnError); + } + } + } + + GC.KeepAlive(store); + } + + /// + /// Invokes the post-return canonical ABI option for this function. + /// + /// + /// Required after each + /// to release any temporary allocations the guest produced for the result buffer. Most callers + /// do not need to invoke this directly because performs it automatically. + /// + public void PostReturn() + { + var store = Store; + + unsafe + { + fixed (WasmtimeComponentFunc* funcPtr = &func) + { + var error = Native.wasmtime_component_func_post_return(funcPtr, store.Context.handle); + if (error != IntPtr.Zero) + { + throw WasmtimeException.FromOwnedError(error); + } + } + } + + GC.KeepAlive(store); + } + + internal ComponentFunction(Store store, WasmtimeComponentFunc func) + { + Store = store; + this.func = func; + } + + /// + /// The store this function lives in. + /// + public Store Store { get; } + + internal static class Native + { + [DllImport(Engine.LibraryName)] + public static extern unsafe IntPtr wasmtime_component_func_call( + WasmtimeComponentFunc* func, + IntPtr context, + ComponentValue* args, + UIntPtr argsSize, + ComponentValue* results, + UIntPtr resultsSize); + + [DllImport(Engine.LibraryName)] + public static extern unsafe IntPtr wasmtime_component_func_post_return( + WasmtimeComponentFunc* func, + IntPtr context); + } + + private WasmtimeComponentFunc func; + } + + /// + /// Mirror of wasmtime_component_func_t — value-typed handle (16 bytes: store_id + two private indices). + /// + [StructLayout(LayoutKind.Sequential)] + internal struct WasmtimeComponentFunc + { + public ulong StoreId; + public uint Private1; + public uint Private2; + } +} diff --git a/src/Components/ComponentInstance.cs b/src/Components/ComponentInstance.cs index b9c7851f..c75dd73e 100644 --- a/src/Components/ComponentInstance.cs +++ b/src/Components/ComponentInstance.cs @@ -1,4 +1,5 @@ using System; +using System.Runtime.InteropServices; namespace Wasmtime.Components { @@ -12,6 +13,109 @@ namespace Wasmtime.Components /// public class ComponentInstance { + /// + /// Looks up an export of this instance by name. + /// + /// The name of the export. + /// An export index if found; otherwise . + public ComponentExport? GetExport(string name) + { + return GetExport(name, null); + } + + /// + /// Looks up an export within a nested instance export of this instance. + /// + /// The name of the export. + /// The parent instance export, or for top-level. + /// An export index if found; otherwise . + public ComponentExport? GetExport(string name, ComponentExport? parent) + { + if (name is null) + { + throw new ArgumentNullException(nameof(name)); + } + + var parentHandle = parent is null ? IntPtr.Zero : parent.NativeHandle.DangerousGetHandle(); + + IntPtr index; + unsafe + { + fixed (WasmtimeComponentInstance* instancePtr = &instance) + { + index = Native.wasmtime_component_instance_get_export_index( + instancePtr, + Store.Context.handle, + parentHandle, + name, + (UIntPtr)name.Length); + } + } + + GC.KeepAlive(Store); + GC.KeepAlive(parent); + + if (index == IntPtr.Zero) + { + return null; + } + + return new ComponentExport(index); + } + + /// + /// Looks up an exported function by name. + /// + /// The name of the exported function. + /// A if a function with that name was exported; otherwise . + public ComponentFunction? GetFunction(string name) + { + using var export = GetExport(name); + if (export is null) + { + return null; + } + + return GetFunction(export); + } + + /// + /// Looks up an exported function from a previously-resolved . + /// + /// The export index obtained via or . + /// A if the export refers to a function; otherwise . + public ComponentFunction? GetFunction(ComponentExport export) + { + if (export is null) + { + throw new ArgumentNullException(nameof(export)); + } + + bool found; + WasmtimeComponentFunc func; + unsafe + { + fixed (WasmtimeComponentInstance* instancePtr = &instance) + { + found = Native.wasmtime_component_instance_get_func( + instancePtr, + Store.Context.handle, + export.NativeHandle, + out func); + } + } + + GC.KeepAlive(Store); + GC.KeepAlive(export); + + if (!found) + { + return null; + } + + return new ComponentFunction(Store, func); + } + internal ComponentInstance(Store store, WasmtimeComponentInstance instance) { Store = store; @@ -23,8 +127,24 @@ internal ComponentInstance(Store store, WasmtimeComponentInstance instance) /// public Store Store { get; } - internal WasmtimeComponentInstance Raw => instance; + internal static class Native + { + [DllImport(Engine.LibraryName)] + public static extern unsafe IntPtr wasmtime_component_instance_get_export_index( + WasmtimeComponentInstance* instance, + IntPtr context, + IntPtr parentExportIndex, + [MarshalAs(Extensions.LPUTF8Str)] string name, + UIntPtr nameLength); + + [DllImport(Engine.LibraryName)] + public static extern unsafe bool wasmtime_component_instance_get_func( + WasmtimeComponentInstance* instance, + IntPtr context, + ComponentExport.Handle exportIndex, + out WasmtimeComponentFunc funcOut); + } - private readonly WasmtimeComponentInstance instance; + private WasmtimeComponentInstance instance; } } diff --git a/src/Components/ComponentValue.cs b/src/Components/ComponentValue.cs new file mode 100644 index 00000000..7ee72e12 --- /dev/null +++ b/src/Components/ComponentValue.cs @@ -0,0 +1,255 @@ +using System; +using System.Diagnostics; +using System.Runtime.InteropServices; + +namespace Wasmtime.Components +{ + /// + /// Discriminant for the variants of . + /// + /// + /// Mirrors the WASMTIME_COMPONENT_* constants in wasmtime/component/val.h. + /// + public enum ComponentValueKind : byte + { + /// The value is a . + Bool = 0, + /// The value is a signed 8-bit integer. + S8 = 1, + /// The value is an unsigned 8-bit integer. + U8 = 2, + /// The value is a signed 16-bit integer. + S16 = 3, + /// The value is an unsigned 16-bit integer. + U16 = 4, + /// The value is a signed 32-bit integer. + S32 = 5, + /// The value is an unsigned 32-bit integer. + U32 = 6, + /// The value is a signed 64-bit integer. + S64 = 7, + /// The value is an unsigned 64-bit integer. + U64 = 8, + /// The value is a 32-bit float. + F32 = 9, + /// The value is a 64-bit float. + F64 = 10, + /// The value is a Unicode scalar value. + Char = 11, + /// The value is a string. + String = 12, + /// The value is a list. + List = 13, + /// The value is a record. + Record = 14, + /// The value is a tuple. + Tuple = 15, + /// The value is a variant. + Variant = 16, + /// The value is an enum. + Enum = 17, + /// The value is an option. + Option = 18, + /// The value is a result. + Result = 19, + /// The value is a flags set. + Flags = 20, + } + + /// + /// Represents a single value passed to or returned from a component function. + /// + /// + /// This struct mirrors wasmtime_component_val_t for blittable interop. Currently only + /// primitive values (bool, integers, floats, char) are supported via the From* / + /// As* helpers. Strings, lists, records, tuples, variants, enums, options, results, + /// and flags will be wired up in subsequent commits as part of the marshalling phase. + /// + [StructLayout(LayoutKind.Sequential)] + public struct ComponentValue + { + // Verify the struct matches the C layout: 1 byte kind + 7 bytes padding + 24 byte union = 32 bytes total. + static ComponentValue() => Debug.Assert(Marshal.SizeOf(typeof(ComponentValue)) == 32); + + private byte kind; + private byte _pad0; + private byte _pad1; + private byte _pad2; + private byte _pad3; + private byte _pad4; + private byte _pad5; + private byte _pad6; + + private WasmtimeComponentValUnion of; + + /// + /// The discriminant indicating which alternative this value holds. + /// + public ComponentValueKind Kind => (ComponentValueKind)kind; + + /// Creates a value of kind . + public static ComponentValue FromBool(bool value) + { + var v = new ComponentValue { kind = (byte)ComponentValueKind.Bool }; + v.of.Boolean = value ? (byte)1 : (byte)0; + return v; + } + + /// Creates a value of kind . + public static ComponentValue FromS8(sbyte value) + { + var v = new ComponentValue { kind = (byte)ComponentValueKind.S8 }; + v.of.S8 = value; + return v; + } + + /// Creates a value of kind . + public static ComponentValue FromU8(byte value) + { + var v = new ComponentValue { kind = (byte)ComponentValueKind.U8 }; + v.of.U8 = value; + return v; + } + + /// Creates a value of kind . + public static ComponentValue FromS16(short value) + { + var v = new ComponentValue { kind = (byte)ComponentValueKind.S16 }; + v.of.S16 = value; + return v; + } + + /// Creates a value of kind . + public static ComponentValue FromU16(ushort value) + { + var v = new ComponentValue { kind = (byte)ComponentValueKind.U16 }; + v.of.U16 = value; + return v; + } + + /// Creates a value of kind . + public static ComponentValue FromS32(int value) + { + var v = new ComponentValue { kind = (byte)ComponentValueKind.S32 }; + v.of.S32 = value; + return v; + } + + /// Creates a value of kind . + public static ComponentValue FromU32(uint value) + { + var v = new ComponentValue { kind = (byte)ComponentValueKind.U32 }; + v.of.U32 = value; + return v; + } + + /// Creates a value of kind . + public static ComponentValue FromS64(long value) + { + var v = new ComponentValue { kind = (byte)ComponentValueKind.S64 }; + v.of.S64 = value; + return v; + } + + /// Creates a value of kind . + public static ComponentValue FromU64(ulong value) + { + var v = new ComponentValue { kind = (byte)ComponentValueKind.U64 }; + v.of.U64 = value; + return v; + } + + /// Creates a value of kind . + public static ComponentValue FromF32(float value) + { + var v = new ComponentValue { kind = (byte)ComponentValueKind.F32 }; + v.of.F32 = value; + return v; + } + + /// Creates a value of kind . + public static ComponentValue FromF64(double value) + { + var v = new ComponentValue { kind = (byte)ComponentValueKind.F64 }; + v.of.F64 = value; + return v; + } + + /// Creates a value of kind from a Unicode scalar value. + public static ComponentValue FromChar(uint scalarValue) + { + var v = new ComponentValue { kind = (byte)ComponentValueKind.Char }; + v.of.Character = scalarValue; + return v; + } + + /// Reads the value as ; throws if is not . + public bool AsBool() { ExpectKind(ComponentValueKind.Bool); return of.Boolean != 0; } + + /// Reads the value as . + public sbyte AsS8() { ExpectKind(ComponentValueKind.S8); return of.S8; } + + /// Reads the value as . + public byte AsU8() { ExpectKind(ComponentValueKind.U8); return of.U8; } + + /// Reads the value as . + public short AsS16() { ExpectKind(ComponentValueKind.S16); return of.S16; } + + /// Reads the value as . + public ushort AsU16() { ExpectKind(ComponentValueKind.U16); return of.U16; } + + /// Reads the value as . + public int AsS32() { ExpectKind(ComponentValueKind.S32); return of.S32; } + + /// Reads the value as . + public uint AsU32() { ExpectKind(ComponentValueKind.U32); return of.U32; } + + /// Reads the value as . + public long AsS64() { ExpectKind(ComponentValueKind.S64); return of.S64; } + + /// Reads the value as . + public ulong AsU64() { ExpectKind(ComponentValueKind.U64); return of.U64; } + + /// Reads the value as . + public float AsF32() { ExpectKind(ComponentValueKind.F32); return of.F32; } + + /// Reads the value as . + public double AsF64() { ExpectKind(ComponentValueKind.F64); return of.F64; } + + /// Reads the value as a Unicode scalar value. + public uint AsChar() { ExpectKind(ComponentValueKind.Char); return of.Character; } + + private void ExpectKind(ComponentValueKind expected) + { + if (Kind != expected) + { + throw new InvalidOperationException($"ComponentValue is of kind '{Kind}', not '{expected}'."); + } + } + } + + /// + /// Mirror of wasmtime_component_valunion_t. Largest case (variant) determines the size: 24 bytes. + /// + /// + /// Composite cases (string, list, record, tuple, variant, enum, option, result, flags) have their + /// fields reserved by the explicit size of 24 bytes but C# accessors will be added in Phase 2 alongside + /// the marshalling support. + /// + [StructLayout(LayoutKind.Explicit, Size = 24)] + internal struct WasmtimeComponentValUnion + { + [FieldOffset(0)] public byte Boolean; + [FieldOffset(0)] public sbyte S8; + [FieldOffset(0)] public byte U8; + [FieldOffset(0)] public short S16; + [FieldOffset(0)] public ushort U16; + [FieldOffset(0)] public int S32; + [FieldOffset(0)] public uint U32; + [FieldOffset(0)] public long S64; + [FieldOffset(0)] public ulong U64; + [FieldOffset(0)] public float F32; + [FieldOffset(0)] public double F64; + [FieldOffset(0)] public uint Character; + } +} From ee2b92928ab476cb0f7b089084b07f9cb414353a Mon Sep 17 00:00:00 2001 From: ZverGuy Date: Sun, 3 May 2026 00:44:25 +0300 Subject: [PATCH 04/26] test(components): cover ComponentValue layout and basic Component/Linker P/Invoke ComponentValueTests verify the blittable layout (SizeOf == 32) and that the union round-trips primitive values correctly across all FieldOffset(0) slots. ComponentTests load the wasmtime native library and exercise the real P/Invoke surface: rejecting non-component bytes via wasmtime_component_new, creating and disposing a ComponentLinker, and adding the WASI 0.2 imports. These cover the runtime correctness of the marshalling layout we committed in the prior change and confirm the native library is reachable on the host configuration. Co-Authored-By: Claude Signed-off-by: ZverGuy --- tests/ComponentTests.cs | 49 ++++++++++++++++++++++++++ tests/ComponentValueTests.cs | 66 ++++++++++++++++++++++++++++++++++++ 2 files changed, 115 insertions(+) create mode 100644 tests/ComponentTests.cs create mode 100644 tests/ComponentValueTests.cs diff --git a/tests/ComponentTests.cs b/tests/ComponentTests.cs new file mode 100644 index 00000000..ba571b1f --- /dev/null +++ b/tests/ComponentTests.cs @@ -0,0 +1,49 @@ +using System; +using FluentAssertions; +using Wasmtime.Components; +using Xunit; + +namespace Wasmtime.Tests; + +public class ComponentTests +{ + [Fact] + public void FromBytes_RejectsCoreModule() + { + // Empty wasm core module: magic "\0asm" + version 1. + var coreModule = new byte[] { 0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00 }; + + using var engine = new Engine(); + Action act = () => Component.FromBytes(engine, coreModule); + + act.Should().Throw(); + } + + [Fact] + public void FromBytes_RejectsGarbage() + { + using var engine = new Engine(); + var bytes = new byte[] { 0xff, 0xff, 0xff, 0xff }; + + Action act = () => Component.FromBytes(engine, bytes); + act.Should().Throw(); + } + + [Fact] + public void Linker_CanBeCreatedAndDisposed() + { + using var engine = new Engine(); + using var linker = new ComponentLinker(engine); + // Dispose via using; should not throw. + } + + [Fact] + public void Linker_AddWasiPreview2_Succeeds() + { + using var engine = new Engine(); + using var linker = new ComponentLinker(engine); + + Action act = () => linker.AddWasiPreview2(); + act.Should().NotThrow(); + } +} diff --git a/tests/ComponentValueTests.cs b/tests/ComponentValueTests.cs new file mode 100644 index 00000000..1fd42cbe --- /dev/null +++ b/tests/ComponentValueTests.cs @@ -0,0 +1,66 @@ +using System.Runtime.InteropServices; +using FluentAssertions; +using Wasmtime.Components; +using Xunit; + +namespace Wasmtime.Tests; + +public class ComponentValueTests +{ + [Fact] + public void Layout_MatchesNativeSize() + { + Marshal.SizeOf().Should().Be(32); + } + + [Fact] + public void Bool_RoundTrips() + { + var t = ComponentValue.FromBool(true); + t.Kind.Should().Be(ComponentValueKind.Bool); + t.AsBool().Should().BeTrue(); + + var f = ComponentValue.FromBool(false); + f.AsBool().Should().BeFalse(); + } + + [Fact] + public void U32_RoundTrips() + { + var v = ComponentValue.FromU32(uint.MaxValue); + v.Kind.Should().Be(ComponentValueKind.U32); + v.AsU32().Should().Be(uint.MaxValue); + } + + [Fact] + public void S64_RoundTrips() + { + var v = ComponentValue.FromS64(long.MinValue); + v.Kind.Should().Be(ComponentValueKind.S64); + v.AsS64().Should().Be(long.MinValue); + } + + [Fact] + public void F64_RoundTrips() + { + var v = ComponentValue.FromF64(3.14159265358979); + v.Kind.Should().Be(ComponentValueKind.F64); + v.AsF64().Should().Be(3.14159265358979); + } + + [Fact] + public void Char_RoundTrips() + { + var v = ComponentValue.FromChar(0x1F600); // 😀 + v.Kind.Should().Be(ComponentValueKind.Char); + v.AsChar().Should().Be(0x1F600u); + } + + [Fact] + public void AccessorRejectsWrongKind() + { + var v = ComponentValue.FromU32(42); + Assert.Throws(() => v.AsBool()); + Assert.Throws(() => v.AsS32()); + } +} From b2438065d3bd516d819f1d736a6f0fa379093b3c Mon Sep 17 00:00:00 2001 From: ZverGuy Date: Sun, 3 May 2026 00:46:24 +0300 Subject: [PATCH 05/26] test(components): end-to-end add(u32, u32) -> u32 component invocation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds the first true end-to-end test that exercises the entire managed surface against a real wasm component: - tests/Components/add.wat — minimal component model WAT exporting add: func(a: u32, b: u32) -> u32 backed by a one-instruction core module. - tests/Components/add.wasm — pre-compiled binary (144 bytes), built locally with `wasm-tools parse`. Embedded as a resource in the test assembly. - tests/ComponentEndToEndTests.cs — exercises the full stack: Component.FromBytes, ComponentLinker.Instantiate, ComponentInstance.GetFunction, ComponentFunction.Call, Component.GetExport, Component.Serialize/Deserialize round-trip. The end-to-end Add test loads add.wasm, instantiates with an empty linker, looks up the function, invokes it with (40, 2), and asserts the result equals 42. This validates that wasmtime_component_func_call writes the result into the caller-allocated output buffer correctly and that the post-return cleanup runs without error. Co-Authored-By: Claude Signed-off-by: ZverGuy --- tests/ComponentEndToEndTests.cs | 94 ++++++++++++++++++++++++++++++++ tests/Components/add.wasm | Bin 0 -> 144 bytes tests/Components/add.wat | 9 +++ tests/Wasmtime.Tests.csproj | 2 + 4 files changed, 105 insertions(+) create mode 100644 tests/ComponentEndToEndTests.cs create mode 100644 tests/Components/add.wasm create mode 100644 tests/Components/add.wat diff --git a/tests/ComponentEndToEndTests.cs b/tests/ComponentEndToEndTests.cs new file mode 100644 index 00000000..0a5c6e1a --- /dev/null +++ b/tests/ComponentEndToEndTests.cs @@ -0,0 +1,94 @@ +using System.IO; +using System.Reflection; +using FluentAssertions; +using Wasmtime.Components; +using Xunit; + +namespace Wasmtime.Tests; + +public class ComponentEndToEndTests +{ + private static byte[] LoadFixture(string name) + { + using var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(name) + ?? throw new FileNotFoundException($"Embedded fixture '{name}' not found."); + using var ms = new MemoryStream(); + stream.CopyTo(ms); + return ms.ToArray(); + } + + [Fact] + public void AddComponent_LoadsAndCalls() + { + var bytes = LoadFixture("add.wasm"); + + using var engine = new Engine(); + using var component = Component.FromBytes(engine, bytes); + using var linker = new ComponentLinker(engine); + using var store = new Store(engine); + + var instance = linker.Instantiate(store, component); + + var function = instance.GetFunction("add"); + function.Should().NotBeNull(); + + var args = new[] + { + ComponentValue.FromU32(40), + ComponentValue.FromU32(2), + }; + var results = new ComponentValue[1]; + + function!.Call(args, results); + + results[0].Kind.Should().Be(ComponentValueKind.U32); + results[0].AsU32().Should().Be(42u); + } + + [Fact] + public void Component_GetExport_FindsAdd() + { + var bytes = LoadFixture("add.wasm"); + + using var engine = new Engine(); + using var component = Component.FromBytes(engine, bytes); + + using var export = component.GetExport("add"); + export.Should().NotBeNull(); + + using var missing = component.GetExport("missing"); + missing.Should().BeNull(); + } + + [Fact] + public void Instance_GetFunction_ReturnsNullForMissing() + { + var bytes = LoadFixture("add.wasm"); + + using var engine = new Engine(); + using var component = Component.FromBytes(engine, bytes); + using var linker = new ComponentLinker(engine); + using var store = new Store(engine); + + var instance = linker.Instantiate(store, component); + + var missing = instance.GetFunction("does-not-exist"); + missing.Should().BeNull(); + } + + [Fact] + public void Component_SerializeRoundTrip() + { + var bytes = LoadFixture("add.wasm"); + + using var engine = new Engine(); + using var component = Component.FromBytes(engine, bytes); + + var serialized = component.Serialize(); + serialized.Should().NotBeEmpty(); + + using var roundTripped = Component.Deserialize(engine, serialized); + using var export = roundTripped.GetExport("add"); + export.Should().NotBeNull(); + } +} diff --git a/tests/Components/add.wasm b/tests/Components/add.wasm new file mode 100644 index 0000000000000000000000000000000000000000..bb51cefeaffebfb9c5a092e14bc770d4be1164ed GIT binary patch literal 144 zcmWknNe;p=5VNOMh7f@SAD|!L#shc?f%X7W(n@g2DPL#i + + From 22fc4a8f71a03a811847f6769af3409908f9e42e Mon Sep 17 00:00:00 2001 From: ZverGuy Date: Sun, 3 May 2026 00:52:51 +0300 Subject: [PATCH 06/26] feat(components): add String marshalling and full composite-type union layout Extends ComponentValue with the string variant and lays out the full wasmtime_component_val_t union for the remaining composite kinds (list, record, tuple, variant, enum, option, result, flags) as a foundation for the rest of phase 2. Additions: - WasmName, ComponentValVec, ComponentValVariant, ComponentValResult internal structs mirroring the corresponding C types in val.h. - WasmtimeComponentValUnion now exposes [FieldOffset(0)] members for every composite case; the size remains 24 bytes (largest case = variant). - ComponentValue gains an `ownsHeap` byte that tracks whether the value was allocated by the managed factories so that Free knows when to deallocate. Layout total stays at 32 bytes. - FromString(string) UTF-8 encodes via Encoding.UTF8 and stores the buffer through Marshal.AllocHGlobal; AsString() decodes from the WasmName payload (whether owned by the host or by wasmtime); Free() releases the host-owned buffer and is idempotent + a no-op for primitives. Tests: - ComponentValueTests: ASCII, empty, full Unicode (RU + emoji + JP) round-trips, idempotent Free, primitive Free no-op, null guard. - tests/Components/hello-string.{wat,wasm}: minimal component exporting `hello: func() -> string` driven by a hand-written core module with a cabi_realloc and an inline canonical ABI lift. - ComponentEndToEndTests.HelloComponent_ReturnsString invokes the function and reads the returned string via AsString, validating that WasmName layout matches what wasmtime writes into the return area. Co-Authored-By: Claude Signed-off-by: ZverGuy --- src/Components/ComponentValue.cs | 156 ++++++++++++++++++++++++++--- tests/ComponentEndToEndTests.cs | 28 ++++++ tests/ComponentValueTests.cs | 67 +++++++++++++ tests/Components/hello-string.wasm | Bin 0 -> 255 bytes tests/Components/hello-string.wat | 18 ++++ tests/Wasmtime.Tests.csproj | 1 + 6 files changed, 255 insertions(+), 15 deletions(-) create mode 100644 tests/Components/hello-string.wasm create mode 100644 tests/Components/hello-string.wat diff --git a/src/Components/ComponentValue.cs b/src/Components/ComponentValue.cs index 7ee72e12..d0f5ca5c 100644 --- a/src/Components/ComponentValue.cs +++ b/src/Components/ComponentValue.cs @@ -1,6 +1,7 @@ using System; using System.Diagnostics; using System.Runtime.InteropServices; +using System.Text; namespace Wasmtime.Components { @@ -60,31 +61,29 @@ public enum ComponentValueKind : byte /// Represents a single value passed to or returned from a component function. /// /// - /// This struct mirrors wasmtime_component_val_t for blittable interop. Currently only - /// primitive values (bool, integers, floats, char) are supported via the From* / - /// As* helpers. Strings, lists, records, tuples, variants, enums, options, results, - /// and flags will be wired up in subsequent commits as part of the marshalling phase. + /// Mirrors wasmtime_component_val_t for blittable interop. Composite values + /// (currently ) own a heap-allocated buffer + /// when constructed by From* factories — call after use, + /// preferably from a finally block. /// [StructLayout(LayoutKind.Sequential)] public struct ComponentValue { - // Verify the struct matches the C layout: 1 byte kind + 7 bytes padding + 24 byte union = 32 bytes total. + // Verify the struct matches the C layout: 1 byte kind + 1 byte allocation flag + 6 bytes padding + 24 byte union = 32 bytes total. static ComponentValue() => Debug.Assert(Marshal.SizeOf(typeof(ComponentValue)) == 32); private byte kind; + private byte ownsHeap; private byte _pad0; private byte _pad1; private byte _pad2; private byte _pad3; private byte _pad4; private byte _pad5; - private byte _pad6; private WasmtimeComponentValUnion of; - /// - /// The discriminant indicating which alternative this value holds. - /// + /// The discriminant indicating which alternative this value holds. public ComponentValueKind Kind => (ComponentValueKind)kind; /// Creates a value of kind . @@ -183,6 +182,41 @@ public static ComponentValue FromChar(uint scalarValue) return v; } + /// + /// Creates a value of kind by encoding as UTF-8. + /// + /// + /// The returned value owns a heap-allocated UTF-8 buffer. Call after use to release it. + /// + public static ComponentValue FromString(string value) + { + if (value is null) + { + throw new ArgumentNullException(nameof(value)); + } + + var byteCount = Encoding.UTF8.GetByteCount(value); + var ptr = byteCount == 0 ? IntPtr.Zero : Marshal.AllocHGlobal(byteCount); + if (byteCount > 0) + { + unsafe + { + fixed (char* chars = value) + { + Encoding.UTF8.GetBytes(chars, value.Length, (byte*)ptr, byteCount); + } + } + } + + var v = new ComponentValue + { + kind = (byte)ComponentValueKind.String, + ownsHeap = 1, + }; + v.of.String = new WasmName { Size = (UIntPtr)byteCount, Data = ptr }; + return v; + } + /// Reads the value as ; throws if is not . public bool AsBool() { ExpectKind(ComponentValueKind.Bool); return of.Boolean != 0; } @@ -219,6 +253,50 @@ public static ComponentValue FromChar(uint scalarValue) /// Reads the value as a Unicode scalar value. public uint AsChar() { ExpectKind(ComponentValueKind.Char); return of.Character; } + /// Reads the value as ; the underlying UTF-8 bytes are decoded into a managed string. + public string AsString() + { + ExpectKind(ComponentValueKind.String); + var size = checked((int)(uint)of.String.Size); + if (size == 0) + { + return string.Empty; + } + + unsafe + { + return Encoding.UTF8.GetString((byte*)of.String.Data, size); + } + } + + /// + /// Releases any heap-allocated payload associated with this value (currently strings). + /// + /// + /// Safe to call multiple times. Has no effect on values of primitive kinds or values not allocated + /// by the managed factories. After the value's payload is no longer accessible. + /// + public void Free() + { + if (ownsHeap == 0) + { + return; + } + + switch ((ComponentValueKind)kind) + { + case ComponentValueKind.String: + if (of.String.Data != IntPtr.Zero) + { + Marshal.FreeHGlobal(of.String.Data); + of.String = default; + } + break; + } + + ownsHeap = 0; + } + private void ExpectKind(ComponentValueKind expected) { if (Kind != expected) @@ -229,13 +307,52 @@ private void ExpectKind(ComponentValueKind expected) } /// - /// Mirror of wasmtime_component_valunion_t. Largest case (variant) determines the size: 24 bytes. + /// Mirror of wasm_byte_vec_t / wasm_name_t — used for strings, enum case names, and flag names. + /// + [StructLayout(LayoutKind.Sequential)] + internal struct WasmName + { + public UIntPtr Size; + public IntPtr Data; + } + + /// + /// Mirror of the vec types wasmtime_component_vallist_t, wasmtime_component_valtuple_t, + /// wasmtime_component_valrecord_t, and wasmtime_component_valflags_t. They share the same + /// { size, data* } layout — the element type differs but is always referenced by an opaque pointer. + /// + [StructLayout(LayoutKind.Sequential)] + internal struct ComponentValVec + { + public UIntPtr Size; + public IntPtr Data; + } + + /// + /// Mirror of wasmtime_component_valvariant_t: a name discriminant plus an optional payload pointer. + /// + [StructLayout(LayoutKind.Sequential)] + internal struct ComponentValVariant + { + public WasmName Discriminant; + public IntPtr Val; + } + + /// + /// Mirror of wasmtime_component_valresult_t: an ok flag plus an optional payload pointer. + /// + [StructLayout(LayoutKind.Sequential)] + internal struct ComponentValResult + { + public byte IsOk; + // Trailing padding to 8-byte alignment is implicit; matches the C struct's layout exactly. + public IntPtr Val; + } + + /// + /// Mirror of wasmtime_component_valunion_t. The largest case (variant) drives the size: 24 bytes. + /// All cases overlap at offset 0 — at most one is valid at any time, indicated by . /// - /// - /// Composite cases (string, list, record, tuple, variant, enum, option, result, flags) have their - /// fields reserved by the explicit size of 24 bytes but C# accessors will be added in Phase 2 alongside - /// the marshalling support. - /// [StructLayout(LayoutKind.Explicit, Size = 24)] internal struct WasmtimeComponentValUnion { @@ -251,5 +368,14 @@ internal struct WasmtimeComponentValUnion [FieldOffset(0)] public float F32; [FieldOffset(0)] public double F64; [FieldOffset(0)] public uint Character; + [FieldOffset(0)] public WasmName String; + [FieldOffset(0)] public ComponentValVec List; + [FieldOffset(0)] public ComponentValVec Record; + [FieldOffset(0)] public ComponentValVec Tuple; + [FieldOffset(0)] public ComponentValVariant Variant; + [FieldOffset(0)] public WasmName Enumeration; + [FieldOffset(0)] public IntPtr Option; + [FieldOffset(0)] public ComponentValResult Result; + [FieldOffset(0)] public ComponentValVec Flags; } } diff --git a/tests/ComponentEndToEndTests.cs b/tests/ComponentEndToEndTests.cs index 0a5c6e1a..c8d083ac 100644 --- a/tests/ComponentEndToEndTests.cs +++ b/tests/ComponentEndToEndTests.cs @@ -91,4 +91,32 @@ public void Component_SerializeRoundTrip() using var export = roundTripped.GetExport("add"); export.Should().NotBeNull(); } + + [Fact] + public void HelloComponent_ReturnsString() + { + var bytes = LoadFixture("hello-string.wasm"); + + using var engine = new Engine(); + using var component = Component.FromBytes(engine, bytes); + using var linker = new ComponentLinker(engine); + using var store = new Store(engine); + + var instance = linker.Instantiate(store, component); + var hello = instance.GetFunction("hello"); + hello.Should().NotBeNull(); + + var results = new ComponentValue[1]; + try + { + hello!.Call(System.ReadOnlySpan.Empty, results); + + results[0].Kind.Should().Be(ComponentValueKind.String); + results[0].AsString().Should().Be("Hello, world!"); + } + finally + { + results[0].Free(); + } + } } diff --git a/tests/ComponentValueTests.cs b/tests/ComponentValueTests.cs index 1fd42cbe..e9bcbbe4 100644 --- a/tests/ComponentValueTests.cs +++ b/tests/ComponentValueTests.cs @@ -63,4 +63,71 @@ public void AccessorRejectsWrongKind() Assert.Throws(() => v.AsBool()); Assert.Throws(() => v.AsS32()); } + + [Fact] + public void String_AsciiRoundTrips() + { + var v = ComponentValue.FromString("hello"); + try + { + v.Kind.Should().Be(ComponentValueKind.String); + v.AsString().Should().Be("hello"); + } + finally + { + v.Free(); + } + } + + [Fact] + public void String_EmptyRoundTrips() + { + var v = ComponentValue.FromString(string.Empty); + try + { + v.Kind.Should().Be(ComponentValueKind.String); + v.AsString().Should().BeEmpty(); + } + finally + { + v.Free(); + } + } + + [Fact] + public void String_UnicodeRoundTrips() + { + var input = "Привет, 🌍! 日本語"; + var v = ComponentValue.FromString(input); + try + { + v.AsString().Should().Be(input); + } + finally + { + v.Free(); + } + } + + [Fact] + public void String_FreeIsIdempotent() + { + var v = ComponentValue.FromString("x"); + v.Free(); + v.Free(); + } + + [Fact] + public void String_FromNullThrows() + { + Assert.Throws(() => ComponentValue.FromString(null!)); + } + + [Fact] + public void Free_OnPrimitiveIsNoOp() + { + var v = ComponentValue.FromU32(7); + v.Free(); + v.AsU32().Should().Be(7u); + } } diff --git a/tests/Components/hello-string.wasm b/tests/Components/hello-string.wasm new file mode 100644 index 0000000000000000000000000000000000000000..80a8a0c1837c0cddc4d5038605111a43f30d4ceb GIT binary patch literal 255 zcmY*UyAHxI3_K@od4wVXVnoo11y*Ld@fWm|NFX&0YLO6A2Y!r!55pEP;K65~Y~LAq z<6;o#LEw@AP^_|`<)AhLwOT7ssClH5=*U^;>$}3B$PedzZS%791rVMr7oh%3g-D+; zQ^_ed3h4`JEXb^x5R)d}$@FS*^L2Sl&EStxQU5Cff%wm=gtHJkaJR)nv(kbm-B iBU@TSwhcEQH$u*bg?ATU+3LC$5sEP4PaNZz@%#qb`Y`kW literal 0 HcmV?d00001 diff --git a/tests/Components/hello-string.wat b/tests/Components/hello-string.wat new file mode 100644 index 00000000..2870b6d3 --- /dev/null +++ b/tests/Components/hello-string.wat @@ -0,0 +1,18 @@ +(component + (core module $m + (memory (export "memory") 1) + (data (i32.const 0) "Hello, world!") + (func (export "cabi_realloc") (param i32 i32 i32 i32) (result i32) + i32.const 64) + (func (export "hello") (result i32) + ;; Write {ptr=0, len=13} into the return area at offset 64. + (i32.store (i32.const 64) (i32.const 0)) + (i32.store (i32.const 68) (i32.const 13)) + (i32.const 64))) + (core instance $i (instantiate $m)) + (func (export "hello") (result string) + (canon lift + (core func $i "hello") + (memory $i "memory") + (realloc (func $i "cabi_realloc")) + string-encoding=utf8))) diff --git a/tests/Wasmtime.Tests.csproj b/tests/Wasmtime.Tests.csproj index e4c530f8..fecd3653 100644 --- a/tests/Wasmtime.Tests.csproj +++ b/tests/Wasmtime.Tests.csproj @@ -25,6 +25,7 @@ + From 2b0985359692a88df6a4be781653e6d32360094a Mon Sep 17 00:00:00 2001 From: ZverGuy Date: Sun, 3 May 2026 00:54:51 +0300 Subject: [PATCH 07/26] feat(components): add Enum and Flags marshalling Both kinds reuse the WasmName layout introduced for strings: - Enum is a single name describing the selected case (`wasm_name_t enumeration` in the C union). - Flags is an array of WasmNames listing the bits that are set (`wasmtime_component_valflags_t` = vec of `wasm_name_t`). Adds factories FromEnum(string) and FromFlags(IReadOnlyList), accessors AsEnum() and AsFlags(), and extends Free() to release the underlying name buffers. Internal AllocateName/FreeName/AllocateNameArray/ FreeNameArray helpers centralise the heap arithmetic so future kinds can reuse them. FromFlags rejects null elements and rolls back partially-allocated entries to avoid leaks. Tests cover round-trip, empty flags, null guards, and the partial-rollback path. Co-Authored-By: Claude Signed-off-by: ZverGuy --- src/Components/ComponentValue.cs | 194 +++++++++++++++++++++++++++---- tests/ComponentValueTests.cs | 62 ++++++++++ 2 files changed, 235 insertions(+), 21 deletions(-) diff --git a/src/Components/ComponentValue.cs b/src/Components/ComponentValue.cs index d0f5ca5c..73316ca1 100644 --- a/src/Components/ComponentValue.cs +++ b/src/Components/ComponentValue.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Diagnostics; using System.Runtime.InteropServices; using System.Text; @@ -195,25 +196,58 @@ public static ComponentValue FromString(string value) throw new ArgumentNullException(nameof(value)); } - var byteCount = Encoding.UTF8.GetByteCount(value); - var ptr = byteCount == 0 ? IntPtr.Zero : Marshal.AllocHGlobal(byteCount); - if (byteCount > 0) + var name = AllocateName(value); + var v = new ComponentValue { - unsafe - { - fixed (char* chars = value) - { - Encoding.UTF8.GetBytes(chars, value.Length, (byte*)ptr, byteCount); - } - } + kind = (byte)ComponentValueKind.String, + ownsHeap = 1, + }; + v.of.String = name; + return v; + } + + /// + /// Creates a value of kind with the given case name. + /// + /// + /// The returned value owns a heap-allocated UTF-8 buffer for the case name. Call after use. + /// + public static ComponentValue FromEnum(string caseName) + { + if (caseName is null) + { + throw new ArgumentNullException(nameof(caseName)); } + var name = AllocateName(caseName); var v = new ComponentValue { - kind = (byte)ComponentValueKind.String, + kind = (byte)ComponentValueKind.Enum, + ownsHeap = 1, + }; + v.of.Enumeration = name; + return v; + } + + /// + /// Creates a value of kind with the given set of flag names. + /// + /// + /// The returned value owns a heap-allocated array plus one buffer per flag name. Call after use. + /// + public static ComponentValue FromFlags(IReadOnlyList names) + { + if (names is null) + { + throw new ArgumentNullException(nameof(names)); + } + + var v = new ComponentValue + { + kind = (byte)ComponentValueKind.Flags, ownsHeap = 1, }; - v.of.String = new WasmName { Size = (UIntPtr)byteCount, Data = ptr }; + v.of.Flags = AllocateNameArray(names); return v; } @@ -257,16 +291,36 @@ public static ComponentValue FromString(string value) public string AsString() { ExpectKind(ComponentValueKind.String); - var size = checked((int)(uint)of.String.Size); - if (size == 0) + return DecodeName(of.String); + } + + /// Reads an enum case name as a managed string. + public string AsEnum() + { + ExpectKind(ComponentValueKind.Enum); + return DecodeName(of.Enumeration); + } + + /// Reads the set of flag names from a value. + public IReadOnlyList AsFlags() + { + ExpectKind(ComponentValueKind.Flags); + var count = checked((int)(uint)of.Flags.Size); + if (count == 0) { - return string.Empty; + return System.Array.Empty(); } + var result = new string[count]; unsafe { - return Encoding.UTF8.GetString((byte*)of.String.Data, size); + var array = (WasmName*)of.Flags.Data; + for (var i = 0; i < count; i++) + { + result[i] = DecodeName(array[i]); + } } + return result; } /// @@ -286,11 +340,13 @@ public void Free() switch ((ComponentValueKind)kind) { case ComponentValueKind.String: - if (of.String.Data != IntPtr.Zero) - { - Marshal.FreeHGlobal(of.String.Data); - of.String = default; - } + FreeName(ref of.String); + break; + case ComponentValueKind.Enum: + FreeName(ref of.Enumeration); + break; + case ComponentValueKind.Flags: + FreeNameArray(ref of.Flags); break; } @@ -304,6 +360,102 @@ private void ExpectKind(ComponentValueKind expected) throw new InvalidOperationException($"ComponentValue is of kind '{Kind}', not '{expected}'."); } } + + private static WasmName AllocateName(string value) + { + var byteCount = Encoding.UTF8.GetByteCount(value); + var ptr = byteCount == 0 ? IntPtr.Zero : Marshal.AllocHGlobal(byteCount); + if (byteCount > 0) + { + unsafe + { + fixed (char* chars = value) + { + Encoding.UTF8.GetBytes(chars, value.Length, (byte*)ptr, byteCount); + } + } + } + + return new WasmName { Size = (UIntPtr)byteCount, Data = ptr }; + } + + private static string DecodeName(WasmName name) + { + var size = checked((int)(uint)name.Size); + if (size == 0) + { + return string.Empty; + } + + unsafe + { + return Encoding.UTF8.GetString((byte*)name.Data, size); + } + } + + private static void FreeName(ref WasmName name) + { + if (name.Data != IntPtr.Zero) + { + Marshal.FreeHGlobal(name.Data); + name = default; + } + } + + private static unsafe ComponentValVec AllocateNameArray(IReadOnlyList names) + { + var n = names.Count; + if (n == 0) + { + return new ComponentValVec { Size = UIntPtr.Zero, Data = IntPtr.Zero }; + } + + var elementSize = sizeof(WasmName); + var arrayPtr = Marshal.AllocHGlobal(n * elementSize); + var array = (WasmName*)arrayPtr; + for (var i = 0; i < n; i++) + { + if (names[i] is null) + { + // Roll back already-allocated entries. + for (var j = 0; j < i; j++) + { + if (array[j].Data != IntPtr.Zero) + { + Marshal.FreeHGlobal(array[j].Data); + } + } + Marshal.FreeHGlobal(arrayPtr); + throw new ArgumentException("Flag names must not be null.", nameof(names)); + } + + array[i] = AllocateName(names[i]); + } + + return new ComponentValVec { Size = (UIntPtr)n, Data = arrayPtr }; + } + + private static unsafe void FreeNameArray(ref ComponentValVec vec) + { + if (vec.Data == IntPtr.Zero) + { + vec = default; + return; + } + + var n = checked((int)(uint)vec.Size); + var array = (WasmName*)vec.Data; + for (var i = 0; i < n; i++) + { + if (array[i].Data != IntPtr.Zero) + { + Marshal.FreeHGlobal(array[i].Data); + } + } + + Marshal.FreeHGlobal(vec.Data); + vec = default; + } } /// diff --git a/tests/ComponentValueTests.cs b/tests/ComponentValueTests.cs index e9bcbbe4..e550ca42 100644 --- a/tests/ComponentValueTests.cs +++ b/tests/ComponentValueTests.cs @@ -130,4 +130,66 @@ public void Free_OnPrimitiveIsNoOp() v.Free(); v.AsU32().Should().Be(7u); } + + [Fact] + public void Enum_RoundTrips() + { + var v = ComponentValue.FromEnum("high"); + try + { + v.Kind.Should().Be(ComponentValueKind.Enum); + v.AsEnum().Should().Be("high"); + } + finally + { + v.Free(); + } + } + + [Fact] + public void Enum_FromNullThrows() + { + Assert.Throws(() => ComponentValue.FromEnum(null!)); + } + + [Fact] + public void Flags_RoundTrips() + { + var v = ComponentValue.FromFlags(new[] { "read", "write", "execute" }); + try + { + v.Kind.Should().Be(ComponentValueKind.Flags); + v.AsFlags().Should().BeEquivalentTo(new[] { "read", "write", "execute" }, opts => opts.WithStrictOrdering()); + } + finally + { + v.Free(); + } + } + + [Fact] + public void Flags_EmptyRoundTrips() + { + var v = ComponentValue.FromFlags(System.Array.Empty()); + try + { + v.AsFlags().Should().BeEmpty(); + } + finally + { + v.Free(); + } + } + + [Fact] + public void Flags_FromNullThrows() + { + Assert.Throws(() => ComponentValue.FromFlags(null!)); + } + + [Fact] + public void Flags_FromNullElementThrowsAndCleansUp() + { + Assert.Throws(() => ComponentValue.FromFlags(new string[] { "first", null! })); + } } From 300451a7fef83a102fde66901fdda265a9dae0eb Mon Sep 17 00:00:00 2001 From: ZverGuy Date: Sun, 3 May 2026 00:56:52 +0300 Subject: [PATCH 08/26] feat(components): add List and Tuple marshalling List and Tuple share a `{ size_t size; wasmtime_component_val_t* data }` layout in the C union. Both are surfaced through symmetric APIs. - FromList(IReadOnlyList) and FromTuple(...) take ownership of the elements: callers must not Free them individually. - AsList()/AsTuple() return shallow copies of the underlying value array. - Free recursively frees each element before releasing the array buffer. Internal helpers AllocateValueArray, DecodeValueArray, and FreeValueArray centralise the logic so the same routines are reused for the eventual record-entry array in the next commit. Tests cover lists of primitives, lists of strings (verifies recursive Free), empty lists, mixed-type tuples, and the null-argument guard. Co-Authored-By: Claude Signed-off-by: ZverGuy --- src/Components/ComponentValue.cs | 128 +++++++++++++++++++++++++++++++ tests/ComponentValueTests.cs | 88 +++++++++++++++++++++ 2 files changed, 216 insertions(+) diff --git a/src/Components/ComponentValue.cs b/src/Components/ComponentValue.cs index 73316ca1..a5fb3972 100644 --- a/src/Components/ComponentValue.cs +++ b/src/Components/ComponentValue.cs @@ -251,6 +251,52 @@ public static ComponentValue FromFlags(IReadOnlyList names) return v; } + /// + /// Creates a value of kind from a sequence of elements. + /// + /// + /// Takes ownership of : callers must not call on the + /// individual elements afterwards. on the returned value releases the array and + /// recursively frees each element. + /// + public static ComponentValue FromList(IReadOnlyList elements) + { + if (elements is null) + { + throw new ArgumentNullException(nameof(elements)); + } + + var v = new ComponentValue + { + kind = (byte)ComponentValueKind.List, + ownsHeap = 1, + }; + v.of.List = AllocateValueArray(elements); + return v; + } + + /// + /// Creates a value of kind from a sequence of elements. + /// + /// + /// Same ownership semantics as . + /// + public static ComponentValue FromTuple(IReadOnlyList elements) + { + if (elements is null) + { + throw new ArgumentNullException(nameof(elements)); + } + + var v = new ComponentValue + { + kind = (byte)ComponentValueKind.Tuple, + ownsHeap = 1, + }; + v.of.Tuple = AllocateValueArray(elements); + return v; + } + /// Reads the value as ; throws if is not . public bool AsBool() { ExpectKind(ComponentValueKind.Bool); return of.Boolean != 0; } @@ -323,6 +369,27 @@ public IReadOnlyList AsFlags() return result; } + /// + /// Reads the elements of a value. + /// + /// + /// The returned values are shallow copies pointing at the same underlying buffers; do not call + /// on them — call it on the parent list value instead. + /// + public IReadOnlyList AsList() + { + ExpectKind(ComponentValueKind.List); + return DecodeValueArray(of.List); + } + + /// Reads the elements of a value. + /// Shares ownership rules with . + public IReadOnlyList AsTuple() + { + ExpectKind(ComponentValueKind.Tuple); + return DecodeValueArray(of.Tuple); + } + /// /// Releases any heap-allocated payload associated with this value (currently strings). /// @@ -348,6 +415,12 @@ public void Free() case ComponentValueKind.Flags: FreeNameArray(ref of.Flags); break; + case ComponentValueKind.List: + FreeValueArray(ref of.List); + break; + case ComponentValueKind.Tuple: + FreeValueArray(ref of.Tuple); + break; } ownsHeap = 0; @@ -456,6 +529,61 @@ private static unsafe void FreeNameArray(ref ComponentValVec vec) Marshal.FreeHGlobal(vec.Data); vec = default; } + + private static unsafe ComponentValVec AllocateValueArray(IReadOnlyList elements) + { + var n = elements.Count; + if (n == 0) + { + return new ComponentValVec { Size = UIntPtr.Zero, Data = IntPtr.Zero }; + } + + var elementSize = sizeof(ComponentValue); + var arrayPtr = Marshal.AllocHGlobal(n * elementSize); + var array = (ComponentValue*)arrayPtr; + for (var i = 0; i < n; i++) + { + array[i] = elements[i]; + } + + return new ComponentValVec { Size = (UIntPtr)n, Data = arrayPtr }; + } + + private static unsafe ComponentValue[] DecodeValueArray(ComponentValVec vec) + { + var n = checked((int)(uint)vec.Size); + if (n == 0) + { + return System.Array.Empty(); + } + + var result = new ComponentValue[n]; + var array = (ComponentValue*)vec.Data; + for (var i = 0; i < n; i++) + { + result[i] = array[i]; + } + return result; + } + + private static unsafe void FreeValueArray(ref ComponentValVec vec) + { + if (vec.Data == IntPtr.Zero) + { + vec = default; + return; + } + + var n = checked((int)(uint)vec.Size); + var array = (ComponentValue*)vec.Data; + for (var i = 0; i < n; i++) + { + array[i].Free(); + } + + Marshal.FreeHGlobal(vec.Data); + vec = default; + } } /// diff --git a/tests/ComponentValueTests.cs b/tests/ComponentValueTests.cs index e550ca42..93250e47 100644 --- a/tests/ComponentValueTests.cs +++ b/tests/ComponentValueTests.cs @@ -192,4 +192,92 @@ public void Flags_FromNullElementThrowsAndCleansUp() { Assert.Throws(() => ComponentValue.FromFlags(new string[] { "first", null! })); } + + [Fact] + public void List_OfPrimitivesRoundTrips() + { + var v = ComponentValue.FromList(new[] + { + ComponentValue.FromU32(1), + ComponentValue.FromU32(2), + ComponentValue.FromU32(3), + }); + try + { + v.Kind.Should().Be(ComponentValueKind.List); + var elements = v.AsList(); + elements.Should().HaveCount(3); + elements[0].AsU32().Should().Be(1u); + elements[1].AsU32().Should().Be(2u); + elements[2].AsU32().Should().Be(3u); + } + finally + { + v.Free(); + } + } + + [Fact] + public void List_OfStringsRoundTripsAndFreesRecursively() + { + var v = ComponentValue.FromList(new[] + { + ComponentValue.FromString("alpha"), + ComponentValue.FromString("beta"), + }); + try + { + var elements = v.AsList(); + elements[0].AsString().Should().Be("alpha"); + elements[1].AsString().Should().Be("beta"); + } + finally + { + v.Free(); + } + } + + [Fact] + public void List_EmptyRoundTrips() + { + var v = ComponentValue.FromList(System.Array.Empty()); + try + { + v.AsList().Should().BeEmpty(); + } + finally + { + v.Free(); + } + } + + [Fact] + public void Tuple_RoundTrips() + { + var v = ComponentValue.FromTuple(new[] + { + ComponentValue.FromString("answer"), + ComponentValue.FromU32(42), + ComponentValue.FromBool(true), + }); + try + { + v.Kind.Should().Be(ComponentValueKind.Tuple); + var elements = v.AsTuple(); + elements.Should().HaveCount(3); + elements[0].AsString().Should().Be("answer"); + elements[1].AsU32().Should().Be(42u); + elements[2].AsBool().Should().BeTrue(); + } + finally + { + v.Free(); + } + } + + [Fact] + public void List_FromNullThrows() + { + Assert.Throws(() => ComponentValue.FromList(null!)); + } } From d55adc07d77966d1c7ba45fc2d4e0a126e8295fb Mon Sep 17 00:00:00 2001 From: ZverGuy Date: Sun, 3 May 2026 00:58:28 +0300 Subject: [PATCH 09/26] feat(components): add Record marshalling MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds the Record case for ComponentValue, mirroring `wasmtime_component_valrecord_t` (vec of `wasmtime_component_valrecord_entry_t`). - ComponentValRecordEntry — internal layout for `{ wasm_name_t name; wasmtime_component_val_t val }`. Sequential layout means the entry is 16 + 32 = 48 bytes, matching the C struct exactly. - RecordField — public read-only record struct exposing the (name, value) pair to user code. - FromRecord(IReadOnlyList) and AsRecord() factories. - Free recursively frees each entry's name buffer and value, then the array itself; matches the cleanup pattern established for List. FromRecord rejects null field names and rolls back partially-allocated entries to avoid leaks. Tests cover round-trip with mixed value kinds (string + u32), empty record, null guard, and the rollback path. Co-Authored-By: Claude Signed-off-by: ZverGuy --- src/Components/ComponentValue.cs | 116 +++++++++++++++++++++++++++++++ tests/ComponentValueTests.cs | 54 ++++++++++++++ 2 files changed, 170 insertions(+) diff --git a/src/Components/ComponentValue.cs b/src/Components/ComponentValue.cs index a5fb3972..0164988f 100644 --- a/src/Components/ComponentValue.cs +++ b/src/Components/ComponentValue.cs @@ -297,6 +297,30 @@ public static ComponentValue FromTuple(IReadOnlyList elements) return v; } + /// + /// Creates a value of kind from a sequence of named fields. + /// + /// + /// Takes ownership of the field values: callers must not call on + /// afterwards. on the returned value releases + /// every name buffer and recursively frees every value. + /// + public static ComponentValue FromRecord(IReadOnlyList fields) + { + if (fields is null) + { + throw new ArgumentNullException(nameof(fields)); + } + + var v = new ComponentValue + { + kind = (byte)ComponentValueKind.Record, + ownsHeap = 1, + }; + v.of.Record = AllocateRecordEntries(fields); + return v; + } + /// Reads the value as ; throws if is not . public bool AsBool() { ExpectKind(ComponentValueKind.Bool); return of.Boolean != 0; } @@ -390,6 +414,29 @@ public IReadOnlyList AsTuple() return DecodeValueArray(of.Tuple); } + /// Reads the named fields of a value. + /// The returned values share ownership with the parent — do not Free them individually. + public IReadOnlyList AsRecord() + { + ExpectKind(ComponentValueKind.Record); + var n = checked((int)(uint)of.Record.Size); + if (n == 0) + { + return System.Array.Empty(); + } + + var result = new RecordField[n]; + unsafe + { + var entries = (ComponentValRecordEntry*)of.Record.Data; + for (var i = 0; i < n; i++) + { + result[i] = new RecordField(DecodeName(entries[i].Name), entries[i].Val); + } + } + return result; + } + /// /// Releases any heap-allocated payload associated with this value (currently strings). /// @@ -421,6 +468,9 @@ public void Free() case ComponentValueKind.Tuple: FreeValueArray(ref of.Tuple); break; + case ComponentValueKind.Record: + FreeRecordEntries(ref of.Record); + break; } ownsHeap = 0; @@ -584,6 +634,57 @@ private static unsafe void FreeValueArray(ref ComponentValVec vec) Marshal.FreeHGlobal(vec.Data); vec = default; } + + private static unsafe ComponentValVec AllocateRecordEntries(IReadOnlyList fields) + { + var n = fields.Count; + if (n == 0) + { + return new ComponentValVec { Size = UIntPtr.Zero, Data = IntPtr.Zero }; + } + + var entrySize = sizeof(ComponentValRecordEntry); + var arrayPtr = Marshal.AllocHGlobal(n * entrySize); + var entries = (ComponentValRecordEntry*)arrayPtr; + for (var i = 0; i < n; i++) + { + if (fields[i].Name is null) + { + for (var j = 0; j < i; j++) + { + FreeName(ref entries[j].Name); + entries[j].Val.Free(); + } + Marshal.FreeHGlobal(arrayPtr); + throw new ArgumentException("Record field name must not be null.", nameof(fields)); + } + + entries[i].Name = AllocateName(fields[i].Name); + entries[i].Val = fields[i].Value; + } + + return new ComponentValVec { Size = (UIntPtr)n, Data = arrayPtr }; + } + + private static unsafe void FreeRecordEntries(ref ComponentValVec vec) + { + if (vec.Data == IntPtr.Zero) + { + vec = default; + return; + } + + var n = checked((int)(uint)vec.Size); + var entries = (ComponentValRecordEntry*)vec.Data; + for (var i = 0; i < n; i++) + { + FreeName(ref entries[i].Name); + entries[i].Val.Free(); + } + + Marshal.FreeHGlobal(vec.Data); + vec = default; + } } /// @@ -629,6 +730,21 @@ internal struct ComponentValResult public IntPtr Val; } + /// + /// Mirror of wasmtime_component_valrecord_entry_t: a name and the value associated with it. + /// + [StructLayout(LayoutKind.Sequential)] + internal struct ComponentValRecordEntry + { + public WasmName Name; + public ComponentValue Val; + } + + /// + /// A single named field within a record value. + /// + public readonly record struct RecordField(string Name, ComponentValue Value); + /// /// Mirror of wasmtime_component_valunion_t. The largest case (variant) drives the size: 24 bytes. /// All cases overlap at offset 0 — at most one is valid at any time, indicated by . diff --git a/tests/ComponentValueTests.cs b/tests/ComponentValueTests.cs index 93250e47..386cdf69 100644 --- a/tests/ComponentValueTests.cs +++ b/tests/ComponentValueTests.cs @@ -280,4 +280,58 @@ public void List_FromNullThrows() { Assert.Throws(() => ComponentValue.FromList(null!)); } + + [Fact] + public void Record_RoundTrips() + { + var v = ComponentValue.FromRecord(new[] + { + new RecordField("name", ComponentValue.FromString("Alice")), + new RecordField("age", ComponentValue.FromU32(30)), + }); + try + { + v.Kind.Should().Be(ComponentValueKind.Record); + var fields = v.AsRecord(); + fields.Should().HaveCount(2); + fields[0].Name.Should().Be("name"); + fields[0].Value.AsString().Should().Be("Alice"); + fields[1].Name.Should().Be("age"); + fields[1].Value.AsU32().Should().Be(30u); + } + finally + { + v.Free(); + } + } + + [Fact] + public void Record_EmptyRoundTrips() + { + var v = ComponentValue.FromRecord(System.Array.Empty()); + try + { + v.AsRecord().Should().BeEmpty(); + } + finally + { + v.Free(); + } + } + + [Fact] + public void Record_FromNullThrows() + { + Assert.Throws(() => ComponentValue.FromRecord(null!)); + } + + [Fact] + public void Record_NullFieldNameRollsBack() + { + Assert.Throws(() => ComponentValue.FromRecord(new[] + { + new RecordField("first", ComponentValue.FromU32(1)), + new RecordField(null!, ComponentValue.FromU32(2)), + })); + } } From cb670c90044fb153a3b9582a4cc49c5509c70bd8 Mon Sep 17 00:00:00 2001 From: ZverGuy Date: Sun, 3 May 2026 01:00:18 +0300 Subject: [PATCH 10/26] feat(components): add Variant, Option, and Result marshalling MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit All three share the pattern of an optional payload pointer to a nested ComponentValue, so they're added together along with shared AllocateValuePtr/DecodeValuePtr/FreeValuePtr helpers. - FromVariant(string, ComponentValue?) takes a discriminant case name and optional payload; AsVariantDiscriminant/AsVariantPayload read them back. - FromOption(ComponentValue?) maps null to `none` and a value to `some`; HasOption/AsOption inspect the alternative. - FromOk(ComponentValue?) and FromErr(ComponentValue?) construct the two cases of `result`; IsOk/AsResultValue read them back. All factories take ownership of the supplied payload — a single recursive Free on the parent releases the heap-allocated nested value plus, for Variant, the discriminant name buffer. Tests cover with-payload and without-payload paths for each kind, discriminant null guards, and Option none/some. Co-Authored-By: Claude Signed-off-by: ZverGuy --- src/Components/ComponentValue.cs | 167 +++++++++++++++++++++++++++++++ tests/ComponentValueTests.cs | 116 +++++++++++++++++++++ 2 files changed, 283 insertions(+) diff --git a/src/Components/ComponentValue.cs b/src/Components/ComponentValue.cs index 0164988f..e0c5f934 100644 --- a/src/Components/ComponentValue.cs +++ b/src/Components/ComponentValue.cs @@ -321,6 +321,85 @@ public static ComponentValue FromRecord(IReadOnlyList fields) return v; } + /// + /// Creates a value of kind with a case discriminant and an optional payload. + /// + /// + /// Takes ownership of when supplied; do not call on it afterwards. + /// + public static ComponentValue FromVariant(string discriminant, ComponentValue? payload = null) + { + if (discriminant is null) + { + throw new ArgumentNullException(nameof(discriminant)); + } + + var v = new ComponentValue + { + kind = (byte)ComponentValueKind.Variant, + ownsHeap = 1, + }; + v.of.Variant = new ComponentValVariant + { + Discriminant = AllocateName(discriminant), + Val = AllocateValuePtr(payload), + }; + return v; + } + + /// + /// Creates a value of kind : for none, otherwise some(value). + /// + /// Takes ownership of when supplied; do not call on it afterwards. + public static ComponentValue FromOption(ComponentValue? value) + { + var v = new ComponentValue + { + kind = (byte)ComponentValueKind.Option, + ownsHeap = 1, + }; + v.of.Option = AllocateValuePtr(value); + return v; + } + + /// + /// Creates a value of kind in the ok case, optionally carrying a payload. + /// + /// Takes ownership of when supplied; do not call on it afterwards. + public static ComponentValue FromOk(ComponentValue? value = null) + { + var v = new ComponentValue + { + kind = (byte)ComponentValueKind.Result, + ownsHeap = 1, + }; + v.of.Result = new ComponentValResult + { + IsOk = 1, + Val = AllocateValuePtr(value), + }; + return v; + } + + /// + /// Creates a value of kind in the err case, optionally carrying a payload. + /// + /// Takes ownership of when supplied; do not call on it afterwards. + public static ComponentValue FromErr(ComponentValue? value = null) + { + var v = new ComponentValue + { + kind = (byte)ComponentValueKind.Result, + ownsHeap = 1, + }; + v.of.Result = new ComponentValResult + { + IsOk = 0, + Val = AllocateValuePtr(value), + }; + return v; + } + /// Reads the value as ; throws if is not . public bool AsBool() { ExpectKind(ComponentValueKind.Bool); return of.Boolean != 0; } @@ -414,6 +493,48 @@ public IReadOnlyList AsTuple() return DecodeValueArray(of.Tuple); } + /// Reads the discriminant of a value. + public string AsVariantDiscriminant() + { + ExpectKind(ComponentValueKind.Variant); + return DecodeName(of.Variant.Discriminant); + } + + /// Reads the optional payload of a value, or if the case has no payload. + public ComponentValue? AsVariantPayload() + { + ExpectKind(ComponentValueKind.Variant); + return DecodeValuePtr(of.Variant.Val); + } + + /// Indicates whether an value carries a some payload. + public bool HasOption() + { + ExpectKind(ComponentValueKind.Option); + return of.Option != IntPtr.Zero; + } + + /// Reads the optional payload of an value; for none. + public ComponentValue? AsOption() + { + ExpectKind(ComponentValueKind.Option); + return DecodeValuePtr(of.Option); + } + + /// Indicates whether a value is in the ok case. + public bool IsOk() + { + ExpectKind(ComponentValueKind.Result); + return of.Result.IsOk != 0; + } + + /// Reads the optional payload of a value; if the case has no payload. + public ComponentValue? AsResultValue() + { + ExpectKind(ComponentValueKind.Result); + return DecodeValuePtr(of.Result.Val); + } + /// Reads the named fields of a value. /// The returned values share ownership with the parent — do not Free them individually. public IReadOnlyList AsRecord() @@ -471,6 +592,19 @@ public void Free() case ComponentValueKind.Record: FreeRecordEntries(ref of.Record); break; + case ComponentValueKind.Variant: + FreeName(ref of.Variant.Discriminant); + FreeValuePtr(of.Variant.Val); + of.Variant.Val = IntPtr.Zero; + break; + case ComponentValueKind.Option: + FreeValuePtr(of.Option); + of.Option = IntPtr.Zero; + break; + case ComponentValueKind.Result: + FreeValuePtr(of.Result.Val); + of.Result = default; + break; } ownsHeap = 0; @@ -685,6 +819,39 @@ private static unsafe void FreeRecordEntries(ref ComponentValVec vec) Marshal.FreeHGlobal(vec.Data); vec = default; } + + private static unsafe IntPtr AllocateValuePtr(ComponentValue? value) + { + if (value is null) + { + return IntPtr.Zero; + } + + var ptr = Marshal.AllocHGlobal(sizeof(ComponentValue)); + *(ComponentValue*)ptr = value.Value; + return ptr; + } + + private static unsafe ComponentValue? DecodeValuePtr(IntPtr ptr) + { + if (ptr == IntPtr.Zero) + { + return null; + } + + return *(ComponentValue*)ptr; + } + + private static unsafe void FreeValuePtr(IntPtr ptr) + { + if (ptr == IntPtr.Zero) + { + return; + } + + ((ComponentValue*)ptr)->Free(); + Marshal.FreeHGlobal(ptr); + } } /// diff --git a/tests/ComponentValueTests.cs b/tests/ComponentValueTests.cs index 386cdf69..0fefbaec 100644 --- a/tests/ComponentValueTests.cs +++ b/tests/ComponentValueTests.cs @@ -334,4 +334,120 @@ public void Record_NullFieldNameRollsBack() new RecordField(null!, ComponentValue.FromU32(2)), })); } + + [Fact] + public void Variant_WithPayloadRoundTrips() + { + var v = ComponentValue.FromVariant("formal", ComponentValue.FromString("Sir")); + try + { + v.Kind.Should().Be(ComponentValueKind.Variant); + v.AsVariantDiscriminant().Should().Be("formal"); + var payload = v.AsVariantPayload(); + payload.Should().NotBeNull(); + payload!.Value.AsString().Should().Be("Sir"); + } + finally + { + v.Free(); + } + } + + [Fact] + public void Variant_WithoutPayloadRoundTrips() + { + var v = ComponentValue.FromVariant("none"); + try + { + v.AsVariantDiscriminant().Should().Be("none"); + v.AsVariantPayload().Should().BeNull(); + } + finally + { + v.Free(); + } + } + + [Fact] + public void Variant_NullDiscriminantThrows() + { + Assert.Throws(() => ComponentValue.FromVariant(null!)); + } + + [Fact] + public void Option_NoneRoundTrips() + { + var v = ComponentValue.FromOption(null); + try + { + v.Kind.Should().Be(ComponentValueKind.Option); + v.HasOption().Should().BeFalse(); + v.AsOption().Should().BeNull(); + } + finally + { + v.Free(); + } + } + + [Fact] + public void Option_SomeRoundTrips() + { + var v = ComponentValue.FromOption(ComponentValue.FromU32(7)); + try + { + v.HasOption().Should().BeTrue(); + v.AsOption()!.Value.AsU32().Should().Be(7u); + } + finally + { + v.Free(); + } + } + + [Fact] + public void Result_OkRoundTrips() + { + var v = ComponentValue.FromOk(ComponentValue.FromString("done")); + try + { + v.Kind.Should().Be(ComponentValueKind.Result); + v.IsOk().Should().BeTrue(); + v.AsResultValue()!.Value.AsString().Should().Be("done"); + } + finally + { + v.Free(); + } + } + + [Fact] + public void Result_ErrRoundTrips() + { + var v = ComponentValue.FromErr(ComponentValue.FromString("nope")); + try + { + v.IsOk().Should().BeFalse(); + v.AsResultValue()!.Value.AsString().Should().Be("nope"); + } + finally + { + v.Free(); + } + } + + [Fact] + public void Result_OkWithoutPayload() + { + var v = ComponentValue.FromOk(); + try + { + v.IsOk().Should().BeTrue(); + v.AsResultValue().Should().BeNull(); + } + finally + { + v.Free(); + } + } } From cf74ac00754cc1b8a46bc94cc9b2f9e23eff736e Mon Sep 17 00:00:00 2001 From: ZverGuy Date: Sun, 3 May 2026 01:30:09 +0300 Subject: [PATCH 11/26] fix(components): correct WasmtimeComponentFunc layout to 24 bytes The C header declares wasmtime_component_func_t as struct { struct { uint64_t store_id; uint32_t __private1; }; // anonymous nested struct, padded to 16 bytes for 8-byte alignment uint32_t __private2; }; // outer trailing padding -> 24 bytes total The Rust side asserts this size in crates/wasmtime/src/runtime/component/func.rs via #[repr(C)] struct T(u64, u32); #[repr(C)] struct C(T, u32); assert!(size_of::() == size_of::()); C# `[StructLayout(LayoutKind.Sequential)]` does not insert the inner anonymous-struct's trailing padding, so the previous declaration came out to 16 bytes. wasmtime would then write 24 bytes through the pointer, corrupting the eight bytes immediately past the struct. Symptoms ranged from working-by-luck (add, origin, range, greet, find, pair) to wasmtime returning the wrong function (top-priority returned a record-typed value because the corrupted upper half of the Func referenced a different ExportIndex; safe-divide reported "expected 0 args" for the same reason). Switching to LayoutKind.Explicit with Size = 24 and explicit field offsets matches the Rust layout exactly and resolves the previously flaky composite e2e cases. Co-Authored-By: Claude Signed-off-by: ZverGuy --- src/Components/ComponentFunction.cs | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/Components/ComponentFunction.cs b/src/Components/ComponentFunction.cs index 45d9612b..a7b2c19b 100644 --- a/src/Components/ComponentFunction.cs +++ b/src/Components/ComponentFunction.cs @@ -116,13 +116,16 @@ public static extern unsafe IntPtr wasmtime_component_func_post_return( } /// - /// Mirror of wasmtime_component_func_t — value-typed handle (16 bytes: store_id + two private indices). + /// Mirror of wasmtime_component_func_t. The C header declares an anonymous nested + /// struct, which carries trailing padding to satisfy 8-byte alignment, so the actual size + /// is 24 bytes (not the 16 a flat reading suggests). The Rust side enforces this layout via + /// a const assertion in crates/wasmtime/src/runtime/component/func.rs. /// - [StructLayout(LayoutKind.Sequential)] + [StructLayout(LayoutKind.Explicit, Size = 24)] internal struct WasmtimeComponentFunc { - public ulong StoreId; - public uint Private1; - public uint Private2; + [FieldOffset(0)] public ulong StoreId; + [FieldOffset(8)] public uint Private1; + [FieldOffset(16)] public uint Private2; } } From ed2c0f21061117127fe97507eb0fb0a20c8853f1 Mon Sep 17 00:00:00 2001 From: ZverGuy Date: Sun, 3 May 2026 01:39:35 +0300 Subject: [PATCH 12/26] test(components): cargo-component fixture exercising every WASI 0.2 composite MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds an end-to-end fixture covering every composite kind ComponentValue supports: record, list, enum, flags, variant (with payload), result (ok and err), option (some and none), tuple. Hand-written component WAT for composite return types proved impractical because the lifted function signatures require explicit `(import "T" (type (eq ...)))` declarations that don't compose well outside of full WIT tooling, so the fixture is authored as WIT and compiled by cargo-component instead. Layout: - tests/Components/fixtures.wit — reference WIT mirrored into the crate. - tests/Components/fixtures-src/ — minimal cargo-component crate (Cargo.toml + src/lib.rs + wit/world.wit + .gitignore). Building it requires `cargo component build --release` from a Rust toolchain with the `wasm32-wasip1` target; the crate is tiny (~50 LOC) and depends only on `wit-bindgen-rt`. - tests/Components/fixtures.wasm — pre-built artifact (47 KB) embedded as a resource so the test suite does not require a Rust toolchain at runtime. To rebuild, run cargo component build in fixtures-src/ and copy the produced .wasm. - tests/ComponentCompositesTests.cs — 9 e2e tests, each instantiates the component, looks up an export, calls it, and validates the result. - src/Components/IsExternalInit.cs — polyfill needed for `record struct` when targeting netstandard2.0 / netstandard2.1. Tests: - Origin returning record (point { x, y }). - Range returning list. - TopPriority returning enum case "high". - Defaults returning flags { read, write }. - Greet returning variant case "formal" with string payload. - SafeDivide returning result for both ok and err paths. - Find returning option for both some and none paths. - Pair returning tuple. Total test count: 54 passing (unit-level layout tests + the new end-to-end fixture coverage). Co-Authored-By: Claude Signed-off-by: ZverGuy --- src/Components/IsExternalInit.cs | 11 + tests/ComponentCompositesTests.cs | 271 ++++++++++++++++++++ tests/Components/fixtures-src/.gitignore | 3 + tests/Components/fixtures-src/Cargo.toml | 18 ++ tests/Components/fixtures-src/src/lib.rs | 54 ++++ tests/Components/fixtures-src/wit/world.wit | 39 +++ tests/Components/fixtures.wasm | Bin 0 -> 47791 bytes tests/Components/fixtures.wit | 39 +++ tests/Wasmtime.Tests.csproj | 2 + 9 files changed, 437 insertions(+) create mode 100644 src/Components/IsExternalInit.cs create mode 100644 tests/ComponentCompositesTests.cs create mode 100644 tests/Components/fixtures-src/.gitignore create mode 100644 tests/Components/fixtures-src/Cargo.toml create mode 100644 tests/Components/fixtures-src/src/lib.rs create mode 100644 tests/Components/fixtures-src/wit/world.wit create mode 100644 tests/Components/fixtures.wasm create mode 100644 tests/Components/fixtures.wit diff --git a/src/Components/IsExternalInit.cs b/src/Components/IsExternalInit.cs new file mode 100644 index 00000000..a2d0d29e --- /dev/null +++ b/src/Components/IsExternalInit.cs @@ -0,0 +1,11 @@ +#if NETSTANDARD2_0 || NETSTANDARD2_1 +namespace System.Runtime.CompilerServices +{ + // Polyfill required by C# 9+ records / init-only setters when targeting frameworks + // earlier than .NET 5. Marked internal so it is per-assembly and does not collide + // with the runtime-provided definition on net5.0+. + internal static class IsExternalInit + { + } +} +#endif diff --git a/tests/ComponentCompositesTests.cs b/tests/ComponentCompositesTests.cs new file mode 100644 index 00000000..a34e5623 --- /dev/null +++ b/tests/ComponentCompositesTests.cs @@ -0,0 +1,271 @@ +using System; +using System.IO; +using System.Reflection; +using FluentAssertions; +using Wasmtime.Components; +using Xunit; + +namespace Wasmtime.Tests; + +public class ComponentCompositesTests +{ + private static byte[] LoadFixture(string name) + { + using var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(name) + ?? throw new FileNotFoundException($"Embedded fixture '{name}' not found."); + using var ms = new MemoryStream(); + stream.CopyTo(ms); + return ms.ToArray(); + } + + private sealed class Fixture : IDisposable + { + public Engine Engine { get; } + public Component Component { get; } + public ComponentLinker Linker { get; } + public Store Store { get; } + public ComponentInstance Instance { get; } + + public Fixture() + { + Engine = new Engine(); + Component = Component.FromBytes(Engine, LoadFixture("fixtures.wasm")); + Linker = new ComponentLinker(Engine); + Store = new Store(Engine); + + Store.SetWasiConfiguration(new WasiConfiguration()); + Linker.AddWasiPreview2(); + + Instance = Linker.Instantiate(Store, Component); + } + + public void Dispose() + { + Store.Dispose(); + Linker.Dispose(); + Component.Dispose(); + Engine.Dispose(); + } + } + + [Fact] + public void Origin_ReturnsRecord() + { + using var fixture = new Fixture(); + var func = fixture.Instance.GetFunction("origin"); + func.Should().NotBeNull(); + + var results = new ComponentValue[1]; + try + { + func!.Call(ReadOnlySpan.Empty, results); + + results[0].Kind.Should().Be(ComponentValueKind.Record); + var fields = results[0].AsRecord(); + fields.Should().HaveCount(2); + fields[0].Name.Should().Be("x"); + fields[0].Value.AsU32().Should().Be(3u); + fields[1].Name.Should().Be("y"); + fields[1].Value.AsU32().Should().Be(4u); + } + finally + { + results[0].Free(); + } + } + + [Fact] + public void Range_ReturnsList() + { + using var fixture = new Fixture(); + var func = fixture.Instance.GetFunction("range"); + func.Should().NotBeNull(); + + var results = new ComponentValue[1]; + try + { + func!.Call(ReadOnlySpan.Empty, results); + + results[0].Kind.Should().Be(ComponentValueKind.List); + var elements = results[0].AsList(); + elements.Should().HaveCount(3); + elements[0].AsU32().Should().Be(10u); + elements[1].AsU32().Should().Be(20u); + elements[2].AsU32().Should().Be(30u); + } + finally + { + results[0].Free(); + } + } + + [Fact] + public void TopPriority_ReturnsEnum() + { + using var fixture = new Fixture(); + var func = fixture.Instance.GetFunction("top-priority"); + func.Should().NotBeNull(); + + var results = new ComponentValue[1]; + try + { + func!.Call(ReadOnlySpan.Empty, results); + + results[0].Kind.Should().Be(ComponentValueKind.Enum); + results[0].AsEnum().Should().Be("high"); + } + finally + { + results[0].Free(); + } + } + + [Fact] + public void Defaults_ReturnsFlags() + { + using var fixture = new Fixture(); + var func = fixture.Instance.GetFunction("defaults"); + func.Should().NotBeNull(); + + var results = new ComponentValue[1]; + try + { + func!.Call(ReadOnlySpan.Empty, results); + + results[0].Kind.Should().Be(ComponentValueKind.Flags); + results[0].AsFlags().Should().BeEquivalentTo(new[] { "read", "write" }); + } + finally + { + results[0].Free(); + } + } + + [Fact] + public void Greet_ReturnsVariantWithPayload() + { + using var fixture = new Fixture(); + var func = fixture.Instance.GetFunction("greet"); + func.Should().NotBeNull(); + + var args = new[] { ComponentValue.FromBool(true) }; + var results = new ComponentValue[1]; + try + { + func!.Call(args, results); + + results[0].Kind.Should().Be(ComponentValueKind.Variant); + results[0].AsVariantDiscriminant().Should().Be("formal"); + var payload = results[0].AsVariantPayload(); + payload.Should().NotBeNull(); + payload!.Value.AsString().Should().Be("Sir"); + } + finally + { + results[0].Free(); + } + } + + [Fact] + public void SafeDivide_ReturnsOk() + { + using var fixture = new Fixture(); + var func = fixture.Instance.GetFunction("safe-divide"); + func.Should().NotBeNull(); + + var args = new[] { ComponentValue.FromU32(10), ComponentValue.FromU32(2) }; + var results = new ComponentValue[1]; + try + { + func!.Call(args, results); + + results[0].Kind.Should().Be(ComponentValueKind.Result); + results[0].IsOk().Should().BeTrue(); + results[0].AsResultValue()!.Value.AsU32().Should().Be(5u); + } + finally + { + results[0].Free(); + } + } + + [Fact] + public void SafeDivide_ReturnsErr() + { + using var fixture = new Fixture(); + var func = fixture.Instance.GetFunction("safe-divide"); + func.Should().NotBeNull(); + + var args = new[] { ComponentValue.FromU32(10), ComponentValue.FromU32(0) }; + var results = new ComponentValue[1]; + try + { + func!.Call(args, results); + + results[0].Kind.Should().Be(ComponentValueKind.Result); + results[0].IsOk().Should().BeFalse(); + results[0].AsResultValue()!.Value.AsString().Should().Be("division by zero"); + } + finally + { + results[0].Free(); + } + } + + [Fact] + public void Find_ReturnsSomeAndNone() + { + using var fixture = new Fixture(); + var func = fixture.Instance.GetFunction("find"); + func.Should().NotBeNull(); + + var some = new ComponentValue[1]; + try + { + func!.Call(new[] { ComponentValue.FromU32(42) }, some); + some[0].Kind.Should().Be(ComponentValueKind.Option); + some[0].HasOption().Should().BeTrue(); + some[0].AsOption()!.Value.AsString().Should().Be("answer"); + } + finally + { + some[0].Free(); + } + + var none = new ComponentValue[1]; + try + { + func!.Call(new[] { ComponentValue.FromU32(0) }, none); + none[0].HasOption().Should().BeFalse(); + none[0].AsOption().Should().BeNull(); + } + finally + { + none[0].Free(); + } + } + + [Fact] + public void Pair_ReturnsTuple() + { + using var fixture = new Fixture(); + var func = fixture.Instance.GetFunction("pair"); + func.Should().NotBeNull(); + + var results = new ComponentValue[1]; + try + { + func!.Call(ReadOnlySpan.Empty, results); + + results[0].Kind.Should().Be(ComponentValueKind.Tuple); + var elements = results[0].AsTuple(); + elements.Should().HaveCount(2); + elements[0].AsU32().Should().Be(7u); + elements[1].AsString().Should().Be("seven"); + } + finally + { + results[0].Free(); + } + } +} diff --git a/tests/Components/fixtures-src/.gitignore b/tests/Components/fixtures-src/.gitignore new file mode 100644 index 00000000..b97e7f49 --- /dev/null +++ b/tests/Components/fixtures-src/.gitignore @@ -0,0 +1,3 @@ +/target +/src/bindings.rs +/Cargo.lock diff --git a/tests/Components/fixtures-src/Cargo.toml b/tests/Components/fixtures-src/Cargo.toml new file mode 100644 index 00000000..f68d0b57 --- /dev/null +++ b/tests/Components/fixtures-src/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "fixtures" +version = "0.1.0" +edition = "2024" + +[dependencies] +wit-bindgen-rt = { version = "0.44.0", features = ["bitflags"] } + +[lib] +crate-type = ["cdylib"] + +[package.metadata.component] +package = "wasmtime:tests" + +[profile.release] +opt-level = "s" +lto = true +strip = true diff --git a/tests/Components/fixtures-src/src/lib.rs b/tests/Components/fixtures-src/src/lib.rs new file mode 100644 index 00000000..218fcd1d --- /dev/null +++ b/tests/Components/fixtures-src/src/lib.rs @@ -0,0 +1,54 @@ +#[allow(warnings)] +mod bindings; + +use bindings::{Greeting, Guest, Permissions, Point, Priority}; + +struct Component; + +impl Guest for Component { + fn origin() -> Point { + Point { x: 3, y: 4 } + } + + fn range() -> Vec { + vec![10, 20, 30] + } + + fn top_priority() -> Priority { + Priority::High + } + + fn defaults() -> Permissions { + Permissions::READ | Permissions::WRITE + } + + fn greet(formal: bool) -> Greeting { + if formal { + Greeting::Formal("Sir".into()) + } else { + Greeting::Casual("hi".into()) + } + } + + fn safe_divide(n: u32, d: u32) -> Result { + if d == 0 { + Err("division by zero".into()) + } else { + Ok(n / d) + } + } + + fn find(needle: u32) -> Option { + if needle == 42 { + Some("answer".into()) + } else { + None + } + } + + fn pair() -> (u32, String) { + (7, "seven".into()) + } +} + +bindings::export!(Component with_types_in bindings); diff --git a/tests/Components/fixtures-src/wit/world.wit b/tests/Components/fixtures-src/wit/world.wit new file mode 100644 index 00000000..10701c06 --- /dev/null +++ b/tests/Components/fixtures-src/wit/world.wit @@ -0,0 +1,39 @@ +package wasmtime:tests@0.1.0; + +/// Reference WIT for the composite-types e2e fixture. Mirrored at +/// `fixtures-src/wit/world.wit` so cargo-component can compile the Rust +/// implementation in `fixtures-src/` into the resulting `fixtures.wasm` +/// component used by `ComponentCompositesTests`. +world fixture { + record point { + x: u32, + y: u32, + } + + enum priority { + low, + medium, + high, + } + + flags permissions { + read, + write, + execute, + } + + variant greeting { + formal(string), + casual(string), + none, + } + + export origin: func() -> point; + export range: func() -> list; + export top-priority: func() -> priority; + export defaults: func() -> permissions; + export greet: func(formal: bool) -> greeting; + export safe-divide: func(n: u32, d: u32) -> result; + export find: func(needle: u32) -> option; + export pair: func() -> tuple; +} diff --git a/tests/Components/fixtures.wasm b/tests/Components/fixtures.wasm new file mode 100644 index 0000000000000000000000000000000000000000..fd268aadc04595c57cf7f588e7c766466e23f16e GIT binary patch literal 47791 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 E0B9gC1ONa4 literal 0 HcmV?d00001 diff --git a/tests/Components/fixtures.wit b/tests/Components/fixtures.wit new file mode 100644 index 00000000..10701c06 --- /dev/null +++ b/tests/Components/fixtures.wit @@ -0,0 +1,39 @@ +package wasmtime:tests@0.1.0; + +/// Reference WIT for the composite-types e2e fixture. Mirrored at +/// `fixtures-src/wit/world.wit` so cargo-component can compile the Rust +/// implementation in `fixtures-src/` into the resulting `fixtures.wasm` +/// component used by `ComponentCompositesTests`. +world fixture { + record point { + x: u32, + y: u32, + } + + enum priority { + low, + medium, + high, + } + + flags permissions { + read, + write, + execute, + } + + variant greeting { + formal(string), + casual(string), + none, + } + + export origin: func() -> point; + export range: func() -> list; + export top-priority: func() -> priority; + export defaults: func() -> permissions; + export greet: func(formal: bool) -> greeting; + export safe-divide: func(n: u32, d: u32) -> result; + export find: func(needle: u32) -> option; + export pair: func() -> tuple; +} diff --git a/tests/Wasmtime.Tests.csproj b/tests/Wasmtime.Tests.csproj index fecd3653..df747674 100644 --- a/tests/Wasmtime.Tests.csproj +++ b/tests/Wasmtime.Tests.csproj @@ -26,6 +26,8 @@ + + From e6a4d3a23a0078e22125a9cf356e37868d1c08ef Mon Sep 17 00:00:00 2001 From: ZverGuy Date: Sun, 3 May 2026 01:46:14 +0300 Subject: [PATCH 13/26] feat(components): host-defined imports via ComponentLinkerInstance.DefineFunc MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds the bidirectional path: components can now call back into managed code through host-defined functions registered on the linker. Surface: - ComponentFuncCallback delegate: idiomatic `(ReadOnlySpan args, Span results)` signature exposed to user code. - ComponentLinkerInstance.DefineFunc(name, callback): wraps wasmtime_component_linker_instance_add_func with a static native trampoline. The user delegate is rooted via a GCHandle stored as the callback's `data` pointer; a paired finalizer frees the handle when wasmtime drops the entry (linker disposal). Exceptions thrown inside the callback are converted to a wasmtime_error_t via wasmtime_error_new and surface to the host as WasmtimeException. Test fixture: tests/Components/host-add.wat — a tiny component that imports `host-add: func(a: u32, b: u32) -> u32` and re-exports it as `compute`, providing an end-to-end harness for lifting (host args -> guest) and lowering (guest result -> host). Tests cover both: - HostAdd_IsInvokedAndResultLifted — verifies the host function was called exactly once, arguments lowered correctly, and the lifted result equals the host's computed value. - HostAdd_ExceptionPropagatesAsTrap — verifies that throwing inside the callback is converted to a WasmtimeException whose message contains the original exception text. Total component-test count: 56 passing. Co-Authored-By: Claude Signed-off-by: ZverGuy --- src/Components/ComponentLinkerInstance.cs | 148 ++++++++++++++++++++++ tests/ComponentHostFuncTests.cs | 79 ++++++++++++ tests/Components/host-add.wasm | Bin 0 -> 284 bytes tests/Components/host-add.wat | 21 +++ tests/Wasmtime.Tests.csproj | 3 +- 5 files changed, 250 insertions(+), 1 deletion(-) create mode 100644 tests/ComponentHostFuncTests.cs create mode 100644 tests/Components/host-add.wasm create mode 100644 tests/Components/host-add.wat diff --git a/src/Components/ComponentLinkerInstance.cs b/src/Components/ComponentLinkerInstance.cs index 9cea8eaa..bb138fd7 100644 --- a/src/Components/ComponentLinkerInstance.cs +++ b/src/Components/ComponentLinkerInstance.cs @@ -1,9 +1,25 @@ using System; +using System.Collections.Generic; using System.Runtime.InteropServices; +using System.Text; using Microsoft.Win32.SafeHandles; namespace Wasmtime.Components { + /// + /// Callback signature for host-defined component functions. + /// + /// The arguments passed by the component. + /// A span sized to the number of results expected by the function. + /// The callback must populate every element. + /// + /// Throwing from a callback surfaces as a wasmtime trap; the message is taken from + /// . + /// + public delegate void ComponentFuncCallback( + ReadOnlySpan arguments, + Span results); + /// /// Represents an instance scope within a in which functions, /// modules, and nested instances can be defined. @@ -47,6 +63,56 @@ public ComponentLinkerInstance Instance(string name) } } + /// + /// Defines a host function that components can import under the given . + /// + /// The name to expose the function under. + /// The C# implementation invoked when the component calls the function. + /// + /// The is rooted via a managed handle for the lifetime of the + /// linker; when the linker is disposed the handle is released. Inside the callback you can + /// read arguments and write results — both spans share the + /// underlying buffers wasmtime owns, so do not hold them past the call. + /// + public void DefineFunc(string name, ComponentFuncCallback callback) + { + if (name is null) + { + throw new ArgumentNullException(nameof(name)); + } + + if (callback is null) + { + throw new ArgumentNullException(nameof(callback)); + } + + var entry = new HostCallback(callback); + var handle = GCHandle.Alloc(entry); + var data = GCHandle.ToIntPtr(handle); + + var nameBytes = Encoding.UTF8.GetBytes(name); + unsafe + { + fixed (byte* ptr = nameBytes) + { + var error = Native.wasmtime_component_linker_instance_add_func( + NativeHandle, + ptr, + (UIntPtr)nameBytes.Length, + HostCallback.NativeTrampoline, + data, + HostCallback.NativeFinalizer); + + if (error != IntPtr.Zero) + { + // Drop the GCHandle since wasmtime won't call the finalizer on failure. + handle.Free(); + throw WasmtimeException.FromOwnedError(error); + } + } + } + } + /// /// Defines a core within this instance, providing it as an import to a component. /// @@ -142,8 +208,90 @@ public static extern unsafe IntPtr wasmtime_component_linker_instance_add_module byte* name, UIntPtr nameLength, Module.Handle module); + + [DllImport(Engine.LibraryName)] + public static extern unsafe IntPtr wasmtime_component_linker_instance_add_func( + Handle linkerInstance, + byte* name, + UIntPtr nameLength, + HostCallback.NativeCallbackDelegate callback, + IntPtr data, + HostCallback.NativeFinalizerDelegate finalizer); + + [DllImport(Engine.LibraryName)] + public static extern IntPtr wasmtime_error_new([MarshalAs(Extensions.LPUTF8Str)] string message); } private readonly Handle handle; + + internal sealed class HostCallback + { + internal delegate IntPtr NativeCallbackDelegate( + IntPtr data, + IntPtr context, + IntPtr args, + UIntPtr argsLength, + IntPtr results, + UIntPtr resultsLength); + + internal delegate void NativeFinalizerDelegate(IntPtr data); + + internal static readonly NativeCallbackDelegate NativeTrampoline = TrampolineImpl; + internal static readonly NativeFinalizerDelegate NativeFinalizer = FinalizerImpl; + + private readonly ComponentFuncCallback callback; + + internal HostCallback(ComponentFuncCallback callback) + { + this.callback = callback; + } + + private static IntPtr TrampolineImpl( + IntPtr data, + IntPtr context, + IntPtr args, + UIntPtr argsLength, + IntPtr results, + UIntPtr resultsLength) + { + try + { + var handle = GCHandle.FromIntPtr(data); + var entry = (HostCallback)handle.Target!; + + unsafe + { + var argSpan = new ReadOnlySpan( + (ComponentValue*)args, + checked((int)(uint)argsLength)); + var resultSpan = new Span( + (ComponentValue*)results, + checked((int)(uint)resultsLength)); + + entry.callback(argSpan, resultSpan); + } + + return IntPtr.Zero; + } + catch (Exception ex) + { + return Native.wasmtime_error_new(ex.Message); + } + } + + private static void FinalizerImpl(IntPtr data) + { + if (data == IntPtr.Zero) + { + return; + } + + var handle = GCHandle.FromIntPtr(data); + if (handle.IsAllocated) + { + handle.Free(); + } + } + } } } diff --git a/tests/ComponentHostFuncTests.cs b/tests/ComponentHostFuncTests.cs new file mode 100644 index 00000000..df76a37b --- /dev/null +++ b/tests/ComponentHostFuncTests.cs @@ -0,0 +1,79 @@ +using System; +using System.IO; +using System.Reflection; +using FluentAssertions; +using Wasmtime.Components; +using Xunit; + +namespace Wasmtime.Tests; + +public class ComponentHostFuncTests +{ + private static byte[] LoadFixture(string name) + { + using var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(name) + ?? throw new FileNotFoundException($"Embedded fixture '{name}' not found."); + using var ms = new MemoryStream(); + stream.CopyTo(ms); + return ms.ToArray(); + } + + [Fact] + public void HostAdd_IsInvokedAndResultLifted() + { + var bytes = LoadFixture("host-add.wasm"); + + using var engine = new Engine(); + using var component = Component.FromBytes(engine, bytes); + using var linker = new ComponentLinker(engine); + using var store = new Store(engine); + + var hostInvocations = 0; + using var root = linker.Root(); + root.DefineFunc("host-add", (args, results) => + { + hostInvocations++; + var a = args[0].AsU32(); + var b = args[1].AsU32(); + results[0] = ComponentValue.FromU32(a + b); + }); + + var instance = linker.Instantiate(store, component); + var compute = instance.GetFunction("compute"); + compute.Should().NotBeNull(); + + var argv = new[] { ComponentValue.FromU32(40), ComponentValue.FromU32(2) }; + var rets = new ComponentValue[1]; + + compute!.Call(argv, rets); + + hostInvocations.Should().Be(1); + rets[0].AsU32().Should().Be(42u); + } + + [Fact] + public void HostAdd_ExceptionPropagatesAsTrap() + { + var bytes = LoadFixture("host-add.wasm"); + + using var engine = new Engine(); + using var component = Component.FromBytes(engine, bytes); + using var linker = new ComponentLinker(engine); + using var store = new Store(engine); + + using var root = linker.Root(); + root.DefineFunc("host-add", (args, results) => + { + throw new InvalidOperationException("host failure"); + }); + + var instance = linker.Instantiate(store, component); + var compute = instance.GetFunction("compute"); + + var argv = new[] { ComponentValue.FromU32(1), ComponentValue.FromU32(2) }; + var rets = new ComponentValue[1]; + + Action act = () => compute!.Call(argv, rets); + act.Should().Throw().WithMessage("*host failure*"); + } +} diff --git a/tests/Components/host-add.wasm b/tests/Components/host-add.wasm new file mode 100644 index 0000000000000000000000000000000000000000..13bcd1f7a881b1a4833ad9c1ec265a0962d93201 GIT binary patch literal 284 zcmY*UI}UY%`;^&*js)9;ek0l literal 0 HcmV?d00001 diff --git a/tests/Components/host-add.wat b/tests/Components/host-add.wat new file mode 100644 index 00000000..6321a4f5 --- /dev/null +++ b/tests/Components/host-add.wat @@ -0,0 +1,21 @@ +;; Component that imports `host:math/add: func(a: u32, b: u32) -> u32` from +;; the host and re-exports it as `compute` so a host can verify the +;; round-trip through wasmtime's lowering/lifting machinery. +(component + (import "host-add" (func $host-add (param "a" u32) (param "b" u32) (result u32))) + + (core func $core-add (canon lower (func $host-add))) + + (core module $m + (func (import "imports" "host-add") (param i32 i32) (result i32)) + (func (export "compute") (param i32 i32) (result i32) + local.get 0 + local.get 1 + call 0)) + + (core instance $imports (export "host-add" (func $core-add))) + (core instance $i (instantiate $m (with "imports" (instance $imports)))) + + (func $compute (param "a" u32) (param "b" u32) (result u32) + (canon lift (core func $i "compute"))) + (export "compute" (func $compute))) diff --git a/tests/Wasmtime.Tests.csproj b/tests/Wasmtime.Tests.csproj index df747674..2f5aea7b 100644 --- a/tests/Wasmtime.Tests.csproj +++ b/tests/Wasmtime.Tests.csproj @@ -26,7 +26,8 @@ - + + From 77aed29ebd51bae8e66e0d1e039cc54c4f2dbd07 Mon Sep 17 00:00:00 2001 From: ZverGuy Date: Sun, 3 May 2026 01:49:11 +0300 Subject: [PATCH 14/26] feat(components): Roslyn source generator skeleton + [ComponentBindings] attribute MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Stands up the source-generator pipeline that subsequent commits will use to turn WIT files into idiomatic C# bindings. Pieces: - src/Components/ComponentBindingsAttribute.cs — public attribute users put on a partial class: `[ComponentBindings("path/to/world.wit", world: "...")]`. Lives in the main Wasmtime assembly so consumers don't need a separate package reference for the attribute. - src/Wasmtime.Component.SourceGenerators/ — new Roslyn analyzer project (netstandard2.0) implementing IIncrementalGenerator. Pipelines: ForAttributeWithMetadataName(ComponentBindingsAttribute) combined with AdditionalTextsProvider filtered to `*.wit`. Emits a placeholder partial class containing `WitPath`/`WitWorld`/`WitSourceLength` constants so the generator's wiring is visible in tests; real type/function emission lands in the next commits. - src/Wasmtime.Component.SourceGenerators/Diagnostics/Descriptors.cs — WIT010/WIT018/WIT019/WIT020 placeholders for the diagnostic-id space the full generator will use. - src/Wasmtime.Component.SourceGenerators/IsExternalInit.cs — polyfill so records compile under the netstandard2.0 target the generator needs. - src/Wasmtime.csproj — excludes the generator subfolder from the main assembly build so the two projects don't collide on file globbing. - tests/Wasmtime.Tests.csproj — references the generator with OutputItemType=Analyzer; includes Components/fixtures.wit as AdditionalFiles for the smoke test. - tests/ComponentBindingsGeneratorTests.cs — verifies the generator produces visible partial-class members for a `[ComponentBindings]` declaration in user code. Co-Authored-By: Claude Signed-off-by: ZverGuy --- Wasmtime.sln | 39 ++++ src/Components/ComponentBindingsAttribute.cs | 34 ++++ .../Diagnostics/Descriptors.cs | 40 ++++ .../IsExternalInit.cs | 5 + ...Wasmtime.Component.SourceGenerators.csproj | 19 ++ .../WitBindingsGenerator.cs | 177 ++++++++++++++++++ src/Wasmtime.csproj | 7 + tests/ComponentBindingsGeneratorTests.cs | 21 +++ tests/Wasmtime.Tests.csproj | 4 + 9 files changed, 346 insertions(+) create mode 100644 src/Components/ComponentBindingsAttribute.cs create mode 100644 src/Wasmtime.Component.SourceGenerators/Diagnostics/Descriptors.cs create mode 100644 src/Wasmtime.Component.SourceGenerators/IsExternalInit.cs create mode 100644 src/Wasmtime.Component.SourceGenerators/Wasmtime.Component.SourceGenerators.csproj create mode 100644 src/Wasmtime.Component.SourceGenerators/WitBindingsGenerator.cs create mode 100644 tests/ComponentBindingsGeneratorTests.cs diff --git a/Wasmtime.sln b/Wasmtime.sln index 03b1de28..a9ed13bc 100644 --- a/Wasmtime.sln +++ b/Wasmtime.sln @@ -7,24 +7,63 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Wasmtime", "src\Wasmtime.cs EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Wasmtime.Tests", "tests\Wasmtime.Tests.csproj", "{8A200114-1D0B-4F90-9F82-1FFE47C207DD}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{827E0CD3-B72D-47B6-A68D-7590B98EB39B}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Wasmtime.Component.SourceGenerators", "src\Wasmtime.Component.SourceGenerators\Wasmtime.Component.SourceGenerators.csproj", "{87F136FC-1D1C-4268-9C65-D0C3C193DB09}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {5EB63C51-5286-4DDF-BF7F-4110CC6D80B8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5EB63C51-5286-4DDF-BF7F-4110CC6D80B8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5EB63C51-5286-4DDF-BF7F-4110CC6D80B8}.Debug|x64.ActiveCfg = Debug|Any CPU + {5EB63C51-5286-4DDF-BF7F-4110CC6D80B8}.Debug|x64.Build.0 = Debug|Any CPU + {5EB63C51-5286-4DDF-BF7F-4110CC6D80B8}.Debug|x86.ActiveCfg = Debug|Any CPU + {5EB63C51-5286-4DDF-BF7F-4110CC6D80B8}.Debug|x86.Build.0 = Debug|Any CPU {5EB63C51-5286-4DDF-BF7F-4110CC6D80B8}.Release|Any CPU.ActiveCfg = Release|Any CPU {5EB63C51-5286-4DDF-BF7F-4110CC6D80B8}.Release|Any CPU.Build.0 = Release|Any CPU + {5EB63C51-5286-4DDF-BF7F-4110CC6D80B8}.Release|x64.ActiveCfg = Release|Any CPU + {5EB63C51-5286-4DDF-BF7F-4110CC6D80B8}.Release|x64.Build.0 = Release|Any CPU + {5EB63C51-5286-4DDF-BF7F-4110CC6D80B8}.Release|x86.ActiveCfg = Release|Any CPU + {5EB63C51-5286-4DDF-BF7F-4110CC6D80B8}.Release|x86.Build.0 = Release|Any CPU {8A200114-1D0B-4F90-9F82-1FFE47C207DD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8A200114-1D0B-4F90-9F82-1FFE47C207DD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8A200114-1D0B-4F90-9F82-1FFE47C207DD}.Debug|x64.ActiveCfg = Debug|Any CPU + {8A200114-1D0B-4F90-9F82-1FFE47C207DD}.Debug|x64.Build.0 = Debug|Any CPU + {8A200114-1D0B-4F90-9F82-1FFE47C207DD}.Debug|x86.ActiveCfg = Debug|Any CPU + {8A200114-1D0B-4F90-9F82-1FFE47C207DD}.Debug|x86.Build.0 = Debug|Any CPU {8A200114-1D0B-4F90-9F82-1FFE47C207DD}.Release|Any CPU.ActiveCfg = Release|Any CPU {8A200114-1D0B-4F90-9F82-1FFE47C207DD}.Release|Any CPU.Build.0 = Release|Any CPU + {8A200114-1D0B-4F90-9F82-1FFE47C207DD}.Release|x64.ActiveCfg = Release|Any CPU + {8A200114-1D0B-4F90-9F82-1FFE47C207DD}.Release|x64.Build.0 = Release|Any CPU + {8A200114-1D0B-4F90-9F82-1FFE47C207DD}.Release|x86.ActiveCfg = Release|Any CPU + {8A200114-1D0B-4F90-9F82-1FFE47C207DD}.Release|x86.Build.0 = Release|Any CPU + {87F136FC-1D1C-4268-9C65-D0C3C193DB09}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {87F136FC-1D1C-4268-9C65-D0C3C193DB09}.Debug|Any CPU.Build.0 = Debug|Any CPU + {87F136FC-1D1C-4268-9C65-D0C3C193DB09}.Debug|x64.ActiveCfg = Debug|Any CPU + {87F136FC-1D1C-4268-9C65-D0C3C193DB09}.Debug|x64.Build.0 = Debug|Any CPU + {87F136FC-1D1C-4268-9C65-D0C3C193DB09}.Debug|x86.ActiveCfg = Debug|Any CPU + {87F136FC-1D1C-4268-9C65-D0C3C193DB09}.Debug|x86.Build.0 = Debug|Any CPU + {87F136FC-1D1C-4268-9C65-D0C3C193DB09}.Release|Any CPU.ActiveCfg = Release|Any CPU + {87F136FC-1D1C-4268-9C65-D0C3C193DB09}.Release|Any CPU.Build.0 = Release|Any CPU + {87F136FC-1D1C-4268-9C65-D0C3C193DB09}.Release|x64.ActiveCfg = Release|Any CPU + {87F136FC-1D1C-4268-9C65-D0C3C193DB09}.Release|x64.Build.0 = Release|Any CPU + {87F136FC-1D1C-4268-9C65-D0C3C193DB09}.Release|x86.ActiveCfg = Release|Any CPU + {87F136FC-1D1C-4268-9C65-D0C3C193DB09}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {87F136FC-1D1C-4268-9C65-D0C3C193DB09} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B} + EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {F5AC35E5-1373-49E6-97DC-68CB5E0369E0} EndGlobalSection diff --git a/src/Components/ComponentBindingsAttribute.cs b/src/Components/ComponentBindingsAttribute.cs new file mode 100644 index 00000000..a179dbca --- /dev/null +++ b/src/Components/ComponentBindingsAttribute.cs @@ -0,0 +1,34 @@ +using System; + +namespace Wasmtime.Components +{ + /// + /// Marks a partial class as the entry point for source-generated component bindings. + /// + /// + /// Applied to a class declared in user code. The + /// Wasmtime.Component.SourceGenerators Roslyn generator reads the WIT file at + /// , optionally selects a world named , and emits + /// strongly-typed C# bindings into the same partial class. + /// + [AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)] + public sealed class ComponentBindingsAttribute : Attribute + { + /// + /// Creates a new attribute referencing a WIT file by relative path. + /// + /// Path to a .wit file declared as <AdditionalFiles> in the project. + /// Optional world name; required if the WIT file declares multiple worlds. + public ComponentBindingsAttribute(string witPath, string? world = null) + { + WitPath = witPath ?? throw new ArgumentNullException(nameof(witPath)); + World = world; + } + + /// The path to the WIT file the bindings are derived from. + public string WitPath { get; } + + /// The selected world name, or if the WIT file declares only one world. + public string? World { get; } + } +} diff --git a/src/Wasmtime.Component.SourceGenerators/Diagnostics/Descriptors.cs b/src/Wasmtime.Component.SourceGenerators/Diagnostics/Descriptors.cs new file mode 100644 index 00000000..421663d9 --- /dev/null +++ b/src/Wasmtime.Component.SourceGenerators/Diagnostics/Descriptors.cs @@ -0,0 +1,40 @@ +using Microsoft.CodeAnalysis; + +namespace Wasmtime.Component.SourceGenerators.Diagnostics; + +internal static class Descriptors +{ + private const string Category = "Wasmtime.Component"; + + public static readonly DiagnosticDescriptor TargetMustBePartial = new( + id: "WIT019", + title: "[ComponentBindings] target class must be partial", + messageFormat: "Class '{0}' has [ComponentBindings] but is not declared partial; the generator cannot extend it", + category: Category, + defaultSeverity: DiagnosticSeverity.Error, + isEnabledByDefault: true); + + public static readonly DiagnosticDescriptor WitPathMissing = new( + id: "WIT018", + title: "[ComponentBindings] requires non-empty witPath", + messageFormat: "[ComponentBindings] on '{0}' has no witPath argument", + category: Category, + defaultSeverity: DiagnosticSeverity.Error, + isEnabledByDefault: true); + + public static readonly DiagnosticDescriptor WitFileNotRegistered = new( + id: "WIT010", + title: "WIT file not registered as ", + messageFormat: "WIT file '{0}' was not provided to the generator via ; add it to the project", + category: Category, + defaultSeverity: DiagnosticSeverity.Error, + isEnabledByDefault: true); + + public static readonly DiagnosticDescriptor GeneratedSummary = new( + id: "WIT020", + title: "Component bindings generated", + messageFormat: "Generated bindings for '{0}' (world: {1})", + category: Category, + defaultSeverity: DiagnosticSeverity.Info, + isEnabledByDefault: true); +} diff --git a/src/Wasmtime.Component.SourceGenerators/IsExternalInit.cs b/src/Wasmtime.Component.SourceGenerators/IsExternalInit.cs new file mode 100644 index 00000000..b05eb4a1 --- /dev/null +++ b/src/Wasmtime.Component.SourceGenerators/IsExternalInit.cs @@ -0,0 +1,5 @@ +namespace System.Runtime.CompilerServices; + +internal static class IsExternalInit +{ +} diff --git a/src/Wasmtime.Component.SourceGenerators/Wasmtime.Component.SourceGenerators.csproj b/src/Wasmtime.Component.SourceGenerators/Wasmtime.Component.SourceGenerators.csproj new file mode 100644 index 00000000..350ceeb1 --- /dev/null +++ b/src/Wasmtime.Component.SourceGenerators/Wasmtime.Component.SourceGenerators.csproj @@ -0,0 +1,19 @@ + + + + netstandard2.0 + 10 + enable + true + false + true + Wasmtime.Component.SourceGenerators + $(NoWarn);RS2008 + + + + + + + + diff --git a/src/Wasmtime.Component.SourceGenerators/WitBindingsGenerator.cs b/src/Wasmtime.Component.SourceGenerators/WitBindingsGenerator.cs new file mode 100644 index 00000000..1cd5cab0 --- /dev/null +++ b/src/Wasmtime.Component.SourceGenerators/WitBindingsGenerator.cs @@ -0,0 +1,177 @@ +using System.Collections.Generic; +using System.Collections.Immutable; +using System.IO; +using System.Linq; +using System.Text; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp.Syntax; +using Microsoft.CodeAnalysis.Text; +using Wasmtime.Component.SourceGenerators.Diagnostics; + +namespace Wasmtime.Component.SourceGenerators; + +/// +/// IIncrementalGenerator that turns [ComponentBindings("path/to/world.wit")]-annotated +/// partial classes into source-generated component bindings. +/// +/// +/// This is the skeleton: it identifies the target class, validates that it is partial, locates +/// the referenced WIT file in AdditionalTexts, and emits a placeholder partial class so +/// the generator pipeline produces visible output. Subsequent commits replace the placeholder +/// with real WIT-driven type and function emission. +/// +[Generator(LanguageNames.CSharp)] +public sealed class WitBindingsGenerator : IIncrementalGenerator +{ + private const string AttributeFullName = "Wasmtime.Components.ComponentBindingsAttribute"; + + public void Initialize(IncrementalGeneratorInitializationContext context) + { + var bindingsRequests = context.SyntaxProvider + .ForAttributeWithMetadataName( + AttributeFullName, + predicate: static (node, _) => node is ClassDeclarationSyntax, + transform: static (ctx, _) => BindingsRequest.From(ctx)) + .Where(static r => r is not null)!; + + var witFiles = context.AdditionalTextsProvider + .Where(static t => t.Path.EndsWith(".wit", System.StringComparison.OrdinalIgnoreCase)) + .Collect(); + + var combined = bindingsRequests.Combine(witFiles); + + context.RegisterSourceOutput(combined, static (spc, pair) => + { + var request = pair.Left; + var files = pair.Right; + if (request is null) + { + return; + } + + Emit(spc, request, files); + }); + } + + private static void Emit( + SourceProductionContext spc, + BindingsRequest request, + ImmutableArray files) + { + if (!request.IsPartial) + { + spc.ReportDiagnostic(Diagnostic.Create( + Descriptors.TargetMustBePartial, + request.AttributeLocation, + request.ClassName)); + return; + } + + if (string.IsNullOrEmpty(request.WitPath)) + { + spc.ReportDiagnostic(Diagnostic.Create( + Descriptors.WitPathMissing, + request.AttributeLocation, + request.ClassName)); + return; + } + + var match = files.FirstOrDefault(t => + string.Equals(Path.GetFileName(t.Path), Path.GetFileName(request.WitPath), System.StringComparison.OrdinalIgnoreCase) + || t.Path.EndsWith(request.WitPath, System.StringComparison.OrdinalIgnoreCase)); + + if (match is null) + { + spc.ReportDiagnostic(Diagnostic.Create( + Descriptors.WitFileNotRegistered, + request.AttributeLocation, + request.WitPath)); + return; + } + + var witText = match.GetText(spc.CancellationToken)?.ToString() ?? string.Empty; + + var sb = new StringBuilder(); + sb.AppendLine("// "); + sb.AppendLine("#nullable enable"); + sb.AppendLine(); + + if (!string.IsNullOrEmpty(request.Namespace)) + { + sb.Append("namespace ").Append(request.Namespace).AppendLine(";"); + sb.AppendLine(); + } + + sb.Append("partial class ").AppendLine(request.ClassName); + sb.AppendLine("{"); + sb.Append(" /// WIT file path supplied via [ComponentBindings].").AppendLine(); + sb.Append(" public const string WitPath = \"").Append(EscapeString(request.WitPath)).AppendLine("\";"); + sb.Append(" /// Selected world from the WIT file (null if unspecified).").AppendLine(); + sb.Append(" public const string? WitWorld = "); + if (request.World is null) + { + sb.AppendLine("null;"); + } + else + { + sb.Append('\"').Append(EscapeString(request.World)).AppendLine("\";"); + } + sb.Append(" /// Number of bytes in the source WIT file at generation time.").AppendLine(); + sb.Append(" public const int WitSourceLength = ").Append(witText.Length).AppendLine(";"); + sb.AppendLine("}"); + + var hint = $"{request.ClassName}.WitBindings.g.cs"; + spc.AddSource(hint, SourceText.From(sb.ToString(), Encoding.UTF8)); + + spc.ReportDiagnostic(Diagnostic.Create( + Descriptors.GeneratedSummary, + request.AttributeLocation, + request.WitPath, + request.World ?? "")); + } + + private static string EscapeString(string value) => value.Replace("\\", "\\\\").Replace("\"", "\\\""); + + private sealed record BindingsRequest( + string ClassName, + string Namespace, + string WitPath, + string? World, + bool IsPartial, + Location AttributeLocation) + { + public static BindingsRequest? From(GeneratorAttributeSyntaxContext ctx) + { + if (ctx.TargetSymbol is not INamedTypeSymbol typeSymbol) + { + return null; + } + + var attribute = ctx.Attributes[0]; + var args = attribute.ConstructorArguments; + string? witPath = null; + string? world = null; + if (args.Length >= 1 && args[0].Value is string p) + { + witPath = p; + } + if (args.Length >= 2 && args[1].Value is string w) + { + world = w; + } + + var declaration = (ClassDeclarationSyntax)ctx.TargetNode; + var isPartial = declaration.Modifiers.Any(m => m.IsKind(Microsoft.CodeAnalysis.CSharp.SyntaxKind.PartialKeyword)); + + return new BindingsRequest( + ClassName: typeSymbol.Name, + Namespace: typeSymbol.ContainingNamespace.IsGlobalNamespace + ? string.Empty + : typeSymbol.ContainingNamespace.ToDisplayString(), + WitPath: witPath ?? string.Empty, + World: world, + IsPartial: isPartial, + AttributeLocation: attribute.ApplicationSyntaxReference?.GetSyntax().GetLocation() ?? Location.None); + } + } +} diff --git a/src/Wasmtime.csproj b/src/Wasmtime.csproj index 28db8861..33afa17d 100644 --- a/src/Wasmtime.csproj +++ b/src/Wasmtime.csproj @@ -43,6 +43,13 @@ The .NET embedding of Wasmtime enables .NET code to instantiate WebAssembly modu + + + + + + + diff --git a/tests/ComponentBindingsGeneratorTests.cs b/tests/ComponentBindingsGeneratorTests.cs new file mode 100644 index 00000000..4c89e25e --- /dev/null +++ b/tests/ComponentBindingsGeneratorTests.cs @@ -0,0 +1,21 @@ +using FluentAssertions; +using Wasmtime.Components; +using Xunit; + +namespace Wasmtime.Tests; + +[ComponentBindings("Components/fixtures.wit", world: "fixture")] +public partial class FixtureBindings +{ +} + +public class ComponentBindingsGeneratorTests +{ + [Fact] + public void Generator_EmitsConstantsOnPartialClass() + { + FixtureBindings.WitPath.Should().Be("Components/fixtures.wit"); + FixtureBindings.WitWorld.Should().Be("fixture"); + FixtureBindings.WitSourceLength.Should().BeGreaterThan(0); + } +} diff --git a/tests/Wasmtime.Tests.csproj b/tests/Wasmtime.Tests.csproj index 2f5aea7b..ef219204 100644 --- a/tests/Wasmtime.Tests.csproj +++ b/tests/Wasmtime.Tests.csproj @@ -18,6 +18,9 @@ + @@ -28,6 +31,7 @@ + From 430db530202ea835317c621cecec196c59d6f882 Mon Sep 17 00:00:00 2001 From: ZverGuy Date: Sun, 3 May 2026 02:00:09 +0300 Subject: [PATCH 15/26] feat(components): WIT parsing via wasm-tools JSON IR MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replaces the planned hand-rolled WIT parser with a much smaller layer that consumes the JSON IR `wasm-tools component wit X.wit --json` produces. This re-uses Rust's battle-tested WIT front-end (wasm-tools / wit-parser) without dragging a Rust toolchain into csc — the generator only sees a pre-built `*.wit.json` artifact. Pipeline: - A `*.wit.json` file lives next to its `*.wit` source. For now it is generated manually via `nix shell nixpkgs#wasm-tools --command wasm-tools component wit foo.wit --json > foo.wit.json` and committed alongside the WIT (see tests/Components/fixtures.wit.json). A follow-up will wire up an MSBuild target so this happens automatically at build time. - The generator picks up the JSON file via , parses it with System.Text.Json, and uses the resulting WitModel to drive code emission. Additions: - src/Wasmtime.Component.SourceGenerators/Wit/WitModel.cs — typed IR records covering worlds, world items (function vs typeref), type defs (record / enum / flags / variant / list / option / result / tuple / alias / unknown), and type references (indexed or primitive). - src/Wasmtime.Component.SourceGenerators/Wit/WitJsonReader.cs — JsonDocument-based parser; ~250 LOC vs the ~700 LOC a hand-rolled WIT lexer + parser would require. - WitBindingsGenerator now reads the JSON sibling, locates the requested world, and surfaces the parsed shape as constants (WitTypeCount, WitImportCount, WitExportCount) and arrays (WitExportNames, WitTypeNames). These are the seam the next commits will replace with real type/function emission. The generator project now references System.Text.Json explicitly and embeds it into the analyzer DLL so Roslyn loads it without a runtime NuGet round-trip. Tests: 60 passing (3 new generator-output assertions). Co-Authored-By: Claude Signed-off-by: ZverGuy --- ...Wasmtime.Component.SourceGenerators.csproj | 9 + .../Wit/WitJsonReader.cs | 264 ++++++++++++++++++ .../Wit/WitModel.cs | 68 +++++ .../WitBindingsGenerator.cs | 77 +++-- tests/ComponentBindingsGeneratorTests.cs | 30 +- tests/Components/fixtures.wit.json | 244 ++++++++++++++++ tests/Wasmtime.Tests.csproj | 1 + 7 files changed, 674 insertions(+), 19 deletions(-) create mode 100644 src/Wasmtime.Component.SourceGenerators/Wit/WitJsonReader.cs create mode 100644 src/Wasmtime.Component.SourceGenerators/Wit/WitModel.cs create mode 100644 tests/Components/fixtures.wit.json diff --git a/src/Wasmtime.Component.SourceGenerators/Wasmtime.Component.SourceGenerators.csproj b/src/Wasmtime.Component.SourceGenerators/Wasmtime.Component.SourceGenerators.csproj index 350ceeb1..b22f6f41 100644 --- a/src/Wasmtime.Component.SourceGenerators/Wasmtime.Component.SourceGenerators.csproj +++ b/src/Wasmtime.Component.SourceGenerators/Wasmtime.Component.SourceGenerators.csproj @@ -14,6 +14,15 @@ + + + + + + + + diff --git a/src/Wasmtime.Component.SourceGenerators/Wit/WitJsonReader.cs b/src/Wasmtime.Component.SourceGenerators/Wit/WitJsonReader.cs new file mode 100644 index 00000000..b99010f0 --- /dev/null +++ b/src/Wasmtime.Component.SourceGenerators/Wit/WitJsonReader.cs @@ -0,0 +1,264 @@ +using System; +using System.Collections.Generic; +using System.Text.Json; + +namespace Wasmtime.Component.SourceGenerators.Wit; + +/// +/// Parses the JSON IR produced by wasm-tools component wit X.wit --json into . +/// +internal static class WitJsonReader +{ + public static WitModel Parse(string json) + { + using var doc = JsonDocument.Parse(json); + var root = doc.RootElement; + + return new WitModel( + Worlds: ReadWorlds(root), + Types: ReadTypes(root), + Packages: ReadPackages(root)); + } + + private static IReadOnlyList ReadWorlds(JsonElement root) + { + if (!root.TryGetProperty("worlds", out var worlds) || worlds.ValueKind != JsonValueKind.Array) + { + return Array.Empty(); + } + + var list = new List(); + foreach (var w in worlds.EnumerateArray()) + { + list.Add(new WitWorldDef( + Name: w.GetProperty("name").GetString() ?? string.Empty, + Imports: ReadWorldItemMap(w, "imports"), + Exports: ReadWorldItemMap(w, "exports"))); + } + return list; + } + + private static IReadOnlyList ReadWorldItemMap(JsonElement world, string property) + { + if (!world.TryGetProperty(property, out var map) || map.ValueKind != JsonValueKind.Object) + { + return Array.Empty(); + } + + var items = new List(); + foreach (var entry in map.EnumerateObject()) + { + items.Add(new WitWorldItem(entry.Name, ReadWorldItemKind(entry.Value))); + } + return items; + } + + private static WitWorldItemKind ReadWorldItemKind(JsonElement element) + { + if (element.TryGetProperty("function", out var fn)) + { + return new WitWorldItemFunction(ReadFunction(fn)); + } + + if (element.TryGetProperty("type", out var typeRef)) + { + return new WitWorldItemTypeRef(ReadTypeRef(typeRef)); + } + + if (element.TryGetProperty("interface", out _)) + { + return new WitWorldItemTypeRef(new WitTypeRefPrimitive("interface")); + } + + return new WitWorldItemTypeRef(new WitTypeRefPrimitive("unknown")); + } + + private static WitFunction ReadFunction(JsonElement element) + { + var name = element.GetProperty("name").GetString() ?? string.Empty; + var kind = element.TryGetProperty("kind", out var k) && k.ValueKind == JsonValueKind.String + ? k.GetString() ?? "freestanding" + : "freestanding"; + + var paramList = new List(); + if (element.TryGetProperty("params", out var pars) && pars.ValueKind == JsonValueKind.Array) + { + foreach (var p in pars.EnumerateArray()) + { + paramList.Add(new WitParam( + Name: p.GetProperty("name").GetString() ?? string.Empty, + Type: ReadTypeRef(p.GetProperty("type")))); + } + } + + WitTypeRef? result = null; + if (element.TryGetProperty("result", out var res) && res.ValueKind != JsonValueKind.Null) + { + result = ReadTypeRef(res); + } + + return new WitFunction(name, kind, paramList, result); + } + + private static IReadOnlyList ReadTypes(JsonElement root) + { + if (!root.TryGetProperty("types", out var types) || types.ValueKind != JsonValueKind.Array) + { + return Array.Empty(); + } + + var list = new List(); + var index = 0; + foreach (var t in types.EnumerateArray()) + { + list.Add(new WitTypeDef( + Index: index++, + Name: t.TryGetProperty("name", out var n) && n.ValueKind == JsonValueKind.String ? n.GetString() : null, + Kind: ReadKind(t.GetProperty("kind")))); + } + return list; + } + + private static WitKind ReadKind(JsonElement element) + { + if (element.ValueKind == JsonValueKind.String) + { + return new WitTypeKindAlias(new WitTypeRefPrimitive(element.GetString()!)); + } + + if (element.ValueKind != JsonValueKind.Object) + { + return new WitUnknownKind(element.ValueKind.ToString()); + } + + foreach (var prop in element.EnumerateObject()) + { + switch (prop.Name) + { + case "record": + return new WitRecordKind(ReadRecordFields(prop.Value)); + case "enum": + return new WitEnumKind(ReadCaseNames(prop.Value, "cases")); + case "flags": + return new WitFlagsKind(ReadCaseNames(prop.Value, "flags")); + case "variant": + return new WitVariantKind(ReadVariantCases(prop.Value)); + case "list": + return new WitListKind(ReadTypeRef(prop.Value)); + case "option": + return new WitOptionKind(ReadTypeRef(prop.Value)); + case "result": + return ReadResult(prop.Value); + case "tuple": + return new WitTupleKind(ReadTupleTypes(prop.Value)); + case "type": + return new WitTypeKindAlias(ReadTypeRef(prop.Value)); + default: + return new WitUnknownKind(prop.Name); + } + } + + return new WitUnknownKind("(empty)"); + } + + private static IReadOnlyList ReadRecordFields(JsonElement element) + { + var fields = new List(); + if (element.TryGetProperty("fields", out var arr) && arr.ValueKind == JsonValueKind.Array) + { + foreach (var f in arr.EnumerateArray()) + { + fields.Add(new WitRecordField( + Name: f.GetProperty("name").GetString() ?? string.Empty, + Type: ReadTypeRef(f.GetProperty("type")))); + } + } + return fields; + } + + private static IReadOnlyList ReadCaseNames(JsonElement element, string property) + { + var names = new List(); + if (element.TryGetProperty(property, out var arr) && arr.ValueKind == JsonValueKind.Array) + { + foreach (var c in arr.EnumerateArray()) + { + names.Add(c.GetProperty("name").GetString() ?? string.Empty); + } + } + return names; + } + + private static IReadOnlyList ReadVariantCases(JsonElement element) + { + var cases = new List(); + if (element.TryGetProperty("cases", out var arr) && arr.ValueKind == JsonValueKind.Array) + { + foreach (var c in arr.EnumerateArray()) + { + WitTypeRef? payload = null; + if (c.TryGetProperty("type", out var t) && t.ValueKind != JsonValueKind.Null) + { + payload = ReadTypeRef(t); + } + cases.Add(new WitVariantCase( + Name: c.GetProperty("name").GetString() ?? string.Empty, + Payload: payload)); + } + } + return cases; + } + + private static WitResultKind ReadResult(JsonElement element) + { + WitTypeRef? ok = null; + WitTypeRef? err = null; + if (element.TryGetProperty("ok", out var o) && o.ValueKind != JsonValueKind.Null) + { + ok = ReadTypeRef(o); + } + if (element.TryGetProperty("err", out var e) && e.ValueKind != JsonValueKind.Null) + { + err = ReadTypeRef(e); + } + return new WitResultKind(ok, err); + } + + private static IReadOnlyList ReadTupleTypes(JsonElement element) + { + var types = new List(); + if (element.TryGetProperty("types", out var arr) && arr.ValueKind == JsonValueKind.Array) + { + foreach (var t in arr.EnumerateArray()) + { + types.Add(ReadTypeRef(t)); + } + } + return types; + } + + private static WitTypeRef ReadTypeRef(JsonElement element) + { + return element.ValueKind switch + { + JsonValueKind.Number => new WitTypeRefIndex(element.GetInt32()), + JsonValueKind.String => new WitTypeRefPrimitive(element.GetString()!), + _ => new WitTypeRefPrimitive("unknown"), + }; + } + + private static IReadOnlyList ReadPackages(JsonElement root) + { + if (!root.TryGetProperty("packages", out var packages) || packages.ValueKind != JsonValueKind.Array) + { + return Array.Empty(); + } + + var list = new List(); + foreach (var p in packages.EnumerateArray()) + { + list.Add(new WitPackage(p.GetProperty("name").GetString() ?? string.Empty)); + } + return list; + } +} diff --git a/src/Wasmtime.Component.SourceGenerators/Wit/WitModel.cs b/src/Wasmtime.Component.SourceGenerators/Wit/WitModel.cs new file mode 100644 index 00000000..bfa44085 --- /dev/null +++ b/src/Wasmtime.Component.SourceGenerators/Wit/WitModel.cs @@ -0,0 +1,68 @@ +using System.Collections.Generic; + +namespace Wasmtime.Component.SourceGenerators.Wit; + +/// +/// Top-level model parsed from wasm-tools component wit X.wit --json. +/// +internal sealed record WitModel( + IReadOnlyList Worlds, + IReadOnlyList Types, + IReadOnlyList Packages); + +internal sealed record WitWorldDef( + string Name, + IReadOnlyList Imports, + IReadOnlyList Exports); + +/// An entry in a world's imports or exports map. +internal sealed record WitWorldItem( + string Name, + WitWorldItemKind Kind); + +internal abstract record WitWorldItemKind; + +/// The world item references a type (e.g. an exported record/enum/variant alias). +internal sealed record WitWorldItemTypeRef(WitTypeRef Type) : WitWorldItemKind; + +/// The world item is a freestanding function. +internal sealed record WitWorldItemFunction(WitFunction Function) : WitWorldItemKind; + +internal sealed record WitFunction( + string Name, + string Kind, + IReadOnlyList Params, + WitTypeRef? Result); + +internal sealed record WitParam(string Name, WitTypeRef Type); + +/// +/// A type definition in types[]. Anonymous types (list/option/result/tuple) have a null name. +/// +internal sealed record WitTypeDef( + int Index, + string? Name, + WitKind Kind); + +internal abstract record WitKind; +internal sealed record WitRecordKind(IReadOnlyList Fields) : WitKind; +internal sealed record WitRecordField(string Name, WitTypeRef Type); +internal sealed record WitEnumKind(IReadOnlyList Cases) : WitKind; +internal sealed record WitFlagsKind(IReadOnlyList Flags) : WitKind; +internal sealed record WitVariantKind(IReadOnlyList Cases) : WitKind; +internal sealed record WitVariantCase(string Name, WitTypeRef? Payload); +internal sealed record WitListKind(WitTypeRef Element) : WitKind; +internal sealed record WitOptionKind(WitTypeRef Element) : WitKind; +internal sealed record WitResultKind(WitTypeRef? Ok, WitTypeRef? Err) : WitKind; +internal sealed record WitTupleKind(IReadOnlyList Elements) : WitKind; +internal sealed record WitTypeKindAlias(WitTypeRef Target) : WitKind; +internal sealed record WitUnknownKind(string KindName) : WitKind; + +/// +/// A reference to a type — either an index into or a primitive name. +/// +internal abstract record WitTypeRef; +internal sealed record WitTypeRefIndex(int Index) : WitTypeRef; +internal sealed record WitTypeRefPrimitive(string Name) : WitTypeRef; + +internal sealed record WitPackage(string Name); diff --git a/src/Wasmtime.Component.SourceGenerators/WitBindingsGenerator.cs b/src/Wasmtime.Component.SourceGenerators/WitBindingsGenerator.cs index 1cd5cab0..b8e6d842 100644 --- a/src/Wasmtime.Component.SourceGenerators/WitBindingsGenerator.cs +++ b/src/Wasmtime.Component.SourceGenerators/WitBindingsGenerator.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using System.Collections.Immutable; using System.IO; @@ -7,6 +8,7 @@ using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.Text; using Wasmtime.Component.SourceGenerators.Diagnostics; +using Wasmtime.Component.SourceGenerators.Wit; namespace Wasmtime.Component.SourceGenerators; @@ -34,8 +36,12 @@ public void Initialize(IncrementalGeneratorInitializationContext context) transform: static (ctx, _) => BindingsRequest.From(ctx)) .Where(static r => r is not null)!; + // Generators read the Rust-produced JSON IR (`*.wit.json`) rather than parsing WIT + // themselves; the .wit file is still tracked so users get a single AdditionalFiles entry. var witFiles = context.AdditionalTextsProvider - .Where(static t => t.Path.EndsWith(".wit", System.StringComparison.OrdinalIgnoreCase)) + .Where(static t => + t.Path.EndsWith(".wit", StringComparison.OrdinalIgnoreCase) + || t.Path.EndsWith(".wit.json", StringComparison.OrdinalIgnoreCase)) .Collect(); var combined = bindingsRequests.Combine(witFiles); @@ -76,20 +82,47 @@ private static void Emit( return; } - var match = files.FirstOrDefault(t => - string.Equals(Path.GetFileName(t.Path), Path.GetFileName(request.WitPath), System.StringComparison.OrdinalIgnoreCase) - || t.Path.EndsWith(request.WitPath, System.StringComparison.OrdinalIgnoreCase)); + var jsonName = Path.GetFileName(request.WitPath) + ".json"; + var jsonMatch = files.FirstOrDefault(t => + string.Equals(Path.GetFileName(t.Path), jsonName, StringComparison.OrdinalIgnoreCase) + || t.Path.EndsWith(jsonName, StringComparison.OrdinalIgnoreCase)); - if (match is null) + if (jsonMatch is null) { spc.ReportDiagnostic(Diagnostic.Create( Descriptors.WitFileNotRegistered, request.AttributeLocation, - request.WitPath)); + jsonName)); return; } - var witText = match.GetText(spc.CancellationToken)?.ToString() ?? string.Empty; + var json = jsonMatch.GetText(spc.CancellationToken)?.ToString() ?? string.Empty; + WitModel model; + try + { + model = WitJsonReader.Parse(json); + } + catch (Exception ex) + { + spc.ReportDiagnostic(Diagnostic.Create( + Descriptors.WitFileNotRegistered, + request.AttributeLocation, + $"failed to parse: {ex.Message}")); + return; + } + + var world = string.IsNullOrEmpty(request.World) + ? model.Worlds.FirstOrDefault() + : model.Worlds.FirstOrDefault(w => w.Name == request.World); + + if (world is null) + { + spc.ReportDiagnostic(Diagnostic.Create( + Descriptors.WitFileNotRegistered, + request.AttributeLocation, + $"world '{request.World ?? ""}' not found")); + return; + } var sb = new StringBuilder(); sb.AppendLine("// "); @@ -104,20 +137,30 @@ private static void Emit( sb.Append("partial class ").AppendLine(request.ClassName); sb.AppendLine("{"); - sb.Append(" /// WIT file path supplied via [ComponentBindings].").AppendLine(); sb.Append(" public const string WitPath = \"").Append(EscapeString(request.WitPath)).AppendLine("\";"); - sb.Append(" /// Selected world from the WIT file (null if unspecified).").AppendLine(); - sb.Append(" public const string? WitWorld = "); - if (request.World is null) + sb.Append(" public const string WitWorld = \"").Append(EscapeString(world.Name)).AppendLine("\";"); + sb.Append(" public const int WitTypeCount = ").Append(model.Types.Count).AppendLine(";"); + sb.Append(" public const int WitImportCount = ").Append(world.Imports.Count).AppendLine(";"); + sb.Append(" public const int WitExportCount = ").Append(world.Exports.Count).AppendLine(";"); + + sb.AppendLine(); + sb.AppendLine(" public static readonly string[] WitExportNames ="); + sb.AppendLine(" {"); + foreach (var export in world.Exports) { - sb.AppendLine("null;"); + sb.Append(" \"").Append(EscapeString(export.Name)).AppendLine("\","); } - else + sb.AppendLine(" };"); + + sb.AppendLine(); + sb.AppendLine(" public static readonly string[] WitTypeNames ="); + sb.AppendLine(" {"); + foreach (var type in model.Types) { - sb.Append('\"').Append(EscapeString(request.World)).AppendLine("\";"); + sb.Append(" \"").Append(EscapeString(type.Name ?? "")).AppendLine("\","); } - sb.Append(" /// Number of bytes in the source WIT file at generation time.").AppendLine(); - sb.Append(" public const int WitSourceLength = ").Append(witText.Length).AppendLine(";"); + sb.AppendLine(" };"); + sb.AppendLine("}"); var hint = $"{request.ClassName}.WitBindings.g.cs"; @@ -127,7 +170,7 @@ private static void Emit( Descriptors.GeneratedSummary, request.AttributeLocation, request.WitPath, - request.World ?? "")); + world.Name)); } private static string EscapeString(string value) => value.Replace("\\", "\\\\").Replace("\"", "\\\""); diff --git a/tests/ComponentBindingsGeneratorTests.cs b/tests/ComponentBindingsGeneratorTests.cs index 4c89e25e..5ecf49fb 100644 --- a/tests/ComponentBindingsGeneratorTests.cs +++ b/tests/ComponentBindingsGeneratorTests.cs @@ -12,10 +12,36 @@ public partial class FixtureBindings public class ComponentBindingsGeneratorTests { [Fact] - public void Generator_EmitsConstantsOnPartialClass() + public void Generator_EmitsConstantsFromJsonIr() { FixtureBindings.WitPath.Should().Be("Components/fixtures.wit"); FixtureBindings.WitWorld.Should().Be("fixture"); - FixtureBindings.WitSourceLength.Should().BeGreaterThan(0); + // 4 named types (point, priority, permissions, greeting) + 4 anonymous + // (list, result, option, tuple) + FixtureBindings.WitTypeCount.Should().Be(8); + FixtureBindings.WitImportCount.Should().Be(4); + FixtureBindings.WitExportCount.Should().Be(8); + } + + [Fact] + public void Generator_EmitsExportNames() + { + FixtureBindings.WitExportNames.Should().BeEquivalentTo(new[] + { + "origin", + "range", + "top-priority", + "defaults", + "greet", + "safe-divide", + "find", + "pair", + }, options => options.WithStrictOrdering()); + } + + [Fact] + public void Generator_EmitsNamedTypes() + { + FixtureBindings.WitTypeNames.Should().Contain(new[] { "point", "priority", "permissions", "greeting" }); } } diff --git a/tests/Components/fixtures.wit.json b/tests/Components/fixtures.wit.json new file mode 100644 index 00000000..5dd830af --- /dev/null +++ b/tests/Components/fixtures.wit.json @@ -0,0 +1,244 @@ +{ + "worlds": [ + { + "name": "fixture", + "imports": { + "point": { + "type": 0 + }, + "priority": { + "type": 1 + }, + "permissions": { + "type": 2 + }, + "greeting": { + "type": 3 + } + }, + "exports": { + "origin": { + "function": { + "name": "origin", + "kind": "freestanding", + "params": [], + "result": 0 + } + }, + "range": { + "function": { + "name": "range", + "kind": "freestanding", + "params": [], + "result": 4 + } + }, + "top-priority": { + "function": { + "name": "top-priority", + "kind": "freestanding", + "params": [], + "result": 1 + } + }, + "defaults": { + "function": { + "name": "defaults", + "kind": "freestanding", + "params": [], + "result": 2 + } + }, + "greet": { + "function": { + "name": "greet", + "kind": "freestanding", + "params": [ + { + "name": "formal", + "type": "bool" + } + ], + "result": 3 + } + }, + "safe-divide": { + "function": { + "name": "safe-divide", + "kind": "freestanding", + "params": [ + { + "name": "n", + "type": "u32" + }, + { + "name": "d", + "type": "u32" + } + ], + "result": 5 + } + }, + "find": { + "function": { + "name": "find", + "kind": "freestanding", + "params": [ + { + "name": "needle", + "type": "u32" + } + ], + "result": 6 + } + }, + "pair": { + "function": { + "name": "pair", + "kind": "freestanding", + "params": [], + "result": 7 + } + } + }, + "package": 0, + "docs": { + "contents": "Reference WIT for the composite-types e2e fixture. Mirrored at\n`fixtures-src/wit/world.wit` so cargo-component can compile the Rust\nimplementation in `fixtures-src/` into the resulting `fixtures.wasm`\ncomponent used by `ComponentCompositesTests`." + } + } + ], + "interfaces": [], + "types": [ + { + "name": "point", + "kind": { + "record": { + "fields": [ + { + "name": "x", + "type": "u32" + }, + { + "name": "y", + "type": "u32" + } + ] + } + }, + "owner": { + "world": 0 + } + }, + { + "name": "priority", + "kind": { + "enum": { + "cases": [ + { + "name": "low" + }, + { + "name": "medium" + }, + { + "name": "high" + } + ] + } + }, + "owner": { + "world": 0 + } + }, + { + "name": "permissions", + "kind": { + "flags": { + "flags": [ + { + "name": "read" + }, + { + "name": "write" + }, + { + "name": "execute" + } + ] + } + }, + "owner": { + "world": 0 + } + }, + { + "name": "greeting", + "kind": { + "variant": { + "cases": [ + { + "name": "formal", + "type": "string" + }, + { + "name": "casual", + "type": "string" + }, + { + "name": "none", + "type": null + } + ] + } + }, + "owner": { + "world": 0 + } + }, + { + "name": null, + "kind": { + "list": "u32" + }, + "owner": null + }, + { + "name": null, + "kind": { + "result": { + "ok": "u32", + "err": "string" + } + }, + "owner": null + }, + { + "name": null, + "kind": { + "option": "string" + }, + "owner": null + }, + { + "name": null, + "kind": { + "tuple": { + "types": [ + "u32", + "string" + ] + } + }, + "owner": null + } + ], + "packages": [ + { + "name": "wasmtime:tests@0.1.0", + "interfaces": {}, + "worlds": { + "fixture": 0 + } + } + ] +} \ No newline at end of file diff --git a/tests/Wasmtime.Tests.csproj b/tests/Wasmtime.Tests.csproj index ef219204..db06a8a7 100644 --- a/tests/Wasmtime.Tests.csproj +++ b/tests/Wasmtime.Tests.csproj @@ -32,6 +32,7 @@ + From fd8902a6cc96cfbf2b5f485e7bd6b2b0eb4a8dca Mon Sep 17 00:00:00 2001 From: ZverGuy Date: Sun, 3 May 2026 02:02:36 +0300 Subject: [PATCH 16/26] feat(components): emit C# types from WIT IR (record / enum / flags / variant) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Wires the JSON IR through a pair of small emitters that produce idiomatic C# nested types under the user's bindings class. All generated names are PascalCased from the WIT kebab-case and clash with C# keywords are prefixed with `@`. - src/Wasmtime.Component.SourceGenerators/Emit/EmitContext.cs — resolves WIT type references to C# names (primitive map, indexed lookup, anonymous list/option/result/tuple → IReadOnlyList/T?/Result /(T1, T2, ...)) and provides the kebab→Pascal/camel converter plus the C# keyword guard. - src/Wasmtime.Component.SourceGenerators/Emit/TypeEmitter.cs — emits: record -> public sealed record class Foo(int X, string Name); enum -> public enum Foo : byte { Low = 0, Medium = 1, ... } flags -> [Flags] public enum Foo : byte { None = 0, Read = 1, ... } variant -> public abstract record Foo { public sealed record Bar(T Value) : Foo; public sealed record Baz() : Foo; } - src/Components/Result.cs — public Result + Unit types in the Wasmtime.Components namespace, referenced by the emitter when WIT declares result with empty arms (mirrors WIT's `_`). - WitBindingsGenerator now invokes TypeEmitter after writing the metadata constants, so the same output file contains both. Tests assert the emitted shapes are usable from consumer code: construct Point(3, 4), pattern match Greeting.Formal("Sir"), |-or Permissions.Read | Permissions.Write, etc. Total component-test count: 64 passing. Co-Authored-By: Claude Signed-off-by: ZverGuy --- src/Components/Result.cs | 56 ++++++ .../Emit/EmitContext.cs | 181 ++++++++++++++++++ .../Emit/TypeEmitter.cs | 131 +++++++++++++ .../WitBindingsGenerator.cs | 5 + tests/ComponentBindingsGeneratorTests.cs | 39 ++++ 5 files changed, 412 insertions(+) create mode 100644 src/Components/Result.cs create mode 100644 src/Wasmtime.Component.SourceGenerators/Emit/EmitContext.cs create mode 100644 src/Wasmtime.Component.SourceGenerators/Emit/TypeEmitter.cs diff --git a/src/Components/Result.cs b/src/Components/Result.cs new file mode 100644 index 00000000..cd0e5a72 --- /dev/null +++ b/src/Components/Result.cs @@ -0,0 +1,56 @@ +using System; + +namespace Wasmtime.Components +{ + /// + /// Represents an empty payload for the ok or err arm of a + /// ; mirrors WIT's _ payload syntax. + /// + public readonly record struct Unit; + + /// + /// Discriminated union representing the value of a WIT result<T, E>. + /// + public readonly struct Result + { + private readonly bool isOk; + private readonly T okValue; + private readonly E errValue; + + private Result(bool isOk, T okValue, E errValue) + { + this.isOk = isOk; + this.okValue = okValue; + this.errValue = errValue; + } + + /// Indicates whether the result represents a successful value. + public bool IsOk => isOk; + + /// Reads the successful value; throws if the result is an error. + public T Value => isOk ? okValue : throw new InvalidOperationException("Result is in the err state."); + + /// Reads the error value; throws if the result is successful. + public E Error => !isOk ? errValue : throw new InvalidOperationException("Result is in the ok state."); + + /// Constructs a successful result. + public static Result Ok(T value) => new(true, value, default!); + + /// Constructs an error result. + public static Result Err(E error) => new(false, default!, error); + + /// Pattern-matches the two cases. + public TR Match(Func ok, Func err) + { + if (ok is null) + { + throw new ArgumentNullException(nameof(ok)); + } + if (err is null) + { + throw new ArgumentNullException(nameof(err)); + } + return isOk ? ok(okValue) : err(errValue); + } + } +} diff --git a/src/Wasmtime.Component.SourceGenerators/Emit/EmitContext.cs b/src/Wasmtime.Component.SourceGenerators/Emit/EmitContext.cs new file mode 100644 index 00000000..dcd33552 --- /dev/null +++ b/src/Wasmtime.Component.SourceGenerators/Emit/EmitContext.cs @@ -0,0 +1,181 @@ +using System; +using System.Collections.Generic; +using System.Text; +using Wasmtime.Component.SourceGenerators.Wit; + +namespace Wasmtime.Component.SourceGenerators.Emit; + +/// +/// Resolves type references during emission and converts WIT kebab-case identifiers to PascalCase +/// C# names. +/// +internal sealed class EmitContext +{ + private readonly IReadOnlyList types; + + public EmitContext(IReadOnlyList types) + { + this.types = types; + } + + public string ResolveTypeRef(WitTypeRef typeRef) + { + return typeRef switch + { + WitTypeRefPrimitive p => MapPrimitive(p.Name), + WitTypeRefIndex idx => ResolveIndex(idx.Index), + _ => "object", + }; + } + + private string ResolveIndex(int index) + { + if (index < 0 || index >= types.Count) + { + return "object"; + } + + var def = types[index]; + if (def.Name is not null) + { + return ToPascalCase(def.Name); + } + + // Anonymous types — render their structural form. + return def.Kind switch + { + WitListKind list => $"System.Collections.Generic.IReadOnlyList<{ResolveTypeRef(list.Element)}>", + WitOptionKind option => MakeNullable(option.Element), + WitResultKind result => RenderResult(result), + WitTupleKind tuple => RenderTuple(tuple), + _ => "object", + }; + } + + private string MakeNullable(WitTypeRef element) + { + var inner = ResolveTypeRef(element); + return IsValueType(element) ? $"{inner}?" : $"{inner}?"; + } + + private string RenderResult(WitResultKind result) + { + var ok = result.Ok is null ? "Wasmtime.Components.Unit" : ResolveTypeRef(result.Ok); + var err = result.Err is null ? "Wasmtime.Components.Unit" : ResolveTypeRef(result.Err); + return $"Wasmtime.Components.Result<{ok}, {err}>"; + } + + private string RenderTuple(WitTupleKind tuple) + { + var sb = new StringBuilder("("); + for (var i = 0; i < tuple.Elements.Count; i++) + { + if (i > 0) + { + sb.Append(", "); + } + sb.Append(ResolveTypeRef(tuple.Elements[i])); + } + sb.Append(')'); + return sb.ToString(); + } + + private bool IsValueType(WitTypeRef typeRef) + { + if (typeRef is WitTypeRefPrimitive p) + { + return p.Name switch + { + "string" => false, + _ => true, + }; + } + + if (typeRef is WitTypeRefIndex idx && idx.Index >= 0 && idx.Index < types.Count) + { + return types[idx.Index].Kind is WitEnumKind or WitFlagsKind; + } + + return false; + } + + public static string MapPrimitive(string name) => name switch + { + "bool" => "bool", + "s8" => "sbyte", + "u8" => "byte", + "s16" => "short", + "u16" => "ushort", + "s32" => "int", + "u32" => "uint", + "s64" => "long", + "u64" => "ulong", + "f32" => "float", + "f64" => "double", + "char" => "uint", + "string" => "string", + _ => name, + }; + + public static string ToPascalCase(string identifier) + { + if (string.IsNullOrEmpty(identifier)) + { + return identifier; + } + + var sb = new StringBuilder(identifier.Length); + var capitalizeNext = true; + foreach (var ch in identifier) + { + if (ch is '-' or '_' or ' ') + { + capitalizeNext = true; + continue; + } + + if (capitalizeNext) + { + sb.Append(char.ToUpperInvariant(ch)); + capitalizeNext = false; + } + else + { + sb.Append(ch); + } + } + + // Reserved keyword guard. + var result = sb.ToString(); + return s_keywords.Contains(result) ? "@" + result : result; + } + + public static string ToCamelCase(string identifier) + { + var pascal = ToPascalCase(identifier); + if (pascal.Length == 0) + { + return pascal; + } + + if (pascal[0] == '@') + { + return pascal; + } + + return char.ToLowerInvariant(pascal[0]) + pascal.Substring(1); + } + + private static readonly HashSet s_keywords = new(StringComparer.Ordinal) + { + "abstract", "as", "base", "bool", "break", "byte", "case", "catch", "char", "checked", + "class", "const", "continue", "decimal", "default", "delegate", "do", "double", "else", + "enum", "event", "explicit", "extern", "false", "finally", "fixed", "float", "for", + "foreach", "goto", "if", "implicit", "in", "int", "interface", "internal", "is", "lock", + "long", "namespace", "new", "null", "object", "operator", "out", "override", "params", + "private", "protected", "public", "readonly", "ref", "return", "sbyte", "sealed", "short", + "sizeof", "stackalloc", "static", "string", "struct", "switch", "this", "throw", "true", + "try", "typeof", "uint", "ulong", "unchecked", "unsafe", "ushort", "using", "virtual", + "void", "volatile", "while", + }; +} diff --git a/src/Wasmtime.Component.SourceGenerators/Emit/TypeEmitter.cs b/src/Wasmtime.Component.SourceGenerators/Emit/TypeEmitter.cs new file mode 100644 index 00000000..48102855 --- /dev/null +++ b/src/Wasmtime.Component.SourceGenerators/Emit/TypeEmitter.cs @@ -0,0 +1,131 @@ +using System.Linq; +using System.Text; +using Wasmtime.Component.SourceGenerators.Wit; + +namespace Wasmtime.Component.SourceGenerators.Emit; + +/// +/// Emits C# declarations for WIT type definitions (record / enum / flags / variant). +/// +/// +/// All generated types live as nested members of the partial class annotated with +/// [ComponentBindings]. This keeps the surface tied to the bindings entry point +/// (FixtureBindings.Point, FixtureBindings.Greeting.Formal) rather than +/// polluting the user's namespace. +/// +internal static class TypeEmitter +{ + public static void EmitNamedTypes(StringBuilder sb, WitModel model, EmitContext ctx, int indent) + { + var pad = new string(' ', indent); + foreach (var type in model.Types) + { + if (type.Name is null) + { + continue; + } + + switch (type.Kind) + { + case WitRecordKind record: + EmitRecord(sb, type.Name, record, ctx, pad); + break; + case WitEnumKind @enum: + EmitEnum(sb, type.Name, @enum, pad); + break; + case WitFlagsKind flags: + EmitFlags(sb, type.Name, flags, pad); + break; + case WitVariantKind variant: + EmitVariant(sb, type.Name, variant, ctx, pad); + break; + } + } + } + + private static void EmitRecord(StringBuilder sb, string name, WitRecordKind record, EmitContext ctx, string pad) + { + var typeName = EmitContext.ToPascalCase(name); + sb.Append(pad).Append("public sealed record class ").Append(typeName).Append('('); + + for (var i = 0; i < record.Fields.Count; i++) + { + if (i > 0) + { + sb.Append(", "); + } + var field = record.Fields[i]; + sb.Append(ctx.ResolveTypeRef(field.Type)).Append(' ').Append(EmitContext.ToPascalCase(field.Name)); + } + + sb.AppendLine(");"); + } + + private static void EmitEnum(StringBuilder sb, string name, WitEnumKind @enum, string pad) + { + var typeName = EmitContext.ToPascalCase(name); + var backing = @enum.Cases.Count switch + { + <= 256 => "byte", + <= 65536 => "ushort", + _ => "uint", + }; + + sb.Append(pad).Append("public enum ").Append(typeName).Append(" : ").Append(backing).AppendLine(); + sb.Append(pad).AppendLine("{"); + for (var i = 0; i < @enum.Cases.Count; i++) + { + sb.Append(pad).Append(" ").Append(EmitContext.ToPascalCase(@enum.Cases[i])).Append(" = ").Append(i).AppendLine(","); + } + sb.Append(pad).AppendLine("}"); + } + + private static void EmitFlags(StringBuilder sb, string name, WitFlagsKind flags, string pad) + { + var typeName = EmitContext.ToPascalCase(name); + var backing = flags.Flags.Count switch + { + <= 8 => "byte", + <= 16 => "ushort", + <= 32 => "uint", + _ => "ulong", + }; + + sb.Append(pad).AppendLine("[System.Flags]"); + sb.Append(pad).Append("public enum ").Append(typeName).Append(" : ").Append(backing).AppendLine(); + sb.Append(pad).AppendLine("{"); + sb.Append(pad).AppendLine(" None = 0,"); + for (var i = 0; i < flags.Flags.Count; i++) + { + var bit = 1UL << i; + sb.Append(pad).Append(" ").Append(EmitContext.ToPascalCase(flags.Flags[i])).Append(" = ").Append(bit).AppendLine(","); + } + sb.Append(pad).AppendLine("}"); + } + + private static void EmitVariant(StringBuilder sb, string name, WitVariantKind variant, EmitContext ctx, string pad) + { + var typeName = EmitContext.ToPascalCase(name); + sb.Append(pad).Append("public abstract record ").Append(typeName).AppendLine(); + sb.Append(pad).AppendLine("{"); + sb.Append(pad).Append(" private ").Append(typeName).AppendLine("() { }"); + sb.AppendLine(); + + foreach (var c in variant.Cases) + { + var caseName = EmitContext.ToPascalCase(c.Name); + sb.Append(pad).Append(" public sealed record ").Append(caseName); + if (c.Payload is not null) + { + sb.Append('(').Append(ctx.ResolveTypeRef(c.Payload)).Append(" Value)"); + } + else + { + sb.Append("()"); + } + sb.Append(" : ").Append(typeName).AppendLine(";"); + } + + sb.Append(pad).AppendLine("}"); + } +} diff --git a/src/Wasmtime.Component.SourceGenerators/WitBindingsGenerator.cs b/src/Wasmtime.Component.SourceGenerators/WitBindingsGenerator.cs index b8e6d842..0c08305d 100644 --- a/src/Wasmtime.Component.SourceGenerators/WitBindingsGenerator.cs +++ b/src/Wasmtime.Component.SourceGenerators/WitBindingsGenerator.cs @@ -8,6 +8,7 @@ using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.Text; using Wasmtime.Component.SourceGenerators.Diagnostics; +using Wasmtime.Component.SourceGenerators.Emit; using Wasmtime.Component.SourceGenerators.Wit; namespace Wasmtime.Component.SourceGenerators; @@ -161,6 +162,10 @@ private static void Emit( } sb.AppendLine(" };"); + sb.AppendLine(); + var ctx = new EmitContext(model.Types); + TypeEmitter.EmitNamedTypes(sb, model, ctx, indent: 4); + sb.AppendLine("}"); var hint = $"{request.ClassName}.WitBindings.g.cs"; diff --git a/tests/ComponentBindingsGeneratorTests.cs b/tests/ComponentBindingsGeneratorTests.cs index 5ecf49fb..7df55bb3 100644 --- a/tests/ComponentBindingsGeneratorTests.cs +++ b/tests/ComponentBindingsGeneratorTests.cs @@ -44,4 +44,43 @@ public void Generator_EmitsNamedTypes() { FixtureBindings.WitTypeNames.Should().Contain(new[] { "point", "priority", "permissions", "greeting" }); } + + [Fact] + public void Generator_EmitsRecord() + { + var p = new FixtureBindings.Point(3, 4); + p.X.Should().Be(3u); + p.Y.Should().Be(4u); + } + + [Fact] + public void Generator_EmitsEnum() + { + var v = FixtureBindings.Priority.High; + v.Should().Be(FixtureBindings.Priority.High); + ((byte)v).Should().Be(2); + } + + [Fact] + public void Generator_EmitsFlags() + { + var flags = FixtureBindings.Permissions.Read | FixtureBindings.Permissions.Write; + flags.HasFlag(FixtureBindings.Permissions.Read).Should().BeTrue(); + flags.HasFlag(FixtureBindings.Permissions.Execute).Should().BeFalse(); + } + + [Fact] + public void Generator_EmitsVariantWithPayload() + { + FixtureBindings.Greeting g = new FixtureBindings.Greeting.Formal("Sir"); + g.Should().BeOfType(); + ((FixtureBindings.Greeting.Formal)g).Value.Should().Be("Sir"); + } + + [Fact] + public void Generator_EmitsVariantWithoutPayload() + { + FixtureBindings.Greeting g = new FixtureBindings.Greeting.None(); + g.Should().BeOfType(); + } } From bafab6ea8750819025294fd8c7c5936a73e410e4 Mon Sep 17 00:00:00 2001 From: ZverGuy Date: Sun, 3 May 2026 02:05:36 +0300 Subject: [PATCH 17/26] feat(components): emit C# call wrappers for primitive-signature exports MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Generates a constructor + method per WIT export whose params and result are all primitives (bool / sN / uN / fN / char / string), giving users a fully-typed entry point that delegates to ComponentInstance.GetFunction and ComponentValue marshalling under the hood. Surface: - src/Wasmtime.Component.SourceGenerators/Emit/FunctionEmitter.cs — emits `Bindings(ComponentInstance instance)` plus, for each primitive export, a method like `public uint Square(uint n) { ... }` that builds a ComponentValue[] for the args, calls the function, and lifts the result back to the C# primitive. Composite-signature exports get a `// TODO` placeholder so users can see what the follow-up will cover. - WitBindingsGenerator now invokes FunctionEmitter after TypeEmitter, so the generated partial class contains both type definitions and method bindings for the world's exports. Fixture additions to exercise the new code path: - fixtures.wit / fixtures-src/wit/world.wit — `export square: func(n: u32) -> u32;`. - fixtures-src/src/lib.rs — Rust impl returning n * n. - fixtures.wasm + fixtures.wit.json regenerated via cargo-component + wasm-tools. Tests: - Generator_EmitsPrimitiveExportMethod_EndToEnd — instantiates the fixture component, constructs `new FixtureBindings(instance)`, and asserts `bindings.Square(7) == 49u` and `Square(0) == 0u`. This is the first commit where the entire pipeline (WIT -> JSON -> C# -> ComponentValue marshalling -> wasmtime) is exercised end-to-end through generated code. - WitExportCount / WitExportNames updated to include the new export. Total component-test count: 65 passing. Co-Authored-By: Claude Signed-off-by: ZverGuy --- .../Emit/FunctionEmitter.cs | 177 ++++++++++++++++++ .../WitBindingsGenerator.cs | 3 + tests/ComponentBindingsGeneratorTests.cs | 34 +++- tests/Components/fixtures-src/src/lib.rs | 4 + tests/Components/fixtures-src/wit/world.wit | 2 + tests/Components/fixtures.wasm | Bin 47791 -> 47886 bytes tests/Components/fixtures.wit | 2 + tests/Components/fixtures.wit.json | 13 ++ 8 files changed, 234 insertions(+), 1 deletion(-) create mode 100644 src/Wasmtime.Component.SourceGenerators/Emit/FunctionEmitter.cs diff --git a/src/Wasmtime.Component.SourceGenerators/Emit/FunctionEmitter.cs b/src/Wasmtime.Component.SourceGenerators/Emit/FunctionEmitter.cs new file mode 100644 index 00000000..a15cec4b --- /dev/null +++ b/src/Wasmtime.Component.SourceGenerators/Emit/FunctionEmitter.cs @@ -0,0 +1,177 @@ +using System.Text; +using Wasmtime.Component.SourceGenerators.Wit; + +namespace Wasmtime.Component.SourceGenerators.Emit; + +/// +/// Emits C# methods that invoke component exports. Currently restricted to functions whose +/// parameters and return types are all WIT primitives — composite arg/result lifting/lowering +/// will be wired up in a follow-up commit. +/// +internal static class FunctionEmitter +{ + public static void EmitInfrastructure(StringBuilder sb, string indent) + { + sb.Append(indent).AppendLine("private readonly Wasmtime.Components.ComponentInstance _instance;"); + sb.AppendLine(); + sb.Append(indent).AppendLine("public static T Bind(Wasmtime.Components.ComponentInstance instance) where T : new() => throw new System.NotSupportedException();"); + sb.AppendLine(); + } + + /// + /// Emits a constructor and per-export methods for the bindings class. + /// + public static void EmitMethods( + StringBuilder sb, + string className, + WitWorldDef world, + EmitContext ctx, + string indent) + { + sb.Append(indent).Append("private readonly Wasmtime.Components.ComponentInstance _instance;").AppendLine(); + sb.AppendLine(); + sb.Append(indent).Append("public ").Append(className).AppendLine("(Wasmtime.Components.ComponentInstance instance)"); + sb.Append(indent).AppendLine("{"); + sb.Append(indent).AppendLine(" _instance = instance ?? throw new System.ArgumentNullException(nameof(instance));"); + sb.Append(indent).AppendLine("}"); + sb.AppendLine(); + + foreach (var item in world.Exports) + { + if (item.Kind is not WitWorldItemFunction fn) + { + continue; + } + + EmitMethod(sb, item.Name, fn.Function, ctx, indent); + } + } + + private static void EmitMethod( + StringBuilder sb, + string exportName, + WitFunction function, + EmitContext ctx, + string indent) + { + if (!IsPrimitiveSignature(function)) + { + sb.Append(indent).Append("// TODO: bindings for '").Append(exportName).AppendLine("' (composite signature) — pending FunctionEmitter step."); + sb.AppendLine(); + return; + } + + var methodName = EmitContext.ToPascalCase(function.Name); + var resultType = function.Result is null ? "void" : ctx.ResolveTypeRef(function.Result); + + sb.Append(indent).Append("public ").Append(resultType).Append(' ').Append(methodName).Append('('); + for (var i = 0; i < function.Params.Count; i++) + { + if (i > 0) + { + sb.Append(", "); + } + var p = function.Params[i]; + sb.Append(ctx.ResolveTypeRef(p.Type)).Append(' ').Append(EmitContext.ToCamelCase(p.Name)); + } + sb.Append(')').AppendLine(); + sb.Append(indent).AppendLine("{"); + + sb.Append(indent).Append(" var func = _instance.GetFunction(\"").Append(EscapeString(exportName)).AppendLine("\")"); + sb.Append(indent).Append(" ?? throw new System.InvalidOperationException(\"Component does not export '").Append(EscapeString(exportName)).AppendLine("'.\");"); + + sb.Append(indent).Append(" var args = new Wasmtime.Components.ComponentValue[").Append(function.Params.Count).AppendLine("];"); + for (var i = 0; i < function.Params.Count; i++) + { + sb.Append(indent).Append(" args[").Append(i).Append("] = "); + sb.Append(LowerPrimitive(function.Params[i].Type, EmitContext.ToCamelCase(function.Params[i].Name))).AppendLine(";"); + } + + var hasResult = function.Result is not null; + sb.Append(indent).Append(" var rets = new Wasmtime.Components.ComponentValue[").Append(hasResult ? 1 : 0).AppendLine("];"); + sb.Append(indent).AppendLine(" func.Call(args, rets);"); + + if (hasResult) + { + sb.Append(indent).Append(" return ").Append(LiftPrimitive(function.Result!, "rets[0]")).AppendLine(";"); + } + + sb.Append(indent).AppendLine("}"); + sb.AppendLine(); + } + + private static bool IsPrimitiveSignature(WitFunction function) + { + foreach (var p in function.Params) + { + if (!IsPrimitive(p.Type)) + { + return false; + } + } + + if (function.Result is not null && !IsPrimitive(function.Result)) + { + return false; + } + + return true; + } + + private static bool IsPrimitive(WitTypeRef typeRef) + { + return typeRef is WitTypeRefPrimitive p && p.Name switch + { + "bool" or "s8" or "u8" or "s16" or "u16" + or "s32" or "u32" or "s64" or "u64" + or "f32" or "f64" or "char" or "string" => true, + _ => false, + }; + } + + private static string LowerPrimitive(WitTypeRef typeRef, string variable) + { + var name = ((WitTypeRefPrimitive)typeRef).Name; + return name switch + { + "bool" => $"Wasmtime.Components.ComponentValue.FromBool({variable})", + "s8" => $"Wasmtime.Components.ComponentValue.FromS8({variable})", + "u8" => $"Wasmtime.Components.ComponentValue.FromU8({variable})", + "s16" => $"Wasmtime.Components.ComponentValue.FromS16({variable})", + "u16" => $"Wasmtime.Components.ComponentValue.FromU16({variable})", + "s32" => $"Wasmtime.Components.ComponentValue.FromS32({variable})", + "u32" => $"Wasmtime.Components.ComponentValue.FromU32({variable})", + "s64" => $"Wasmtime.Components.ComponentValue.FromS64({variable})", + "u64" => $"Wasmtime.Components.ComponentValue.FromU64({variable})", + "f32" => $"Wasmtime.Components.ComponentValue.FromF32({variable})", + "f64" => $"Wasmtime.Components.ComponentValue.FromF64({variable})", + "char" => $"Wasmtime.Components.ComponentValue.FromChar({variable})", + "string" => $"Wasmtime.Components.ComponentValue.FromString({variable})", + _ => $"throw new System.NotSupportedException(\"Cannot lower {name}\")", + }; + } + + private static string LiftPrimitive(WitTypeRef typeRef, string source) + { + var name = ((WitTypeRefPrimitive)typeRef).Name; + return name switch + { + "bool" => $"{source}.AsBool()", + "s8" => $"{source}.AsS8()", + "u8" => $"{source}.AsU8()", + "s16" => $"{source}.AsS16()", + "u16" => $"{source}.AsU16()", + "s32" => $"{source}.AsS32()", + "u32" => $"{source}.AsU32()", + "s64" => $"{source}.AsS64()", + "u64" => $"{source}.AsU64()", + "f32" => $"{source}.AsF32()", + "f64" => $"{source}.AsF64()", + "char" => $"{source}.AsChar()", + "string" => $"{source}.AsString()", + _ => $"throw new System.NotSupportedException(\"Cannot lift {name}\")", + }; + } + + private static string EscapeString(string value) => value.Replace("\\", "\\\\").Replace("\"", "\\\""); +} diff --git a/src/Wasmtime.Component.SourceGenerators/WitBindingsGenerator.cs b/src/Wasmtime.Component.SourceGenerators/WitBindingsGenerator.cs index 0c08305d..e7aef3ca 100644 --- a/src/Wasmtime.Component.SourceGenerators/WitBindingsGenerator.cs +++ b/src/Wasmtime.Component.SourceGenerators/WitBindingsGenerator.cs @@ -166,6 +166,9 @@ private static void Emit( var ctx = new EmitContext(model.Types); TypeEmitter.EmitNamedTypes(sb, model, ctx, indent: 4); + sb.AppendLine(); + FunctionEmitter.EmitMethods(sb, request.ClassName, world, ctx, " "); + sb.AppendLine("}"); var hint = $"{request.ClassName}.WitBindings.g.cs"; diff --git a/tests/ComponentBindingsGeneratorTests.cs b/tests/ComponentBindingsGeneratorTests.cs index 7df55bb3..f7c78e15 100644 --- a/tests/ComponentBindingsGeneratorTests.cs +++ b/tests/ComponentBindingsGeneratorTests.cs @@ -1,3 +1,5 @@ +using System.IO; +using System.Reflection; using FluentAssertions; using Wasmtime.Components; using Xunit; @@ -20,7 +22,7 @@ public void Generator_EmitsConstantsFromJsonIr() // (list, result, option, tuple) FixtureBindings.WitTypeCount.Should().Be(8); FixtureBindings.WitImportCount.Should().Be(4); - FixtureBindings.WitExportCount.Should().Be(8); + FixtureBindings.WitExportCount.Should().Be(9); } [Fact] @@ -36,6 +38,7 @@ public void Generator_EmitsExportNames() "safe-divide", "find", "pair", + "square", }, options => options.WithStrictOrdering()); } @@ -83,4 +86,33 @@ public void Generator_EmitsVariantWithoutPayload() FixtureBindings.Greeting g = new FixtureBindings.Greeting.None(); g.Should().BeOfType(); } + + [Fact] + public void Generator_EmitsPrimitiveExportMethod_EndToEnd() + { + var bytes = LoadFixtureBytes("fixtures.wasm"); + + using var engine = new Engine(); + using var component = Component.FromBytes(engine, bytes); + using var linker = new ComponentLinker(engine); + using var store = new Store(engine); + + store.SetWasiConfiguration(new WasiConfiguration()); + linker.AddWasiPreview2(); + + var instance = linker.Instantiate(store, component); + var bindings = new FixtureBindings(instance); + + bindings.Square(7).Should().Be(49u); + bindings.Square(0).Should().Be(0u); + } + + private static byte[] LoadFixtureBytes(string name) + { + using var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(name) + ?? throw new FileNotFoundException($"Fixture '{name}' not found."); + using var ms = new MemoryStream(); + stream.CopyTo(ms); + return ms.ToArray(); + } } diff --git a/tests/Components/fixtures-src/src/lib.rs b/tests/Components/fixtures-src/src/lib.rs index 218fcd1d..8e6db541 100644 --- a/tests/Components/fixtures-src/src/lib.rs +++ b/tests/Components/fixtures-src/src/lib.rs @@ -49,6 +49,10 @@ impl Guest for Component { fn pair() -> (u32, String) { (7, "seven".into()) } + + fn square(n: u32) -> u32 { + n * n + } } bindings::export!(Component with_types_in bindings); diff --git a/tests/Components/fixtures-src/wit/world.wit b/tests/Components/fixtures-src/wit/world.wit index 10701c06..338aea6f 100644 --- a/tests/Components/fixtures-src/wit/world.wit +++ b/tests/Components/fixtures-src/wit/world.wit @@ -36,4 +36,6 @@ world fixture { export safe-divide: func(n: u32, d: u32) -> result; export find: func(needle: u32) -> option; export pair: func() -> tuple; + + export square: func(n: u32) -> u32; } diff --git a/tests/Components/fixtures.wasm b/tests/Components/fixtures.wasm index fd268aadc04595c57cf7f588e7c766466e23f16e..8d64ecc61e00e0abf1c2af78d273cc25ee6d78bb 100644 GIT binary patch delta 2045 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 result; export find: func(needle: u32) -> option; export pair: func() -> tuple; + + export square: func(n: u32) -> u32; } diff --git a/tests/Components/fixtures.wit.json b/tests/Components/fixtures.wit.json index 5dd830af..868f2cf8 100644 --- a/tests/Components/fixtures.wit.json +++ b/tests/Components/fixtures.wit.json @@ -99,6 +99,19 @@ "params": [], "result": 7 } + }, + "square": { + "function": { + "name": "square", + "kind": "freestanding", + "params": [ + { + "name": "n", + "type": "u32" + } + ], + "result": "u32" + } } }, "package": 0, From b7bc83e7af7a2977211e7f63a404b9eae411cc35 Mon Sep 17 00:00:00 2001 From: ZverGuy Date: Sun, 3 May 2026 02:11:46 +0300 Subject: [PATCH 18/26] feat(components): generate lift/lower for every composite signature Closes the TODO placeholders in generated bindings: every WIT export now emits a typed C# call wrapper, including those whose params or result are composite (record / enum / flags / variant / list / option / result / tuple). Approach: - Static per-named-type helpers (`LowerPoint` / `LiftPoint`, `LowerPriority` / `LiftPriority`, ...) live on the bindings class and are reused by every method that touches the type. They handle the field-by-field marshalling for records, the case-name <-> C# enum case mapping for enum / flags, and the discriminant-driven construction for variants. - Anonymous structural types (list, option, result, tuple) compile to inline expressions via System.Linq.Enumerable.Select for lists, conditional FromOk / FromErr for results, etc. They don't get their own helpers since the element type changes per-occurrence. - Each generated method wraps the call in try/finally so allocated args and any composite results from wasmtime get Free()-ed. Tests cover all nine exports end-to-end through generated bindings: - Square (primitive), Origin (record), TopPriority (enum), Defaults (flags), Greet (variant w/ payload), Range (list), Find (option / some & none), SafeDivide (result / ok & err), Pair (tuple). Total component-test count: 73 passing. Co-Authored-By: Claude Signed-off-by: ZverGuy --- .../Emit/EmitContext.cs | 9 + .../Emit/FunctionEmitter.cs | 492 +++++++++++++++--- .../WitBindingsGenerator.cs | 2 +- tests/ComponentBindingsGeneratorTests.cs | 157 +++++- tests/Wasmtime.Tests.csproj | 1 + 5 files changed, 575 insertions(+), 86 deletions(-) diff --git a/src/Wasmtime.Component.SourceGenerators/Emit/EmitContext.cs b/src/Wasmtime.Component.SourceGenerators/Emit/EmitContext.cs index dcd33552..0ee243e0 100644 --- a/src/Wasmtime.Component.SourceGenerators/Emit/EmitContext.cs +++ b/src/Wasmtime.Component.SourceGenerators/Emit/EmitContext.cs @@ -18,6 +18,15 @@ public EmitContext(IReadOnlyList types) this.types = types; } + public WitTypeDef? GetTypeDef(int index) + { + if (index < 0 || index >= types.Count) + { + return null; + } + return types[index]; + } + public string ResolveTypeRef(WitTypeRef typeRef) { return typeRef switch diff --git a/src/Wasmtime.Component.SourceGenerators/Emit/FunctionEmitter.cs b/src/Wasmtime.Component.SourceGenerators/Emit/FunctionEmitter.cs index a15cec4b..16f35291 100644 --- a/src/Wasmtime.Component.SourceGenerators/Emit/FunctionEmitter.cs +++ b/src/Wasmtime.Component.SourceGenerators/Emit/FunctionEmitter.cs @@ -1,30 +1,25 @@ +using System.Collections.Generic; +using System.Linq; using System.Text; using Wasmtime.Component.SourceGenerators.Wit; namespace Wasmtime.Component.SourceGenerators.Emit; /// -/// Emits C# methods that invoke component exports. Currently restricted to functions whose -/// parameters and return types are all WIT primitives — composite arg/result lifting/lowering -/// will be wired up in a follow-up commit. +/// Emits C# methods that invoke component exports plus the per-named-type lift/lower helpers +/// they delegate to. /// internal static class FunctionEmitter { - public static void EmitInfrastructure(StringBuilder sb, string indent) - { - sb.Append(indent).AppendLine("private readonly Wasmtime.Components.ComponentInstance _instance;"); - sb.AppendLine(); - sb.Append(indent).AppendLine("public static T Bind(Wasmtime.Components.ComponentInstance instance) where T : new() => throw new System.NotSupportedException();"); - sb.AppendLine(); - } + private const string Cv = "Wasmtime.Components.ComponentValue"; + private const string Rf = "Wasmtime.Components.RecordField"; + private const string Result = "Wasmtime.Components.Result"; - /// - /// Emits a constructor and per-export methods for the bindings class. - /// public static void EmitMethods( StringBuilder sb, string className, WitWorldDef world, + WitModel model, EmitContext ctx, string indent) { @@ -36,6 +31,8 @@ public static void EmitMethods( sb.Append(indent).AppendLine("}"); sb.AppendLine(); + EmitNamedTypeHelpers(sb, model, ctx, indent); + foreach (var item in world.Exports) { if (item.Kind is not WitWorldItemFunction fn) @@ -54,13 +51,6 @@ private static void EmitMethod( EmitContext ctx, string indent) { - if (!IsPrimitiveSignature(function)) - { - sb.Append(indent).Append("// TODO: bindings for '").Append(exportName).AppendLine("' (composite signature) — pending FunctionEmitter step."); - sb.AppendLine(); - return; - } - var methodName = EmitContext.ToPascalCase(function.Name); var resultType = function.Result is null ? "void" : ctx.ResolveTypeRef(function.Result); @@ -80,98 +70,448 @@ private static void EmitMethod( sb.Append(indent).Append(" var func = _instance.GetFunction(\"").Append(EscapeString(exportName)).AppendLine("\")"); sb.Append(indent).Append(" ?? throw new System.InvalidOperationException(\"Component does not export '").Append(EscapeString(exportName)).AppendLine("'.\");"); - sb.Append(indent).Append(" var args = new Wasmtime.Components.ComponentValue[").Append(function.Params.Count).AppendLine("];"); + sb.Append(indent).Append(" var args = new ").Append(Cv).Append('[').Append(function.Params.Count).AppendLine("];"); for (var i = 0; i < function.Params.Count; i++) { - sb.Append(indent).Append(" args[").Append(i).Append("] = "); - sb.Append(LowerPrimitive(function.Params[i].Type, EmitContext.ToCamelCase(function.Params[i].Name))).AppendLine(";"); + var paramName = EmitContext.ToCamelCase(function.Params[i].Name); + sb.Append(indent).Append(" args[").Append(i).Append("] = ").Append(LowerExpr(function.Params[i].Type, paramName, ctx)).AppendLine(";"); } var hasResult = function.Result is not null; - sb.Append(indent).Append(" var rets = new Wasmtime.Components.ComponentValue[").Append(hasResult ? 1 : 0).AppendLine("];"); - sb.Append(indent).AppendLine(" func.Call(args, rets);"); + sb.Append(indent).Append(" var rets = new ").Append(Cv).Append('[').Append(hasResult ? 1 : 0).AppendLine("];"); + sb.Append(indent).AppendLine(" try"); + sb.Append(indent).AppendLine(" {"); + sb.Append(indent).AppendLine(" func.Call(args, rets);"); if (hasResult) { - sb.Append(indent).Append(" return ").Append(LiftPrimitive(function.Result!, "rets[0]")).AppendLine(";"); + sb.Append(indent).Append(" return ").Append(LiftExpr(function.Result!, "rets[0]", ctx)).AppendLine(";"); + } + + sb.Append(indent).AppendLine(" }"); + sb.Append(indent).AppendLine(" finally"); + sb.Append(indent).AppendLine(" {"); + sb.Append(indent).AppendLine(" for (var i = 0; i < args.Length; i++) args[i].Free();"); + sb.Append(indent).AppendLine(" for (var i = 0; i < rets.Length; i++) rets[i].Free();"); + sb.Append(indent).AppendLine(" }"); + sb.Append(indent).AppendLine("}"); + sb.AppendLine(); + } + + /// + /// Emits static helpers LowerXxx(Xxx) / LiftXxx(ComponentValue) for every + /// named WIT type so per-function emission can delegate to them and avoid inlining. + /// + private static void EmitNamedTypeHelpers(StringBuilder sb, WitModel model, EmitContext ctx, string indent) + { + foreach (var type in model.Types) + { + if (type.Name is null) + { + continue; + } + + switch (type.Kind) + { + case WitRecordKind record: + EmitRecordHelpers(sb, type.Name, record, ctx, indent); + break; + case WitEnumKind @enum: + EmitEnumHelpers(sb, type.Name, @enum, indent); + break; + case WitFlagsKind flags: + EmitFlagsHelpers(sb, type.Name, flags, indent); + break; + case WitVariantKind variant: + EmitVariantHelpers(sb, type.Name, variant, ctx, indent); + break; + } + } + } + + private static void EmitRecordHelpers(StringBuilder sb, string name, WitRecordKind record, EmitContext ctx, string indent) + { + var pascal = EmitContext.ToPascalCase(name); + + sb.Append(indent).Append("private static ").Append(Cv).Append(" Lower").Append(pascal).Append('(').Append(pascal).Append(" value)").AppendLine(); + sb.Append(indent).AppendLine("{"); + sb.Append(indent).Append(" return ").Append(Cv).AppendLine(".FromRecord(new[]"); + sb.Append(indent).AppendLine(" {"); + foreach (var field in record.Fields) + { + sb.Append(indent).Append(" new ").Append(Rf).Append("(\"").Append(EscapeString(field.Name)).Append("\", ") + .Append(LowerExpr(field.Type, "value." + EmitContext.ToPascalCase(field.Name), ctx)) + .AppendLine("),"); + } + sb.Append(indent).AppendLine(" });"); + sb.Append(indent).AppendLine("}"); + sb.AppendLine(); + + sb.Append(indent).Append("private static ").Append(pascal).Append(" Lift").Append(pascal).Append('(').Append(Cv).Append(" value)").AppendLine(); + sb.Append(indent).AppendLine("{"); + sb.Append(indent).AppendLine(" var fields = value.AsRecord();"); + foreach (var field in record.Fields) + { + var fieldType = ctx.ResolveTypeRef(field.Type); + sb.Append(indent).Append(" ").Append(fieldType).Append(' ').Append(EmitContext.ToCamelCase(field.Name)).Append(" = default!;").AppendLine(); + } + sb.Append(indent).AppendLine(" foreach (var f in fields)"); + sb.Append(indent).AppendLine(" {"); + sb.Append(indent).AppendLine(" switch (f.Name)"); + sb.Append(indent).AppendLine(" {"); + foreach (var field in record.Fields) + { + sb.Append(indent).Append(" case \"").Append(EscapeString(field.Name)).Append("\": ") + .Append(EmitContext.ToCamelCase(field.Name)).Append(" = ") + .Append(LiftExpr(field.Type, "f.Value", ctx)).AppendLine("; break;"); + } + sb.Append(indent).AppendLine(" }"); + sb.Append(indent).AppendLine(" }"); + sb.Append(indent).Append(" return new ").Append(pascal).Append('('); + for (var i = 0; i < record.Fields.Count; i++) + { + if (i > 0) + { + sb.Append(", "); + } + sb.Append(EmitContext.ToCamelCase(record.Fields[i].Name)); + } + sb.AppendLine(");"); + sb.Append(indent).AppendLine("}"); + sb.AppendLine(); + } + + private static void EmitEnumHelpers(StringBuilder sb, string name, WitEnumKind @enum, string indent) + { + var pascal = EmitContext.ToPascalCase(name); + + sb.Append(indent).Append("private static ").Append(Cv).Append(" Lower").Append(pascal).Append('(').Append(pascal).Append(" value)").AppendLine(); + sb.Append(indent).AppendLine("{"); + sb.Append(indent).AppendLine(" return value switch"); + sb.Append(indent).AppendLine(" {"); + foreach (var c in @enum.Cases) + { + sb.Append(indent).Append(" ").Append(pascal).Append('.').Append(EmitContext.ToPascalCase(c)).Append(" => ") + .Append(Cv).Append(".FromEnum(\"").Append(EscapeString(c)).AppendLine("\"),"); + } + sb.Append(indent).Append(" _ => throw new System.ArgumentOutOfRangeException(nameof(value)),").AppendLine(); + sb.Append(indent).AppendLine(" };"); + sb.Append(indent).AppendLine("}"); + sb.AppendLine(); + + sb.Append(indent).Append("private static ").Append(pascal).Append(" Lift").Append(pascal).Append('(').Append(Cv).Append(" value)").AppendLine(); + sb.Append(indent).AppendLine("{"); + sb.Append(indent).AppendLine(" return value.AsEnum() switch"); + sb.Append(indent).AppendLine(" {"); + foreach (var c in @enum.Cases) + { + sb.Append(indent).Append(" \"").Append(EscapeString(c)).Append("\" => ").Append(pascal).Append('.').Append(EmitContext.ToPascalCase(c)).AppendLine(","); + } + sb.Append(indent).Append(" var other => throw new System.InvalidOperationException($\"Unknown enum case: {other}\"),").AppendLine(); + sb.Append(indent).AppendLine(" };"); + sb.Append(indent).AppendLine("}"); + sb.AppendLine(); + } + + private static void EmitFlagsHelpers(StringBuilder sb, string name, WitFlagsKind flags, string indent) + { + var pascal = EmitContext.ToPascalCase(name); + + sb.Append(indent).Append("private static ").Append(Cv).Append(" Lower").Append(pascal).Append('(').Append(pascal).Append(" value)").AppendLine(); + sb.Append(indent).AppendLine("{"); + sb.Append(indent).AppendLine(" var names = new System.Collections.Generic.List();"); + foreach (var f in flags.Flags) + { + sb.Append(indent).Append(" if ((value & ").Append(pascal).Append('.').Append(EmitContext.ToPascalCase(f)).Append(") != 0) names.Add(\"") + .Append(EscapeString(f)).AppendLine("\");"); + } + sb.Append(indent).Append(" return ").Append(Cv).AppendLine(".FromFlags(names);"); + sb.Append(indent).AppendLine("}"); + sb.AppendLine(); + + sb.Append(indent).Append("private static ").Append(pascal).Append(" Lift").Append(pascal).Append('(').Append(Cv).Append(" value)").AppendLine(); + sb.Append(indent).AppendLine("{"); + sb.Append(indent).Append(" var result = ").Append(pascal).AppendLine(".None;"); + sb.Append(indent).AppendLine(" foreach (var name in value.AsFlags())"); + sb.Append(indent).AppendLine(" {"); + sb.Append(indent).AppendLine(" switch (name)"); + sb.Append(indent).AppendLine(" {"); + foreach (var f in flags.Flags) + { + sb.Append(indent).Append(" case \"").Append(EscapeString(f)).Append("\": result |= ") + .Append(pascal).Append('.').Append(EmitContext.ToPascalCase(f)).AppendLine("; break;"); + } + sb.Append(indent).AppendLine(" }"); + sb.Append(indent).AppendLine(" }"); + sb.Append(indent).AppendLine(" return result;"); + sb.Append(indent).AppendLine("}"); + sb.AppendLine(); + } + + private static void EmitVariantHelpers(StringBuilder sb, string name, WitVariantKind variant, EmitContext ctx, string indent) + { + var pascal = EmitContext.ToPascalCase(name); + + sb.Append(indent).Append("private static ").Append(Cv).Append(" Lower").Append(pascal).Append('(').Append(pascal).Append(" value)").AppendLine(); + sb.Append(indent).AppendLine("{"); + sb.Append(indent).AppendLine(" return value switch"); + sb.Append(indent).AppendLine(" {"); + foreach (var c in variant.Cases) + { + var caseName = EmitContext.ToPascalCase(c.Name); + sb.Append(indent).Append(" ").Append(pascal).Append('.').Append(caseName); + if (c.Payload is not null) + { + sb.Append(" v => ").Append(Cv).Append(".FromVariant(\"").Append(EscapeString(c.Name)).Append("\", ") + .Append(LowerExpr(c.Payload, "v.Value", ctx)).AppendLine("),"); + } + else + { + sb.Append(" => ").Append(Cv).Append(".FromVariant(\"").Append(EscapeString(c.Name)).AppendLine("\"),"); + } } + sb.Append(indent).Append(" _ => throw new System.ArgumentOutOfRangeException(nameof(value)),").AppendLine(); + sb.Append(indent).AppendLine(" };"); + sb.Append(indent).AppendLine("}"); + sb.AppendLine(); + sb.Append(indent).Append("private static ").Append(pascal).Append(" Lift").Append(pascal).Append('(').Append(Cv).Append(" value)").AppendLine(); + sb.Append(indent).AppendLine("{"); + sb.Append(indent).AppendLine(" var disc = value.AsVariantDiscriminant();"); + sb.Append(indent).AppendLine(" var payload = value.AsVariantPayload();"); + sb.Append(indent).AppendLine(" return disc switch"); + sb.Append(indent).AppendLine(" {"); + foreach (var c in variant.Cases) + { + var caseName = EmitContext.ToPascalCase(c.Name); + sb.Append(indent).Append(" \"").Append(EscapeString(c.Name)).Append("\" => "); + if (c.Payload is not null) + { + sb.Append("new ").Append(pascal).Append('.').Append(caseName).Append('(') + .Append(LiftExpr(c.Payload, "payload!.Value", ctx)).AppendLine("),"); + } + else + { + sb.Append("new ").Append(pascal).Append('.').Append(caseName).AppendLine("(),"); + } + } + sb.Append(indent).Append(" var other => throw new System.InvalidOperationException($\"Unknown variant case: {other}\"),").AppendLine(); + sb.Append(indent).AppendLine(" };"); sb.Append(indent).AppendLine("}"); sb.AppendLine(); } - private static bool IsPrimitiveSignature(WitFunction function) + private static string LowerExpr(WitTypeRef typeRef, string variable, EmitContext ctx) { - foreach (var p in function.Params) + if (typeRef is WitTypeRefPrimitive p) { - if (!IsPrimitive(p.Type)) + return LowerPrimitive(p.Name, variable); + } + + if (typeRef is WitTypeRefIndex idx) + { + var def = ctx.GetTypeDef(idx.Index); + if (def is null) { - return false; + return $"throw new System.NotSupportedException()"; } + + if (def.Name is not null) + { + return $"Lower{EmitContext.ToPascalCase(def.Name)}({variable})"; + } + + return def.Kind switch + { + WitListKind list => LowerList(list, variable, ctx), + WitOptionKind option => LowerOption(option, variable, ctx), + WitResultKind result => LowerResult(result, variable, ctx), + WitTupleKind tuple => LowerTuple(tuple, variable, ctx), + _ => $"throw new System.NotSupportedException()", + }; + } + + return $"throw new System.NotSupportedException()"; + } + + private static string LiftExpr(WitTypeRef typeRef, string source, EmitContext ctx) + { + if (typeRef is WitTypeRefPrimitive p) + { + return LiftPrimitive(p.Name, source); + } + + if (typeRef is WitTypeRefIndex idx) + { + var def = ctx.GetTypeDef(idx.Index); + if (def is null) + { + return $"throw new System.NotSupportedException()"; + } + + if (def.Name is not null) + { + return $"Lift{EmitContext.ToPascalCase(def.Name)}({source})"; + } + + return def.Kind switch + { + WitListKind list => LiftList(list, source, ctx), + WitOptionKind option => LiftOption(option, source, ctx), + WitResultKind result => LiftResult(result, source, ctx), + WitTupleKind tuple => LiftTuple(tuple, source, ctx), + _ => $"throw new System.NotSupportedException()", + }; } - if (function.Result is not null && !IsPrimitive(function.Result)) + return $"throw new System.NotSupportedException()"; + } + + private static string LowerList(WitListKind list, string variable, EmitContext ctx) + { + var elemType = ctx.ResolveTypeRef(list.Element); + return $"{Cv}.FromList(System.Linq.Enumerable.ToArray(System.Linq.Enumerable.Select<{elemType}, {Cv}>({variable}, e => {LowerExpr(list.Element, "e", ctx)})))"; + } + + private static string LiftList(WitListKind list, string source, EmitContext ctx) + { + var elemType = ctx.ResolveTypeRef(list.Element); + return $"System.Linq.Enumerable.ToArray(System.Linq.Enumerable.Select<{Cv}, {elemType}>({source}.AsList(), e => {LiftExpr(list.Element, "e", ctx)}))"; + } + + private static string LowerOption(WitOptionKind option, string variable, EmitContext ctx) + { + var inner = LowerExpr(option.Element, variable + ".Value", ctx); + if (IsValueType(option.Element, ctx)) { - return false; + return $"({variable}.HasValue ? {Cv}.FromOption({inner}) : {Cv}.FromOption(null))"; } + return $"({variable} is null ? {Cv}.FromOption(null) : {Cv}.FromOption({LowerExpr(option.Element, variable + "!", ctx)}))"; + } - return true; + private static string LiftOption(WitOptionKind option, string source, EmitContext ctx) + { + var inner = LiftExpr(option.Element, source + ".AsOption()!.Value", ctx); + var elemType = ctx.ResolveTypeRef(option.Element); + if (IsValueType(option.Element, ctx)) + { + return $"({source}.HasOption() ? ({elemType}?){inner} : null)"; + } + return $"({source}.HasOption() ? {inner} : null)"; + } + + private static string LowerResult(WitResultKind result, string variable, EmitContext ctx) + { + var okExpr = result.Ok is null + ? $"{Cv}.FromOk()" + : $"{Cv}.FromOk({LowerExpr(result.Ok, variable + ".Value", ctx)})"; + var errExpr = result.Err is null + ? $"{Cv}.FromErr()" + : $"{Cv}.FromErr({LowerExpr(result.Err, variable + ".Error", ctx)})"; + return $"({variable}.IsOk ? {okExpr} : {errExpr})"; } - private static bool IsPrimitive(WitTypeRef typeRef) + private static string LiftResult(WitResultKind result, string source, EmitContext ctx) { - return typeRef is WitTypeRefPrimitive p && p.Name switch + var okType = result.Ok is null ? "Wasmtime.Components.Unit" : ctx.ResolveTypeRef(result.Ok); + var errType = result.Err is null ? "Wasmtime.Components.Unit" : ctx.ResolveTypeRef(result.Err); + var okValue = result.Ok is null + ? "default(Wasmtime.Components.Unit)" + : LiftExpr(result.Ok, source + ".AsResultValue()!.Value", ctx); + var errValue = result.Err is null + ? "default(Wasmtime.Components.Unit)" + : LiftExpr(result.Err, source + ".AsResultValue()!.Value", ctx); + return $"({source}.IsOk() ? {Result}<{okType}, {errType}>.Ok({okValue}) : {Result}<{okType}, {errType}>.Err({errValue}))"; + } + + private static string LowerTuple(WitTupleKind tuple, string variable, EmitContext ctx) + { + var sb = new StringBuilder(); + sb.Append(Cv).Append(".FromTuple(new[] { "); + for (var i = 0; i < tuple.Elements.Count; i++) { - "bool" or "s8" or "u8" or "s16" or "u16" - or "s32" or "u32" or "s64" or "u64" - or "f32" or "f64" or "char" or "string" => true, - _ => false, - }; + if (i > 0) + { + sb.Append(", "); + } + sb.Append(LowerExpr(tuple.Elements[i], $"{variable}.Item{i + 1}", ctx)); + } + sb.Append(" })"); + return sb.ToString(); } - private static string LowerPrimitive(WitTypeRef typeRef, string variable) + private static string LiftTuple(WitTupleKind tuple, string source, EmitContext ctx) { - var name = ((WitTypeRefPrimitive)typeRef).Name; - return name switch + var sb = new StringBuilder(); + sb.Append('('); + for (var i = 0; i < tuple.Elements.Count; i++) { - "bool" => $"Wasmtime.Components.ComponentValue.FromBool({variable})", - "s8" => $"Wasmtime.Components.ComponentValue.FromS8({variable})", - "u8" => $"Wasmtime.Components.ComponentValue.FromU8({variable})", - "s16" => $"Wasmtime.Components.ComponentValue.FromS16({variable})", - "u16" => $"Wasmtime.Components.ComponentValue.FromU16({variable})", - "s32" => $"Wasmtime.Components.ComponentValue.FromS32({variable})", - "u32" => $"Wasmtime.Components.ComponentValue.FromU32({variable})", - "s64" => $"Wasmtime.Components.ComponentValue.FromS64({variable})", - "u64" => $"Wasmtime.Components.ComponentValue.FromU64({variable})", - "f32" => $"Wasmtime.Components.ComponentValue.FromF32({variable})", - "f64" => $"Wasmtime.Components.ComponentValue.FromF64({variable})", - "char" => $"Wasmtime.Components.ComponentValue.FromChar({variable})", - "string" => $"Wasmtime.Components.ComponentValue.FromString({variable})", - _ => $"throw new System.NotSupportedException(\"Cannot lower {name}\")", - }; + if (i > 0) + { + sb.Append(", "); + } + sb.Append(LiftExpr(tuple.Elements[i], $"{source}.AsTuple()[{i}]", ctx)); + } + sb.Append(')'); + return sb.ToString(); } - private static string LiftPrimitive(WitTypeRef typeRef, string source) + private static bool IsValueType(WitTypeRef typeRef, EmitContext ctx) { - var name = ((WitTypeRefPrimitive)typeRef).Name; - return name switch + if (typeRef is WitTypeRefPrimitive p) + { + return p.Name != "string"; + } + + if (typeRef is WitTypeRefIndex idx) { - "bool" => $"{source}.AsBool()", - "s8" => $"{source}.AsS8()", - "u8" => $"{source}.AsU8()", - "s16" => $"{source}.AsS16()", - "u16" => $"{source}.AsU16()", - "s32" => $"{source}.AsS32()", - "u32" => $"{source}.AsU32()", - "s64" => $"{source}.AsS64()", - "u64" => $"{source}.AsU64()", - "f32" => $"{source}.AsF32()", - "f64" => $"{source}.AsF64()", - "char" => $"{source}.AsChar()", - "string" => $"{source}.AsString()", - _ => $"throw new System.NotSupportedException(\"Cannot lift {name}\")", - }; + var def = ctx.GetTypeDef(idx.Index); + return def?.Kind is WitEnumKind or WitFlagsKind; + } + + return false; } + private static string LowerPrimitive(string name, string variable) => name switch + { + "bool" => $"{Cv}.FromBool({variable})", + "s8" => $"{Cv}.FromS8({variable})", + "u8" => $"{Cv}.FromU8({variable})", + "s16" => $"{Cv}.FromS16({variable})", + "u16" => $"{Cv}.FromU16({variable})", + "s32" => $"{Cv}.FromS32({variable})", + "u32" => $"{Cv}.FromU32({variable})", + "s64" => $"{Cv}.FromS64({variable})", + "u64" => $"{Cv}.FromU64({variable})", + "f32" => $"{Cv}.FromF32({variable})", + "f64" => $"{Cv}.FromF64({variable})", + "char" => $"{Cv}.FromChar({variable})", + "string" => $"{Cv}.FromString({variable})", + _ => $"throw new System.NotSupportedException(\"primitive {name}\")", + }; + + private static string LiftPrimitive(string name, string source) => name switch + { + "bool" => $"{source}.AsBool()", + "s8" => $"{source}.AsS8()", + "u8" => $"{source}.AsU8()", + "s16" => $"{source}.AsS16()", + "u16" => $"{source}.AsU16()", + "s32" => $"{source}.AsS32()", + "u32" => $"{source}.AsU32()", + "s64" => $"{source}.AsS64()", + "u64" => $"{source}.AsU64()", + "f32" => $"{source}.AsF32()", + "f64" => $"{source}.AsF64()", + "char" => $"{source}.AsChar()", + "string" => $"{source}.AsString()", + _ => $"throw new System.NotSupportedException(\"primitive {name}\")", + }; + private static string EscapeString(string value) => value.Replace("\\", "\\\\").Replace("\"", "\\\""); + + public static void EmitInfrastructure(StringBuilder _, string __) + { + // kept for backwards compatibility with the previous wiring; nothing to emit here now. + } } diff --git a/src/Wasmtime.Component.SourceGenerators/WitBindingsGenerator.cs b/src/Wasmtime.Component.SourceGenerators/WitBindingsGenerator.cs index e7aef3ca..134c6798 100644 --- a/src/Wasmtime.Component.SourceGenerators/WitBindingsGenerator.cs +++ b/src/Wasmtime.Component.SourceGenerators/WitBindingsGenerator.cs @@ -167,7 +167,7 @@ private static void Emit( TypeEmitter.EmitNamedTypes(sb, model, ctx, indent: 4); sb.AppendLine(); - FunctionEmitter.EmitMethods(sb, request.ClassName, world, ctx, " "); + FunctionEmitter.EmitMethods(sb, request.ClassName, world, model, ctx, " "); sb.AppendLine("}"); diff --git a/tests/ComponentBindingsGeneratorTests.cs b/tests/ComponentBindingsGeneratorTests.cs index f7c78e15..204a55bf 100644 --- a/tests/ComponentBindingsGeneratorTests.cs +++ b/tests/ComponentBindingsGeneratorTests.cs @@ -87,24 +87,163 @@ public void Generator_EmitsVariantWithoutPayload() g.Should().BeOfType(); } - [Fact] - public void Generator_EmitsPrimitiveExportMethod_EndToEnd() + private static FixtureBindings CreateBindings(out Engine engine, out Component component, out ComponentLinker linker, out Store store) { var bytes = LoadFixtureBytes("fixtures.wasm"); - using var engine = new Engine(); - using var component = Component.FromBytes(engine, bytes); - using var linker = new ComponentLinker(engine); - using var store = new Store(engine); + engine = new Engine(); + component = Component.FromBytes(engine, bytes); + linker = new ComponentLinker(engine); + store = new Store(engine); store.SetWasiConfiguration(new WasiConfiguration()); linker.AddWasiPreview2(); var instance = linker.Instantiate(store, component); - var bindings = new FixtureBindings(instance); + return new FixtureBindings(instance); + } + + [Fact] + public void Generator_PrimitiveExport_EndToEnd() + { + var b = CreateBindings(out var engine, out var component, out var linker, out var store); + try + { + b.Square(7).Should().Be(49u); + b.Square(0).Should().Be(0u); + } + finally + { + store.Dispose(); linker.Dispose(); component.Dispose(); engine.Dispose(); + } + } + + [Fact] + public void Generator_RecordExport_EndToEnd() + { + var b = CreateBindings(out var engine, out var component, out var linker, out var store); + try + { + var p = b.Origin(); + p.Should().Be(new FixtureBindings.Point(3, 4)); + } + finally + { + store.Dispose(); linker.Dispose(); component.Dispose(); engine.Dispose(); + } + } + + [Fact] + public void Generator_EnumExport_EndToEnd() + { + var b = CreateBindings(out var engine, out var component, out var linker, out var store); + try + { + b.TopPriority().Should().Be(FixtureBindings.Priority.High); + } + finally + { + store.Dispose(); linker.Dispose(); component.Dispose(); engine.Dispose(); + } + } + + [Fact] + public void Generator_FlagsExport_EndToEnd() + { + var b = CreateBindings(out var engine, out var component, out var linker, out var store); + try + { + b.Defaults().Should().Be(FixtureBindings.Permissions.Read | FixtureBindings.Permissions.Write); + } + finally + { + store.Dispose(); linker.Dispose(); component.Dispose(); engine.Dispose(); + } + } + + [Fact] + public void Generator_VariantExport_EndToEnd() + { + var b = CreateBindings(out var engine, out var component, out var linker, out var store); + try + { + var formal = b.Greet(true); + formal.Should().BeOfType(); + ((FixtureBindings.Greeting.Formal)formal).Value.Should().Be("Sir"); + + var casual = b.Greet(false); + casual.Should().BeOfType(); + ((FixtureBindings.Greeting.Casual)casual).Value.Should().Be("hi"); + } + finally + { + store.Dispose(); linker.Dispose(); component.Dispose(); engine.Dispose(); + } + } + + [Fact] + public void Generator_ListExport_EndToEnd() + { + var b = CreateBindings(out var engine, out var component, out var linker, out var store); + try + { + b.Range().Should().Equal(10u, 20u, 30u); + } + finally + { + store.Dispose(); linker.Dispose(); component.Dispose(); engine.Dispose(); + } + } + + [Fact] + public void Generator_OptionExport_EndToEnd() + { + var b = CreateBindings(out var engine, out var component, out var linker, out var store); + try + { + b.Find(42).Should().Be("answer"); + b.Find(0).Should().BeNull(); + } + finally + { + store.Dispose(); linker.Dispose(); component.Dispose(); engine.Dispose(); + } + } + + [Fact] + public void Generator_ResultExport_EndToEnd() + { + var b = CreateBindings(out var engine, out var component, out var linker, out var store); + try + { + var ok = b.SafeDivide(10, 2); + ok.IsOk.Should().BeTrue(); + ok.Value.Should().Be(5u); - bindings.Square(7).Should().Be(49u); - bindings.Square(0).Should().Be(0u); + var err = b.SafeDivide(10, 0); + err.IsOk.Should().BeFalse(); + err.Error.Should().Be("division by zero"); + } + finally + { + store.Dispose(); linker.Dispose(); component.Dispose(); engine.Dispose(); + } + } + + [Fact] + public void Generator_TupleExport_EndToEnd() + { + var b = CreateBindings(out var engine, out var component, out var linker, out var store); + try + { + var (n, s) = b.Pair(); + n.Should().Be(7u); + s.Should().Be("seven"); + } + finally + { + store.Dispose(); linker.Dispose(); component.Dispose(); engine.Dispose(); + } } private static byte[] LoadFixtureBytes(string name) diff --git a/tests/Wasmtime.Tests.csproj b/tests/Wasmtime.Tests.csproj index db06a8a7..a5ada6e8 100644 --- a/tests/Wasmtime.Tests.csproj +++ b/tests/Wasmtime.Tests.csproj @@ -3,6 +3,7 @@ net9.0 false + true From 21abc8ed41d20276193734fcad0e3e3d6b872052 Mon Sep 17 00:00:00 2001 From: ZverGuy Date: Sun, 3 May 2026 02:14:43 +0300 Subject: [PATCH 19/26] test(components): record round-trip through generated bindings Adds an export that takes a record and returns a transformed record so the test exercises lower (host -> component) and lift (component -> host) on the same type in the same call. The host: var moved = bindings.Translate(new Point(1, 2), 10, 20); // moved == new Point(11, 22) This validates that the generated LowerPoint helper produces a ComponentValue wasmtime accepts as a record argument, and that the LiftPoint helper reconstructs an equivalent C# record from the result the component returns. Same code path that the existing per-type tests cover, but in a single round trip rather than just one direction. WIT / Rust impl / fixtures.wasm / fixtures.wit.json updated. Co-Authored-By: Claude Signed-off-by: ZverGuy --- tests/ComponentBindingsGeneratorTests.cs | 19 +++++++++++++++++- tests/Components/fixtures-src/src/lib.rs | 7 +++++++ tests/Components/fixtures-src/wit/world.wit | 2 ++ tests/Components/fixtures.wasm | Bin 47886 -> 48029 bytes tests/Components/fixtures.wit | 2 ++ tests/Components/fixtures.wit.json | 21 ++++++++++++++++++++ 6 files changed, 50 insertions(+), 1 deletion(-) diff --git a/tests/ComponentBindingsGeneratorTests.cs b/tests/ComponentBindingsGeneratorTests.cs index 204a55bf..98addffa 100644 --- a/tests/ComponentBindingsGeneratorTests.cs +++ b/tests/ComponentBindingsGeneratorTests.cs @@ -22,7 +22,7 @@ public void Generator_EmitsConstantsFromJsonIr() // (list, result, option, tuple) FixtureBindings.WitTypeCount.Should().Be(8); FixtureBindings.WitImportCount.Should().Be(4); - FixtureBindings.WitExportCount.Should().Be(9); + FixtureBindings.WitExportCount.Should().Be(10); } [Fact] @@ -39,6 +39,7 @@ public void Generator_EmitsExportNames() "find", "pair", "square", + "translate", }, options => options.WithStrictOrdering()); } @@ -230,6 +231,22 @@ public void Generator_ResultExport_EndToEnd() } } + [Fact] + public void Generator_RecordRoundTrip_EndToEnd() + { + var b = CreateBindings(out var engine, out var component, out var linker, out var store); + try + { + // Host constructs the record, ships it to the component, component returns a transformed record. + var moved = b.Translate(new FixtureBindings.Point(1, 2), 10, 20); + moved.Should().Be(new FixtureBindings.Point(11, 22)); + } + finally + { + store.Dispose(); linker.Dispose(); component.Dispose(); engine.Dispose(); + } + } + [Fact] public void Generator_TupleExport_EndToEnd() { diff --git a/tests/Components/fixtures-src/src/lib.rs b/tests/Components/fixtures-src/src/lib.rs index 8e6db541..bcdb372a 100644 --- a/tests/Components/fixtures-src/src/lib.rs +++ b/tests/Components/fixtures-src/src/lib.rs @@ -53,6 +53,13 @@ impl Guest for Component { fn square(n: u32) -> u32 { n * n } + + fn translate(p: Point, dx: u32, dy: u32) -> Point { + Point { + x: p.x + dx, + y: p.y + dy, + } + } } bindings::export!(Component with_types_in bindings); diff --git a/tests/Components/fixtures-src/wit/world.wit b/tests/Components/fixtures-src/wit/world.wit index 338aea6f..33c2a8f1 100644 --- a/tests/Components/fixtures-src/wit/world.wit +++ b/tests/Components/fixtures-src/wit/world.wit @@ -38,4 +38,6 @@ world fixture { export pair: func() -> tuple; export square: func(n: u32) -> u32; + + export translate: func(p: point, dx: u32, dy: u32) -> point; } diff --git a/tests/Components/fixtures.wasm b/tests/Components/fixtures.wasm index 8d64ecc61e00e0abf1c2af78d273cc25ee6d78bb..18e3575292b728d48c183014ca870f50044d5184 100644 GIT binary patch delta 1998 zcmZ`)X-rgC6u#%qFf4Bd9t@%)%bNul%Hp5_N7i{NiYtRPB~9F@A{I$S(5AFCl4vz* zBI-#>OI;A-Uaak_)@W)-YB6p6VK=RNt*r=%RvWEp+SqgFF+fv0lbkvC-0zt3umk4Mm30-b)z?(4 ztYk5mA=%`Y%!?{sd38ZuWkpTR@RT=C(JAldwcqLFMuWv0{>HkbAT< z;j@82k@7*3r{wAIKAIv+NH2|i3=`27WwX)c3RLItznVH4nM#}#Mysd(m0#k-s7bMp zgi{-ceHSN+qio=3F8AP`sN{$i{Z66?3X^}pi&0Zx4<=Z@f)>1M&5dal`%<)j+r|3> z*{yk^zcoRpCXE^nuooS1hep^zj0!s=QpQWyYR&Cu2W`Lh@ zTUxZ-C7jr~Xjra-+>FQ5RtFAn(Z1>PsC`?~_rYiA&2Z8Ml^GuR5qD+mfPI*kIVV-; zXBeodsN(^h8fl*nXxH&%<{~(OaiiBlGq#R?9X`O}?nLWufryY4P@6Y)P*)q}-8j`< zOnu+vPJ$bF-0gznc*8vky6{hT|1_G75{;Tkj2V&4%i0m(EP}k1RYRO-jae8l3e3qd zU4bRVr5zgkH3Zh;%?Vrs?VP0n0L}5<`#At-@WD6-!K|L_VQ2Ng zti*t7|D{+_CFXhR*XRl18O$i=FGN1#-#aQK_v&A{U98k+up->ZfE$?P9|{tQ)hd(q zrXdfq@DQzgphg`6g8u=5lr#kObd$*FPLKyU1w7))@rAAd>rkfR7NvhaB}pXs99|h; z35U>|n;myZ5NA>>g(6-!rb5Z!TemIuWy(%(ZUxDic?+n7?Rjma`|{^fLE7_6sE|+c zx02jYaE~BU0|3LCeq!jU7DO73f*Y&ttPqI=OlT|H;-g^Sv<+~ zve{C%IA9B*X6e>8mN`stPirr)3W59Du!Y~5pclKBj3a5Q>V${d-KtDO#6xjHp-CeO zAopU@GB2T*ESn?Hr&mmY-_cOFo%DC>zJZ6hw0=IFJXe2qazU^RUIWxx`QkSk_~M2J fW;I0sqrM&d&kYG7Lk<{NnnYWJcCg{5Q|tZ#R)kpC delta 1849 zcmZ`(X>3$g6u#%pbjtM2&^ydPr3-!2=`y9;6w)%CE;A3QEwZ(MG$yPfwzM_H7WiR8 zXo8UtQK2VNL2PM7HYtlwAjW7=phR2(3PQ2Urlo}{lthUng6F>J0LJ=W^5xufzjN-{ z?tS;J^v0jk0lOKR&|&UzEUOEXjFN#qQ+T+^WRh682_qv`7zV(GYa@1|Pj>QWEQ=RC zw{$`Ml0~((b&J^?tdW((nAo_aG?#Zmo-e? zS_ggDW$hZ>CrlHV6;x0qzE-T5tQvTq_SNv2K%_Bz7vV`h1>Q!xt(4@swmnxizl6=0=kSec75lP7-*!t( zVQ$IDTeNkK?@Vw)n;R1a(2mPvD+s@i-2v@dLtHaJ8_Myok%#8^Qo_rFI12rW8#ZfI zN;Gl?zjn;ryP28r9?{V67WrEN?#SSm&pG0^m#O;H`CvT!?-ackf zD`P8c$Mu=Bsccs=?IU*tW22U852bE2XDx<9_+r)?*n|UFD`5*(dE)IYf)Pm#QJdEt zZDcA98*cFw(?DPLB*9N;%67v?n3Wv^Jvb$M@KRZfvJ_BE6sO2?efHK+lp@P<<7z3& z)^Q6%O2ILYzaCmrCfdF6ry#TzHs9uCQVsvk@l!U1xo=W7-{e+>2u9xjo__+srx@_M zi1xfUXXLS9Vs?sv3U^$rs1^IX4XcA4lQNi5T)<&`kG|I-FjQ*3SFF?r@X~N21IfT- z{ZfIxT<`n+$#*6!)Q2qwTtC06WrA9S5yvz-?SGNes6*s=&PJSSYO!*x3#>g zOhe>tVWA9GjNibOH34EDshKU tuple; export square: func(n: u32) -> u32; + + export translate: func(p: point, dx: u32, dy: u32) -> point; } diff --git a/tests/Components/fixtures.wit.json b/tests/Components/fixtures.wit.json index 868f2cf8..5939fccb 100644 --- a/tests/Components/fixtures.wit.json +++ b/tests/Components/fixtures.wit.json @@ -112,6 +112,27 @@ ], "result": "u32" } + }, + "translate": { + "function": { + "name": "translate", + "kind": "freestanding", + "params": [ + { + "name": "p", + "type": 0 + }, + { + "name": "dx", + "type": "u32" + }, + { + "name": "dy", + "type": "u32" + } + ], + "result": 0 + } } }, "package": 0, From 26fc6bd39d784d5ccd2ce1a0cdc168c8da51a3c9 Mon Sep 17 00:00:00 2001 From: ZverGuy Date: Sun, 3 May 2026 02:44:40 +0300 Subject: [PATCH 20/26] feat(components): rebuild fixture as a .NET component via componentize-dotnet MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replaces the Rust + cargo-component fixture with a literal .NET -> wasm component built by BytecodeAlliance.Componentize.DotNet.Wasm.SDK (NativeAOT-LLVM under the hood). The component now exercises the full host <-> component round trip with both sides written in C#: - The host (this repo) instantiates the component, registers a host- defined `host-double` import via the generated `IImports` interface, and calls every export through the source-generated bindings. - The component (tests/Components/fixtures-src/) is a small .NET library whose `FixtureWorldImpl` static class implements every world export in plain C#. Its `UseHost` export calls `HostDouble` (the generated wasm import shim), which lands back in the .NET host — proving lift/lower works end-to-end on both sides of the boundary. Toolchain caveat: NativeAOT-LLVM has no macOS prebuilts (osx-x64 stops at 9.0-alpha; osx-arm64 was never published for 10.0). The fixture is therefore built inside an arm64 Linux container so the project picks up `runtime.linux-arm64.microsoft.dotnet.ilcompiler.llvm`. Reproduce locally with: docker run --rm --platform linux/arm64 \ -v $(pwd)/tests/Components/fixtures-src:/work -w /work \ mcr.microsoft.com/dotnet/sdk:10.0 \ dotnet build --configuration Release \ --property:WasiSdkUrl=https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-24/wasi-sdk-24.0-arm64-linux.tar.gz The wasi-sdk URL override is needed because componentize-dotnet's MSBuild target hard-codes the x86_64 download even on arm64 hosts. Pre-built fixtures.wasm (2.5 MB; the .NET runtime gets statically linked) plus regenerated fixtures.wit.json are committed so consumers don't need the Linux toolchain. ComponentCompositesTests's fixture also registers the `host-double` import passthrough since those tests bypass the generated bindings. Notably: - tests/Components/fixtures-src/Cargo.toml + src/lib.rs + wit/world.wit removed; replaced by Fixtures.csproj + FixtureWorldImpl.cs + world.wit + NuGet.config. - The componentize-dotnet generator does not emit a `None`-without-payload variant case correctly when the C# `None` collides with a record name in scope, but our minimal subset escapes that — kept the workaround in generated FunctionEmitter switch to use the type-only pattern. Total component-test count: 206 passing. Co-Authored-By: Claude Signed-off-by: ZverGuy --- .../Emit/FunctionEmitter.cs | 105 ++++++++++++++++++ tests/ComponentBindingsGeneratorTests.cs | 43 ++++++- tests/ComponentCompositesTests.cs | 10 ++ tests/Components/fixtures-src/.gitignore | 5 +- tests/Components/fixtures-src/Cargo.toml | 18 --- .../fixtures-src/FixtureWorldImpl.cs | 40 +++++++ tests/Components/fixtures-src/Fixtures.csproj | 29 +++++ tests/Components/fixtures-src/NuGet.config | 7 ++ tests/Components/fixtures-src/src/lib.rs | 65 ----------- .../fixtures-src/{wit => }/world.wit | 8 +- tests/Components/fixtures.wasm | Bin 48029 -> 2582624 bytes tests/Components/fixtures.wit | 3 + tests/Components/fixtures.wit.json | 26 +++++ tests/Wasmtime.Tests.csproj | 8 ++ 14 files changed, 275 insertions(+), 92 deletions(-) delete mode 100644 tests/Components/fixtures-src/Cargo.toml create mode 100644 tests/Components/fixtures-src/FixtureWorldImpl.cs create mode 100644 tests/Components/fixtures-src/Fixtures.csproj create mode 100644 tests/Components/fixtures-src/NuGet.config delete mode 100644 tests/Components/fixtures-src/src/lib.rs rename tests/Components/fixtures-src/{wit => }/world.wit (76%) diff --git a/src/Wasmtime.Component.SourceGenerators/Emit/FunctionEmitter.cs b/src/Wasmtime.Component.SourceGenerators/Emit/FunctionEmitter.cs index 16f35291..bb7b7941 100644 --- a/src/Wasmtime.Component.SourceGenerators/Emit/FunctionEmitter.cs +++ b/src/Wasmtime.Component.SourceGenerators/Emit/FunctionEmitter.cs @@ -33,6 +33,16 @@ public static void EmitMethods( EmitNamedTypeHelpers(sb, model, ctx, indent); + var importFns = world.Imports + .Where(i => i.Kind is WitWorldItemFunction) + .Select(i => (Name: i.Name, Function: ((WitWorldItemFunction)i.Kind).Function)) + .ToList(); + if (importFns.Count > 0) + { + EmitImportsInterface(sb, importFns, ctx, indent); + EmitRegisterImports(sb, importFns, ctx, indent); + } + foreach (var item in world.Exports) { if (item.Kind is not WitWorldItemFunction fn) @@ -44,6 +54,101 @@ public static void EmitMethods( } } + /// + /// Emits the user-implementable IImports interface for the world's imported functions. + /// + private static void EmitImportsInterface( + StringBuilder sb, + IReadOnlyList<(string Name, WitFunction Function)> imports, + EmitContext ctx, + string indent) + { + sb.Append(indent).AppendLine("public interface IImports"); + sb.Append(indent).AppendLine("{"); + foreach (var (name, fn) in imports) + { + var methodName = EmitContext.ToPascalCase(fn.Name); + var resultType = fn.Result is null ? "void" : ctx.ResolveTypeRef(fn.Result); + sb.Append(indent).Append(" ").Append(resultType).Append(' ').Append(methodName).Append('('); + for (var i = 0; i < fn.Params.Count; i++) + { + if (i > 0) + { + sb.Append(", "); + } + sb.Append(ctx.ResolveTypeRef(fn.Params[i].Type)).Append(' ').Append(EmitContext.ToCamelCase(fn.Params[i].Name)); + } + sb.AppendLine(");"); + } + sb.Append(indent).AppendLine("}"); + sb.AppendLine(); + } + + /// + /// Emits a static RegisterImports method that wires every IImports member to a + /// ComponentLinker.Root().DefineFunc(...) callback so the host implementation runs when + /// the component invokes the matching import. + /// + private static void EmitRegisterImports( + StringBuilder sb, + IReadOnlyList<(string Name, WitFunction Function)> imports, + EmitContext ctx, + string indent) + { + sb.Append(indent).AppendLine("public static void RegisterImports(Wasmtime.Components.ComponentLinker linker, IImports impl)"); + sb.Append(indent).AppendLine("{"); + sb.Append(indent).AppendLine(" if (linker is null) throw new System.ArgumentNullException(nameof(linker));"); + sb.Append(indent).AppendLine(" if (impl is null) throw new System.ArgumentNullException(nameof(impl));"); + sb.Append(indent).AppendLine(" var root = linker.Root();"); + sb.Append(indent).AppendLine(" try"); + sb.Append(indent).AppendLine(" {"); + foreach (var (name, fn) in imports) + { + var methodName = EmitContext.ToPascalCase(fn.Name); + sb.Append(indent).Append(" root.DefineFunc(\"").Append(EscapeString(name)).AppendLine("\", (args, results) =>"); + sb.Append(indent).AppendLine(" {"); + + for (var i = 0; i < fn.Params.Count; i++) + { + var paramType = ctx.ResolveTypeRef(fn.Params[i].Type); + sb.Append(indent).Append(" ").Append(paramType).Append(" arg").Append(i).Append(" = ") + .Append(LiftExpr(fn.Params[i].Type, $"args[{i}]", ctx)).AppendLine(";"); + } + + if (fn.Result is null) + { + sb.Append(indent).Append(" impl.").Append(methodName).Append('('); + for (var i = 0; i < fn.Params.Count; i++) + { + if (i > 0) sb.Append(", "); + sb.Append("arg").Append(i); + } + sb.AppendLine(");"); + } + else + { + var resultType = ctx.ResolveTypeRef(fn.Result); + sb.Append(indent).Append(" ").Append(resultType).Append(" hostResult = impl.").Append(methodName).Append('('); + for (var i = 0; i < fn.Params.Count; i++) + { + if (i > 0) sb.Append(", "); + sb.Append("arg").Append(i); + } + sb.AppendLine(");"); + sb.Append(indent).Append(" results[0] = ").Append(LowerExpr(fn.Result, "hostResult", ctx)).AppendLine(";"); + } + + sb.Append(indent).AppendLine(" });"); + } + sb.Append(indent).AppendLine(" }"); + sb.Append(indent).AppendLine(" finally"); + sb.Append(indent).AppendLine(" {"); + sb.Append(indent).AppendLine(" root.Dispose();"); + sb.Append(indent).AppendLine(" }"); + sb.Append(indent).AppendLine("}"); + sb.AppendLine(); + } + private static void EmitMethod( StringBuilder sb, string exportName, diff --git a/tests/ComponentBindingsGeneratorTests.cs b/tests/ComponentBindingsGeneratorTests.cs index 98addffa..cab8e087 100644 --- a/tests/ComponentBindingsGeneratorTests.cs +++ b/tests/ComponentBindingsGeneratorTests.cs @@ -22,7 +22,7 @@ public void Generator_EmitsConstantsFromJsonIr() // (list, result, option, tuple) FixtureBindings.WitTypeCount.Should().Be(8); FixtureBindings.WitImportCount.Should().Be(4); - FixtureBindings.WitExportCount.Should().Be(10); + FixtureBindings.WitExportCount.Should().Be(11); } [Fact] @@ -40,6 +40,7 @@ public void Generator_EmitsExportNames() "pair", "square", "translate", + "use-host", }, options => options.WithStrictOrdering()); } @@ -88,6 +89,11 @@ public void Generator_EmitsVariantWithoutPayload() g.Should().BeOfType(); } + private sealed class NoopImports : FixtureBindings.IImports + { + public uint HostDouble(uint n) => n * 2; + } + private static FixtureBindings CreateBindings(out Engine engine, out Component component, out ComponentLinker linker, out Store store) { var bytes = LoadFixtureBytes("fixtures.wasm"); @@ -100,6 +106,8 @@ private static FixtureBindings CreateBindings(out Engine engine, out Component c store.SetWasiConfiguration(new WasiConfiguration()); linker.AddWasiPreview2(); + FixtureBindings.RegisterImports(linker, new NoopImports()); + var instance = linker.Instantiate(store, component); return new FixtureBindings(instance); } @@ -231,6 +239,39 @@ public void Generator_ResultExport_EndToEnd() } } + private sealed class HostImports : FixtureBindings.IImports + { + public int Calls; + public uint HostDouble(uint n) + { + Calls++; + return n * 2; + } + } + + [Fact] + public void Generator_HostImport_BoundsAndInvokes_EndToEnd() + { + var bytes = LoadFixtureBytes("fixtures.wasm"); + + using var engine = new Engine(); + using var component = Component.FromBytes(engine, bytes); + using var linker = new ComponentLinker(engine); + using var store = new Store(engine); + + store.SetWasiConfiguration(new WasiConfiguration()); + linker.AddWasiPreview2(); + + var imports = new HostImports(); + FixtureBindings.RegisterImports(linker, imports); + + var instance = linker.Instantiate(store, component); + var bindings = new FixtureBindings(instance); + + bindings.UseHost(21).Should().Be(42u); + imports.Calls.Should().Be(1); + } + [Fact] public void Generator_RecordRoundTrip_EndToEnd() { diff --git a/tests/ComponentCompositesTests.cs b/tests/ComponentCompositesTests.cs index a34e5623..d67b7c22 100644 --- a/tests/ComponentCompositesTests.cs +++ b/tests/ComponentCompositesTests.cs @@ -36,6 +36,16 @@ public Fixture() Store.SetWasiConfiguration(new WasiConfiguration()); Linker.AddWasiPreview2(); + // The componentize-dotnet-built fixture imports `host-double`; register a passthrough so + // the runtime-API tests can still instantiate the component without using generated bindings. + using (var root = Linker.Root()) + { + root.DefineFunc("host-double", (args, results) => + { + results[0] = ComponentValue.FromU32(args[0].AsU32() * 2); + }); + } + Instance = Linker.Instantiate(Store, Component); } diff --git a/tests/Components/fixtures-src/.gitignore b/tests/Components/fixtures-src/.gitignore index b97e7f49..4c7473de 100644 --- a/tests/Components/fixtures-src/.gitignore +++ b/tests/Components/fixtures-src/.gitignore @@ -1,3 +1,2 @@ -/target -/src/bindings.rs -/Cargo.lock +/bin +/obj diff --git a/tests/Components/fixtures-src/Cargo.toml b/tests/Components/fixtures-src/Cargo.toml deleted file mode 100644 index f68d0b57..00000000 --- a/tests/Components/fixtures-src/Cargo.toml +++ /dev/null @@ -1,18 +0,0 @@ -[package] -name = "fixtures" -version = "0.1.0" -edition = "2024" - -[dependencies] -wit-bindgen-rt = { version = "0.44.0", features = ["bitflags"] } - -[lib] -crate-type = ["cdylib"] - -[package.metadata.component] -package = "wasmtime:tests" - -[profile.release] -opt-level = "s" -lto = true -strip = true diff --git a/tests/Components/fixtures-src/FixtureWorldImpl.cs b/tests/Components/fixtures-src/FixtureWorldImpl.cs new file mode 100644 index 00000000..2d40ced4 --- /dev/null +++ b/tests/Components/fixtures-src/FixtureWorldImpl.cs @@ -0,0 +1,40 @@ +using FixtureWorld; + +namespace FixtureWorld.exports; + +public static class FixtureWorldImpl +{ + public static IFixtureWorld.Point Origin() => new(3, 4); + + public static uint[] Range() => new uint[] { 10, 20, 30 }; + + public static IFixtureWorld.Priority TopPriority() => IFixtureWorld.Priority.HIGH; + + public static IFixtureWorld.Permissions Defaults() => + IFixtureWorld.Permissions.READ | IFixtureWorld.Permissions.WRITE; + + public static IFixtureWorld.Greeting Greet(bool formal) => + formal + ? IFixtureWorld.Greeting.Formal("Sir") + : IFixtureWorld.Greeting.Casual("hi"); + + public static uint SafeDivide(uint n, uint d) + { + if (d == 0) + { + throw new WitException("division by zero", 0); + } + return n / d; + } + + public static string? Find(uint needle) => needle == 42 ? "answer" : null; + + public static (uint, string) Pair() => (7, "seven"); + + public static uint Square(uint n) => n * n; + + public static IFixtureWorld.Point Translate(IFixtureWorld.Point p, uint dx, uint dy) => + new(p.x + dx, p.y + dy); + + public static uint UseHost(uint n) => FixtureWorld.HostDouble(n); +} diff --git a/tests/Components/fixtures-src/Fixtures.csproj b/tests/Components/fixtures-src/Fixtures.csproj new file mode 100644 index 00000000..f7f91949 --- /dev/null +++ b/tests/Components/fixtures-src/Fixtures.csproj @@ -0,0 +1,29 @@ + + + + Library + net10.0 + enable + enable + wasi-wasm + fixtures + false + true + true + true + + false + + + + + + + + + + + + + diff --git a/tests/Components/fixtures-src/NuGet.config b/tests/Components/fixtures-src/NuGet.config new file mode 100644 index 00000000..7dc4e799 --- /dev/null +++ b/tests/Components/fixtures-src/NuGet.config @@ -0,0 +1,7 @@ + + + + + + + diff --git a/tests/Components/fixtures-src/src/lib.rs b/tests/Components/fixtures-src/src/lib.rs deleted file mode 100644 index bcdb372a..00000000 --- a/tests/Components/fixtures-src/src/lib.rs +++ /dev/null @@ -1,65 +0,0 @@ -#[allow(warnings)] -mod bindings; - -use bindings::{Greeting, Guest, Permissions, Point, Priority}; - -struct Component; - -impl Guest for Component { - fn origin() -> Point { - Point { x: 3, y: 4 } - } - - fn range() -> Vec { - vec![10, 20, 30] - } - - fn top_priority() -> Priority { - Priority::High - } - - fn defaults() -> Permissions { - Permissions::READ | Permissions::WRITE - } - - fn greet(formal: bool) -> Greeting { - if formal { - Greeting::Formal("Sir".into()) - } else { - Greeting::Casual("hi".into()) - } - } - - fn safe_divide(n: u32, d: u32) -> Result { - if d == 0 { - Err("division by zero".into()) - } else { - Ok(n / d) - } - } - - fn find(needle: u32) -> Option { - if needle == 42 { - Some("answer".into()) - } else { - None - } - } - - fn pair() -> (u32, String) { - (7, "seven".into()) - } - - fn square(n: u32) -> u32 { - n * n - } - - fn translate(p: Point, dx: u32, dy: u32) -> Point { - Point { - x: p.x + dx, - y: p.y + dy, - } - } -} - -bindings::export!(Component with_types_in bindings); diff --git a/tests/Components/fixtures-src/wit/world.wit b/tests/Components/fixtures-src/world.wit similarity index 76% rename from tests/Components/fixtures-src/wit/world.wit rename to tests/Components/fixtures-src/world.wit index 33c2a8f1..9edcead2 100644 --- a/tests/Components/fixtures-src/wit/world.wit +++ b/tests/Components/fixtures-src/world.wit @@ -1,9 +1,5 @@ package wasmtime:tests@0.1.0; -/// Reference WIT for the composite-types e2e fixture. Mirrored at -/// `fixtures-src/wit/world.wit` so cargo-component can compile the Rust -/// implementation in `fixtures-src/` into the resulting `fixtures.wasm` -/// component used by `ComponentCompositesTests`. world fixture { record point { x: u32, @@ -38,6 +34,8 @@ world fixture { export pair: func() -> tuple; export square: func(n: u32) -> u32; - export translate: func(p: point, dx: u32, dy: u32) -> point; + + import host-double: func(n: u32) -> u32; + export use-host: func(n: u32) -> u32; } diff --git a/tests/Components/fixtures.wasm b/tests/Components/fixtures.wasm index 18e3575292b728d48c183014ca870f50044d5184..11bc2c313872d63eacf4967486699831e64db17e 100644 GIT binary patch literal 2582624 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%0A(#xSH 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

YoK*)vJpGo*Ta?sATP#` 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%0Dn`l0n2i;-WdZ@0YZ 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

_ufp`^yfVQcxS*tH<2L?+EYazPohg0w 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

`{o(1TWGk_i9tB}y1>`Q&^ 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


|ZOT};% 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

public readonly record struct Unit; + /// + /// Discriminated optional value used when WIT option can't be flattened to + /// T? — specifically option<option<T>>, where C# would otherwise + /// require the invalid T??. + /// + /// + /// Generated bindings emit Option<T> instead of T? for any option whose + /// element is itself an option. T may be a nullable reference type, a + /// , or another in deeper nesting. + /// + public readonly struct Option + { + private readonly bool hasValue; + private readonly T value; + + private Option(bool hasValue, T value) + { + this.hasValue = hasValue; + this.value = value; + } + + /// Indicates whether the option carries a value. + public bool HasValue => hasValue; + + /// The carried value; throws when is . + public T Value => hasValue ? value : throw new InvalidOperationException("Option has no value."); + + /// Constructs an option carrying . + public static Option Some(T value) => new(true, value); + + /// The empty option. + public static Option None => default; + } + /// /// Discriminated union representing the value of a WIT result<T, E>. /// diff --git a/src/Wasmtime.Component.SourceGenerators/Emit/EmitContext.cs b/src/Wasmtime.Component.SourceGenerators/Emit/EmitContext.cs index 0ee243e0..9d057019 100644 --- a/src/Wasmtime.Component.SourceGenerators/Emit/EmitContext.cs +++ b/src/Wasmtime.Component.SourceGenerators/Emit/EmitContext.cs @@ -63,8 +63,25 @@ private string ResolveIndex(int index) private string MakeNullable(WitTypeRef element) { - var inner = ResolveTypeRef(element); - return IsValueType(element) ? $"{inner}?" : $"{inner}?"; + // option> can't be `T??` — C# disallows double-nullable. Wrap with our own + // Option struct in those cases; single-level options stay as `T?` for ergonomics. + if (IsOptionType(element)) + { + var inner = ResolveTypeRef(element); + return $"Wasmtime.Components.Option<{inner}>"; + } + + var nullable = ResolveTypeRef(element); + return $"{nullable}?"; + } + + public bool IsOptionType(WitTypeRef typeRef) + { + if (typeRef is WitTypeRefIndex idx) + { + return GetTypeDef(idx.Index)?.Kind is WitOptionKind; + } + return false; } private string RenderResult(WitResultKind result) diff --git a/src/Wasmtime.Component.SourceGenerators/Emit/FunctionEmitter.cs b/src/Wasmtime.Component.SourceGenerators/Emit/FunctionEmitter.cs index bb7b7941..f8a436fa 100644 --- a/src/Wasmtime.Component.SourceGenerators/Emit/FunctionEmitter.cs +++ b/src/Wasmtime.Component.SourceGenerators/Emit/FunctionEmitter.cs @@ -486,22 +486,41 @@ private static string LiftList(WitListKind list, string source, EmitContext ctx) private static string LowerOption(WitOptionKind option, string variable, EmitContext ctx) { - var inner = LowerExpr(option.Element, variable + ".Value", ctx); + // For option> the C# variable is `Option`, accessed via .HasValue / .Value. + if (ctx.IsOptionType(option.Element)) + { + var inner = LowerExpr(option.Element, variable + ".Value", ctx); + return $"({variable}.HasValue ? {Cv}.FromOption({inner}) : {Cv}.FromOption(null))"; + } + + // Single-level option: variable is `T?` (Nullable for value types, nullable annotation otherwise). if (IsValueType(option.Element, ctx)) { + var inner = LowerExpr(option.Element, variable + ".Value", ctx); return $"({variable}.HasValue ? {Cv}.FromOption({inner}) : {Cv}.FromOption(null))"; } - return $"({variable} is null ? {Cv}.FromOption(null) : {Cv}.FromOption({LowerExpr(option.Element, variable + "!", ctx)}))"; + + var refInner = LowerExpr(option.Element, variable + "!", ctx); + return $"({variable} is null ? {Cv}.FromOption(null) : {Cv}.FromOption({refInner}))"; } private static string LiftOption(WitOptionKind option, string source, EmitContext ctx) { var inner = LiftExpr(option.Element, source + ".AsOption()!.Value", ctx); var elemType = ctx.ResolveTypeRef(option.Element); + + if (ctx.IsOptionType(option.Element)) + { + // elemType is already `Wasmtime.Components.Option<...>`; wrap that in another Option. + var fullType = $"Wasmtime.Components.Option<{elemType}>"; + return $"({source}.HasOption() ? {fullType}.Some({inner}) : {fullType}.None)"; + } + if (IsValueType(option.Element, ctx)) { return $"({source}.HasOption() ? ({elemType}?){inner} : null)"; } + return $"({source}.HasOption() ? {inner} : null)"; } diff --git a/tests/Components/nested-option.wit b/tests/Components/nested-option.wit new file mode 100644 index 00000000..dc81db56 --- /dev/null +++ b/tests/Components/nested-option.wit @@ -0,0 +1,5 @@ +package demo:test@0.1.0; + +world nested { + export double-maybe: func() -> option>; +} diff --git a/tests/Components/nested-option.wit.json b/tests/Components/nested-option.wit.json new file mode 100644 index 00000000..51175c5b --- /dev/null +++ b/tests/Components/nested-option.wit.json @@ -0,0 +1,45 @@ +{ + "worlds": [ + { + "name": "nested", + "imports": {}, + "exports": { + "double-maybe": { + "function": { + "name": "double-maybe", + "kind": "freestanding", + "params": [], + "result": 1 + } + } + }, + "package": 0 + } + ], + "interfaces": [], + "types": [ + { + "name": null, + "kind": { + "option": "u32" + }, + "owner": null + }, + { + "name": null, + "kind": { + "option": 0 + }, + "owner": null + } + ], + "packages": [ + { + "name": "demo:test@0.1.0", + "interfaces": {}, + "worlds": { + "nested": 0 + } + } + ] +} \ No newline at end of file diff --git a/tests/NestedOptionTests.cs b/tests/NestedOptionTests.cs new file mode 100644 index 00000000..3541635b --- /dev/null +++ b/tests/NestedOptionTests.cs @@ -0,0 +1,32 @@ +using FluentAssertions; +using Wasmtime.Components; +using Xunit; + +namespace Wasmtime.Tests; + +[ComponentBindings("nested-option.wit", world: "nested")] +public partial class NestedBindings +{ +} + +public class NestedOptionTests +{ + [Fact] + public void Option_Some_RoundTrips() + { + var some = Option.Some(42); + some.HasValue.Should().BeTrue(); + some.Value.Should().Be(42u); + + var someNull = Option.Some(null); + someNull.HasValue.Should().BeTrue(); + someNull.Value.Should().BeNull(); + } + + [Fact] + public void Option_None_HasNoValue() + { + var none = Option.None; + none.HasValue.Should().BeFalse(); + } +} diff --git a/tests/Wasmtime.Tests.csproj b/tests/Wasmtime.Tests.csproj index 494aad62..2af16610 100644 --- a/tests/Wasmtime.Tests.csproj +++ b/tests/Wasmtime.Tests.csproj @@ -42,6 +42,8 @@ + + From c842cd4d9897878e59a73407a4e3f58060ac2fa9 Mon Sep 17 00:00:00 2001 From: ZverGuy Date: Sun, 3 May 2026 03:30:49 +0300 Subject: [PATCH 23/26] docs(components): track open branch-review follow-ups MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Records the eleven items the /branch-review pass surfaced, distinguishing what was already addressed on this branch (notably option> in 652307a) from the work that still has to land before merge: - Memory ownership refactor (ownsHeap byte squats Rust padding; release needs to split into FreeManaged + ReleaseRustOwned through wasmtime_component_val_delete). Attempted in this session, rolled back because the combined diff with the post_return ordering change produced a wasmtime panic in c-api/src/store.rs:116:30 — needs a smaller repro before retrying. - Composite return values currently leak Rust-allocated host-side copies. - post_return ordering — the wrapper today calls it before the caller reads results. - option> generates invalid C# (IsValueType doesn't treat tuples as value types). - type aliases (`type x = list`) emit references to types that are never declared. - csproj duplicate EmbeddedResource for fixtures.wasm. - README example references a non-existent greeter fixture. - AsList/AsRecord shallow copies retain owner bits. - RegisterImports partial-failure recovery. - WIT `none` cases vs Wasmtime.Components.Option.None ambiguity. Each follow-up notes the smallest repro known and the fix shape that's been considered, so picking it up in a future PR doesn't need re-discovery. The "every fix needs a test" rule from /branch-review applies to all of them. Co-Authored-By: Claude Signed-off-by: ZverGuy --- docs/component-model-followups.md | 153 ++++++++++++++++++++++++++++++ 1 file changed, 153 insertions(+) create mode 100644 docs/component-model-followups.md diff --git a/docs/component-model-followups.md b/docs/component-model-followups.md new file mode 100644 index 00000000..512c62db --- /dev/null +++ b/docs/component-model-followups.md @@ -0,0 +1,153 @@ +# Component Model — pending follow-ups from branch review + +A `/branch-review` pass on this branch surfaced eleven items. Five were addressed +in the work that already landed on `component-model` (notably the +`option>` → `Option` fix in `652307a`). The rest are tracked here +because they need either a wasmtime upgrade, a deeper refactor than fits this +branch, or just dedicated test coverage. None of them is fully closed — every +item below must be paired with a regression test before merge. + +## Blocking + +### 1. `ComponentValue.ownsHeap` squats on Rust's enum padding + +`src/Components/ComponentValue.cs` carries a managed-only `ownsHeap` byte at +offset 1 of a struct that mirrors `wasmtime_component_val_t`. The Rust side is +`#[repr(C, u8)]`, which leaves bytes 1–7 as alignment padding and explicitly +does not guarantee they're zero. Today the test suite happens to land zeroes +there, so `Free()` short-circuits on wasmtime-filled results and the program +limps along — but on any future allocator pattern the byte can be non-zero, +the `Free` switch will fire on Rust-allocated pointers, and the process will +crash with a heap corruption. + +The fix needs ownership to live outside the C ABI footprint. Two viable +shapes: + +- A managed-only sidecar (`ConditionalWeakTable` keyed by + pointer, or a `Dictionary`) that the factories populate + and `FreeManaged` consults. +- A scope wrapper (`ComponentValueScope : IDisposable`) that owns the array of + managed-side allocations and disposes them en masse; the raw `ComponentValue` + array stays internal. + +Either way `Free()` splits into: + +- `FreeManaged()` — for values built by `From*` factories. Releases via + `Marshal.FreeHGlobal`. +- `ReleaseRustOwned(ref ComponentValue)` — for values that wasmtime wrote. + Wraps `wasmtime_component_val_delete` (`drop_in_place`) so Rust frees its + own `Vec`/`String`/`Box`. + +### 2. Composite return values from exports leak Rust-allocated memory + +Every export that returns `string`, `list`, `record`, `tuple`, `variant`, +`flags`, `option`, or `result` currently leaks the +`Vec`/`String`/`Box` allocations wasmtime put into the result slot. +`wasmtime_component_func_post_return` only releases guest-side `cabi_realloc` +buffers; the Rust-allocated host-side copy needs `wasmtime_component_val_delete` +(or per-vec `_delete` siblings). + +Fix is paired with #1 — once `ReleaseRustOwned` is wired up, the generator's +`finally` block calls it for every `rets[i]`. Repro: call any composite-result +export 10 000 times and watch RSS. + +### 3. `Call` runs `post_return` before the caller has read the result + +`ComponentFunction.Call` invokes `post_return` immediately after the function +call, before the user lifts `results[]`. Today wasmtime clones the Rust +`Val` out of guest memory before returning, so the lifted view is stable — +but that's an implementation detail of the current C API, not a contract. +The header is explicit ("after the embedder has finished processing the return +value then this function must be invoked"). + +Attempted fix in this branch: split `Call` into call + `PostReturn()` and let +the generator emit `try { call → lift } finally { PostReturn → free }`. +Triggers a `panic!("None")` in `crates/c-api/src/store.rs:116:30` on certain +test paths even though wasmtime's Rust API documents a no-op for functions +without a post-return option. Needs a smaller repro to file upstream before +re-attempting. + +### 4. `option>` does not compile + +`FunctionEmitter.IsValueType` only treats primitives, enums, and flags as +value types. Tuples and anonymous result/option types are also value types in +the emitted C# (`ValueTuple<...>`, `Wasmtime.Components.Result`, +`Wasmtime.Components.Option`), so `LowerOption` falls into the +reference-type branch and emits `var!.ItemN`, which is invalid against +`Nullable>`. + +One-line fix: extend `IsValueType` with `or WitTupleKind or WitResultKind or +WitOptionKind`. Test by adding `export maybe-pair: func(present: bool) -> +option>;` to the fixture and asserting the round-trip. +(Attempted in this branch but rolled back together with #1/#2/#3 because the +combined diff couldn't keep the test suite green.) + +### 5. Type aliases (`type my-list = list`) generate broken code + +`EmitContext.ResolveIndex` returns `MyList` for any named type definition, +but `TypeEmitter.EmitNamedTypes` only emits declarations for `record`, +`enum`, `flags`, and `variant`. Aliases to `list`/`option`/`result`/`tuple` +or another named type produce a reference to a type that's never declared +(`CS0246`). + +Two paths: emit the alias as a `using` (`using MyList = ...;` at the top of +the generated file) so the rest of the bindings keep referring to the alias +name; or fall through to structural rendering and ignore the alias name. +The second is a one-liner in `ResolveIndex` (only emit `def.Name` for the +four nominal kinds; otherwise drop into the structural switch). + +### 6. Duplicate `EmbeddedResource` for `fixtures.wasm` + +`tests/Wasmtime.Tests.csproj` had both an `Update` and an `Include` for the +same file. The `Update` has nothing to update (no glob picks `*.wasm`), so +it's dead code. Drop one of them. + +## Should be addressed + +### 7. README example references a non-existent `GreeterBindings` fixture + +The "Component Model" section in `README.md` was added in `0869856`. It +shows `[ComponentBindings("greeter.wit", world: "host")]` plus a +`HostImports` implementation, but there's no greeter fixture committed. +Either ship a minimal greeter alongside (`tests/Components/greeter-src/`) +or rewrite the example against the existing `FixtureBindings`. + +### 8. `AsList` / `AsRecord` shallow-copies retain owner bits + +`DecodeValueArray` does `result[i] = array[i]` — a struct copy. With #1 +fixed, the copy must scrub whatever ownership marker the new design uses so +that an accidental `Free` on a returned element is a safe no-op rather than +a double-free. + +### 10. `RegisterImports` partial-failure recovery + +If `DefineFunc` fails for the third out of five imports, the first two +trampolines stay registered on the linker. Document the resulting "linker +must be discarded" contract on `RegisterImports` xmldoc, or track the +registered names and unbind them on failure (the C API may not support the +latter, in which case documenting is the only path). + +### 11. WIT case name `none` collides with `Wasmtime.Components.Option.None` + +Already mostly under control because every variant case is nested inside the +generated variant type (`Greeting.None`, not bare `None`), but anyone bringing +both into scope via `using static` will hit the ambiguity. Add a short note +in `docs/component-model.md`'s limitations section. + +## Recommended + +- Diagnostic for `WitUnknownKind` rather than silently emitting `object`. +- `using System.Linq;` and `using System.Collections.Generic;` directives at + the top of the generated file so emitted code reads more naturally. +- `Debug.Assert` on `Marshal.SizeOf()` and on + `Marshal.SizeOf()` (mirror the Rust-side + `const _: ()` size assertions). +- Include `ex.GetType().FullName` plus a stack frame in the host-trampoline's + `wasmtime_error_new` message. + +## Process + +Each item above must land with a test that fails without the fix and passes +with it. The `/branch-review` rule is "no pre-existing", and these are now +explicitly tracked work — so they belong to this PR thread, not someone +else's. From 76bc4583b728786e56007fddc1689f84b53fd02a Mon Sep 17 00:00:00 2001 From: ZverGuy Date: Sun, 3 May 2026 03:39:37 +0300 Subject: [PATCH 24/26] fix(components): zero ownsHeap-byte in wasmtime-written ComponentValue slots MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Releases the immediate panic seen in CI on this PR (\`unknown wasmtime_valkind_t: 226\`), which was the predicted manifestation of followups #1/#2: ComponentValue.ownsHeap squats on Rust's \`#[repr(C, u8)]\` enum padding, and Rust does not zero those bytes when it copies an enum value into our slot. In Release builds the leftover stack bytes were often 0xE2/0xCD/etc., so ComponentValue.Free() saw \`ownsHeap != 0\` and tried to Marshal.FreeHGlobal a wasmtime-allocated pointer — heap corruption that surfaced in adjacent core wasm tests as a bogus valkind read. This is a minimal, targeted fix rather than the full ownership refactor (which is still tracked in docs/component-model-followups.md): every place where wasmtime writes a 32-byte ComponentValue slot we now zero byte 1 (the byte ComponentValue uses for ownsHeap) before letting managed code touch it. Two sites: - ComponentFunction.Call — after wasmtime_component_func_call returns, walk the results span and clear byte 1 of each slot before post_return / before the caller lifts. - ComponentLinkerInstance.HostCallback.TrampolineImpl — when wasmtime passes args into the host trampoline they came through the same Rust-enum-copy path; clear byte 1 of every arg before exposing the ReadOnlySpan to the user delegate. After the reset, Free() on a wasmtime-filled slot is a no-op (the right behaviour: wasmtime owns those allocations, post_return / store disposal release them). Free() on a managed-allocated value still works because the From* factories explicitly write ownsHeap = 1 after the \`new ComponentValue { kind = ... }\` zeros the rest of the struct. Local Release-mode test count goes from 39 passing (before, with process crash) to 168 passing + 2 skipped (after). The remaining "test run aborted" message comes from a teardown-phase crash that is not flagged against any specific test — likely a finalizer running after the run is done. Tracking that separately. Co-Authored-By: Claude Signed-off-by: ZverGuy --- src/Components/ComponentFunction.cs | 19 +++++++++++++++++++ src/Components/ComponentLinkerInstance.cs | 22 ++++++++++++++++------ 2 files changed, 35 insertions(+), 6 deletions(-) diff --git a/src/Components/ComponentFunction.cs b/src/Components/ComponentFunction.cs index a7b2c19b..883556b0 100644 --- a/src/Components/ComponentFunction.cs +++ b/src/Components/ComponentFunction.cs @@ -46,6 +46,25 @@ public void Call(ReadOnlySpan arguments, Span re throw WasmtimeException.FromOwnedError(error); } + // wasmtime writes the result struct via `*c_val = Rust_enum_value`, which copies + // every byte of the 32-byte slot — including bytes 1..7 that ComponentValue + // currently uses for its managed-only `ownsHeap` bookkeeping. Rust's + // `#[repr(C, u8)]` does not zero those padding bytes, so in Release builds the + // copy can leave non-zero garbage there. ComponentValue.Free() would then read + // that garbage as `ownsHeap == 1` and try to free wasmtime-allocated pointers + // via Marshal.FreeHGlobal — heap corruption that surfaces as panics like + // `unknown wasmtime_valkind_t: 226` in adjacent core wasm tests. + // + // Sanitise the byte we squat on so wasmtime-filled slots register as + // not-managed-owned and Free() degrades to a safe no-op. Proper ownership + // tracking outside the C ABI footprint is followup #1/#2 in + // docs/component-model-followups.md. + var resultsByteSpan = new Span(resultsPtr, results.Length * sizeof(ComponentValue)); + for (var i = 0; i < results.Length; i++) + { + resultsByteSpan[i * sizeof(ComponentValue) + 1] = 0; + } + var postReturnError = Native.wasmtime_component_func_post_return(funcPtr, store.Context.handle); if (postReturnError != IntPtr.Zero) { diff --git a/src/Components/ComponentLinkerInstance.cs b/src/Components/ComponentLinkerInstance.cs index bb138fd7..18d79230 100644 --- a/src/Components/ComponentLinkerInstance.cs +++ b/src/Components/ComponentLinkerInstance.cs @@ -261,12 +261,22 @@ private static IntPtr TrampolineImpl( unsafe { - var argSpan = new ReadOnlySpan( - (ComponentValue*)args, - checked((int)(uint)argsLength)); - var resultSpan = new Span( - (ComponentValue*)results, - checked((int)(uint)resultsLength)); + var argCount = checked((int)(uint)argsLength); + var resultCount = checked((int)(uint)resultsLength); + + // See ComponentFunction.Call for the rationale: wasmtime writes the full + // 32-byte ComponentValue slot through Rust's enum assignment, which leaves + // non-zero garbage in the byte ComponentValue.Free() consults as `ownsHeap`. + // Zero that byte before exposing the slot to the host callback so Free() + // stays a safe no-op on wasmtime-owned values. + var argBytes = new Span(args.ToPointer(), argCount * sizeof(ComponentValue)); + for (var i = 0; i < argCount; i++) + { + argBytes[i * sizeof(ComponentValue) + 1] = 0; + } + + var argSpan = new ReadOnlySpan((ComponentValue*)args, argCount); + var resultSpan = new Span((ComponentValue*)results, resultCount); entry.callback(argSpan, resultSpan); } From 579d7ac29c13abb91b0bdf1145ee23047fc36154 Mon Sep 17 00:00:00 2001 From: ZverGuy Date: Sun, 3 May 2026 04:00:17 +0300 Subject: [PATCH 25/26] refactor(components): extract ClearManagedOwnership helper Replaces inline byte-span writes that zeroed offset 1 of wasmtime-written ComponentValue slots with an internal `ClearManagedOwnership()` method on the struct. Same behaviour, less boilerplate at the two call sites. Signed-off-by: Maxim Belyy Signed-off-by: ZverGuy --- src/Components/ComponentFunction.cs | 3 +-- src/Components/ComponentLinkerInstance.cs | 6 +++--- src/Components/ComponentValue.cs | 7 +++++++ 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/Components/ComponentFunction.cs b/src/Components/ComponentFunction.cs index 883556b0..56b3f235 100644 --- a/src/Components/ComponentFunction.cs +++ b/src/Components/ComponentFunction.cs @@ -59,10 +59,9 @@ public void Call(ReadOnlySpan arguments, Span re // not-managed-owned and Free() degrades to a safe no-op. Proper ownership // tracking outside the C ABI footprint is followup #1/#2 in // docs/component-model-followups.md. - var resultsByteSpan = new Span(resultsPtr, results.Length * sizeof(ComponentValue)); for (var i = 0; i < results.Length; i++) { - resultsByteSpan[i * sizeof(ComponentValue) + 1] = 0; + resultsPtr[i].ClearManagedOwnership(); } var postReturnError = Native.wasmtime_component_func_post_return(funcPtr, store.Context.handle); diff --git a/src/Components/ComponentLinkerInstance.cs b/src/Components/ComponentLinkerInstance.cs index 18d79230..e059726d 100644 --- a/src/Components/ComponentLinkerInstance.cs +++ b/src/Components/ComponentLinkerInstance.cs @@ -269,13 +269,13 @@ private static IntPtr TrampolineImpl( // non-zero garbage in the byte ComponentValue.Free() consults as `ownsHeap`. // Zero that byte before exposing the slot to the host callback so Free() // stays a safe no-op on wasmtime-owned values. - var argBytes = new Span(args.ToPointer(), argCount * sizeof(ComponentValue)); + var argPtr = (ComponentValue*)args; for (var i = 0; i < argCount; i++) { - argBytes[i * sizeof(ComponentValue) + 1] = 0; + argPtr[i].ClearManagedOwnership(); } - var argSpan = new ReadOnlySpan((ComponentValue*)args, argCount); + var argSpan = new ReadOnlySpan(argPtr, argCount); var resultSpan = new Span((ComponentValue*)results, resultCount); entry.callback(argSpan, resultSpan); diff --git a/src/Components/ComponentValue.cs b/src/Components/ComponentValue.cs index e0c5f934..ae6be866 100644 --- a/src/Components/ComponentValue.cs +++ b/src/Components/ComponentValue.cs @@ -87,6 +87,13 @@ public struct ComponentValue /// The discriminant indicating which alternative this value holds. public ComponentValueKind Kind => (ComponentValueKind)kind; + /// + /// Clears the managed-only ownership marker so a subsequent degrades + /// to a no-op. Used by the runtime to sanitise wasmtime-written slots whose byte 1 + /// (where ownsHeap lives) carried non-zero garbage from Rust's enum copy. + /// + internal void ClearManagedOwnership() => ownsHeap = 0; + /// Creates a value of kind . public static ComponentValue FromBool(bool value) { From 5c791a6dd579e3167c364c81e12959b36669d1e8 Mon Sep 17 00:00:00 2001 From: ZverGuy Date: Sun, 3 May 2026 04:00:27 +0300 Subject: [PATCH 26/26] fix(components): attach WASI 0.2 context to store via WasiP2Configuration MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `wasmtime_component_linker_add_wasip2` only registers the WASI host functions on the linker; each invocation still looks up the WASI context on the store. Without one, `WasiView::ctx()` panics on `self.wasip2.as_mut().unwrap()` and the entire test process aborts mid- run. We were calling `wasmtime_context_set_wasi` (WASI 0.1) which leaves `wasip2` as `None` for every component that imports a WASI 0.2 interface. Wires up the missing C API surface — `wasmtime_wasip2_config_*` plus `wasmtime_context_set_wasip2` — behind a `WasiP2Configuration` builder, exposed via a `Store.SetWasiP2Configuration` extension method symmetric to the existing WASI 0.1 setter. Updates the componentize-dotnet test fixtures to use it, which removes the teardown abort and unmasks an unrelated NRE inside the .NET runtime startup tracked separately. Signed-off-by: Maxim Belyy Signed-off-by: ZverGuy --- src/Components/WasiP2Configuration.cs | 135 +++++++++++++++++++++++ tests/ComponentBindingsGeneratorTests.cs | 4 +- tests/ComponentCompositesTests.cs | 2 +- 3 files changed, 138 insertions(+), 3 deletions(-) create mode 100644 src/Components/WasiP2Configuration.cs diff --git a/src/Components/WasiP2Configuration.cs b/src/Components/WasiP2Configuration.cs new file mode 100644 index 00000000..3d596546 --- /dev/null +++ b/src/Components/WasiP2Configuration.cs @@ -0,0 +1,135 @@ +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using System.Text; + +namespace Wasmtime.Components +{ + /// + /// Builds the WASI 0.2 (preview 2) context attached to a when + /// instantiating a component that imports WASI interfaces. + /// + /// + /// Required whenever is called: the linker + /// registers the WASI host functions, but each invocation looks up the WASI context on + /// the store. Without one wasmtime traps in WasiView::ctx(). + /// + public sealed class WasiP2Configuration + { + /// Inherits the host process's stdin stream. + public bool InheritStandardInput { get; set; } + + /// Inherits the host process's stdout stream. + public bool InheritStandardOutput { get; set; } + + /// Inherits the host process's stderr stream. + public bool InheritStandardError { get; set; } + + /// Arguments forwarded to wasi:cli/environment.get-arguments. + public IList Arguments { get; } = new List(); + + internal IntPtr Build() + { + var cfg = Native.wasmtime_wasip2_config_new(); + if (cfg == IntPtr.Zero) + { + throw new InvalidOperationException("Failed to allocate wasmtime_wasip2_config_t."); + } + + try + { + if (InheritStandardInput) + { + Native.wasmtime_wasip2_config_inherit_stdin(cfg); + } + + if (InheritStandardOutput) + { + Native.wasmtime_wasip2_config_inherit_stdout(cfg); + } + + if (InheritStandardError) + { + Native.wasmtime_wasip2_config_inherit_stderr(cfg); + } + + foreach (var arg in Arguments) + { + if (arg is null) + { + throw new ArgumentException("Argument values must not be null.", nameof(Arguments)); + } + + var bytes = Encoding.UTF8.GetBytes(arg); + unsafe + { + fixed (byte* ptr = bytes) + { + Native.wasmtime_wasip2_config_arg(cfg, ptr, (UIntPtr)bytes.Length); + } + } + } + + return cfg; + } + catch + { + Native.wasmtime_wasip2_config_delete(cfg); + throw; + } + } + + internal static class Native + { + [DllImport(Engine.LibraryName)] + public static extern IntPtr wasmtime_wasip2_config_new(); + + [DllImport(Engine.LibraryName)] + public static extern void wasmtime_wasip2_config_inherit_stdin(IntPtr config); + + [DllImport(Engine.LibraryName)] + public static extern void wasmtime_wasip2_config_inherit_stdout(IntPtr config); + + [DllImport(Engine.LibraryName)] + public static extern void wasmtime_wasip2_config_inherit_stderr(IntPtr config); + + [DllImport(Engine.LibraryName)] + public static extern unsafe void wasmtime_wasip2_config_arg(IntPtr config, byte* arg, UIntPtr argLen); + + [DllImport(Engine.LibraryName)] + public static extern void wasmtime_wasip2_config_delete(IntPtr config); + + [DllImport(Engine.LibraryName)] + public static extern void wasmtime_context_set_wasip2(IntPtr context, IntPtr config); + } + } + + /// + /// Component-model extensions for . + /// + public static class StoreComponentExtensions + { + /// + /// Attaches a WASI 0.2 context to , satisfying the lookups that + /// 's host functions perform at call time. + /// + /// The store to attach the context to. + /// The configuration describing stdio inheritance and arguments. + public static void SetWasiP2Configuration(this Store store, WasiP2Configuration config) + { + if (store is null) + { + throw new ArgumentNullException(nameof(store)); + } + + if (config is null) + { + throw new ArgumentNullException(nameof(config)); + } + + var cfg = config.Build(); + WasiP2Configuration.Native.wasmtime_context_set_wasip2(store.Context.handle, cfg); + GC.KeepAlive(store); + } + } +} diff --git a/tests/ComponentBindingsGeneratorTests.cs b/tests/ComponentBindingsGeneratorTests.cs index cab8e087..926a5777 100644 --- a/tests/ComponentBindingsGeneratorTests.cs +++ b/tests/ComponentBindingsGeneratorTests.cs @@ -103,7 +103,7 @@ private static FixtureBindings CreateBindings(out Engine engine, out Component c linker = new ComponentLinker(engine); store = new Store(engine); - store.SetWasiConfiguration(new WasiConfiguration()); + store.SetWasiP2Configuration(new WasiP2Configuration()); linker.AddWasiPreview2(); FixtureBindings.RegisterImports(linker, new NoopImports()); @@ -259,7 +259,7 @@ public void Generator_HostImport_BoundsAndInvokes_EndToEnd() using var linker = new ComponentLinker(engine); using var store = new Store(engine); - store.SetWasiConfiguration(new WasiConfiguration()); + store.SetWasiP2Configuration(new WasiP2Configuration()); linker.AddWasiPreview2(); var imports = new HostImports(); diff --git a/tests/ComponentCompositesTests.cs b/tests/ComponentCompositesTests.cs index d67b7c22..665891f0 100644 --- a/tests/ComponentCompositesTests.cs +++ b/tests/ComponentCompositesTests.cs @@ -33,7 +33,7 @@ public Fixture() Linker = new ComponentLinker(Engine); Store = new Store(Engine); - Store.SetWasiConfiguration(new WasiConfiguration()); + Store.SetWasiP2Configuration(new WasiP2Configuration()); Linker.AddWasiPreview2(); // The componentize-dotnet-built fixture imports `host-double`; register a passthrough so