-
Notifications
You must be signed in to change notification settings - Fork 102
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat: Add C API for host functions + support for C++, Python, Go, Node, OCaml #195
Conversation
89f95fe
to
d6672f3
Compare
Just pushed the change to get rid of |
This is awesome, @zshipko! Will be testing these out over the course of the week. For those following along, this is definitely a candidate for an upcoming cc/ other SDK contributors for awareness: |
b72bf8d
to
16eafa3
Compare
@nilslice I will try to add bindings to the .NET sdk after the PR is merged and the new binaries are released |
@mhmd-azeez that would be awesome. thanks! |
…ated user_data arguments
…ove_extism_plugin_{new,update}_with_functions
8b1f1f8
to
44c93c9
Compare
…e, OCaml (extism#195) - New types: - `ExtismValType` - Enum of WebAssembly types - `ExtismValUnion` - A union of the possible WebAssembly types - `ExtismVal` - A struct with `ExtismValType` and `ExtismValUnion` - `ExtismFunction` - The host function wrapper type - `ExtismFunctionType` - The type of the host function callback - `ExtismCurrentPlugin` - Provides access to the currently running plugin from inside a host function - New functions: - `extism_function_new` - Create a new `ExtismFunction` - `extism_function_free` - Free an `ExtismFunction` - `extism_current_plugin_memory`, `extism_current_plugin_memory_alloc`, `extism_current_plugin_memory_free`, `extism_current_plugin_memory_length` - Manage plugin memory from inside a host functions - Updated functions - `extism_plugin_new` and `extsim_plugin_update` - now accept two extra parameters for `ExtismFunction*` array and length of that array ## Notes - Host functions take a user-data argument, which is owned by the resulting `ExtismFunction` and will be cleaned up when `extism_function_free` is called (if a cleanup function was passed in with the user data) - Host functions in every SDK require working with `ExtismVal` arguments directly, this is pretty low-level for what is kind of a high-level feature. We could work on adding some types to the SDKs that make working with pointers to plugin data more accessible, maybe something similar to how the Rust PDK handes input/output data. - In each language the host functions more-or-less share a signature: `(CurrentPlugin plugin, Val inputs[], Val outputs[], userData)` - C, C++, OCaml and Go take a single userData argument but Python and Node take a "rest" argument which allows passing any number of user-data values - Go requires the host function to be exported: https://github.com/extism/extism/blob/f9eb5ed8395218f08627622517e801491efb2a53/go/main.go#L13-L26 - Zig and Ruby should be relatively simple to add host functions to next but I haven't really looked into Elixir, .NET or Java yet. - Also closes extism#20
New types:
ExtismValType
- Enum of WebAssembly typesExtismValUnion
- A union of the possible WebAssembly typesExtismVal
- A struct withExtismValType
andExtismValUnion
ExtismFunction
- The host function wrapper typeExtismFunctionType
- The type of the host function callbackExtismCurrentPlugin
- Provides access to the currently running plugin from inside a host functionNew functions:
extism_function_new
- Create a newExtismFunction
extism_function_free
- Free anExtismFunction
extism_current_plugin_memory
,extism_current_plugin_memory_alloc
,extism_current_plugin_memory_free
,extism_current_plugin_memory_length
- Manage plugin memory from inside a host functionsUpdated functions
extism_plugin_new
andextsim_plugin_update
- now accept two extra parameters forExtismFunction*
array and length of that arrayNotes
ExtismFunction
and will be cleaned up whenextism_function_free
is called (if a cleanup function was passed in with the user data)ExtismVal
arguments directly, this is pretty low-level for what is kind of a high-level feature. We could work on adding some types to the SDKs that make working with pointers to plugin data more accessible, maybe something similar to how the Rust PDK handes input/output data.(CurrentPlugin plugin, Val inputs[], Val outputs[], userData)
extism/go/main.go
Lines 13 to 26 in f9eb5ed