Infer host function Wasm types from type annotations if given. When inferred, parameters and return values are automatically marshaled and unmarshaled and "current plugin" access is hidden. Whenever a host function is declared, add it to a thread-local registry of host functions. Default Plugin creation will use the global list of plugins.
In the weeds note: because this means we have to hang on to functions at specific addresses, we always end up using user_data now: in particular we store the offset of the target host function in the user_data to determine which implementation to call. I added this because the FFI call would fail if the target python host function wasn't available at module-level; this would turn into a stack overflow (it appeared that the runtime tried to re-invoke a host function infinitely if it couldn't find it.)
Example of inferred decorator + global host func registry:
Infer host function Wasm types from type annotations if given. When inferred, parameters and return values are automatically marshaled and unmarshaled and "current plugin" access is hidden. Whenever a host function is declared, add it to a thread-local registry of host functions. Default
Plugin
creation will use the global list of plugins.In the weeds note: because this means we have to hang on to functions at specific addresses, we always end up using user_data now: in particular we store the offset of the target host function in the user_data to determine which implementation to call. I added this because the FFI call would fail if the target python host function wasn't available at module-level; this would turn into a stack overflow (it appeared that the runtime tried to re-invoke a host function infinitely if it couldn't find it.)
Example of inferred decorator + global host func registry: