@@ -105,6 +105,7 @@ enum RegistryEntryKind {
105105 StackStatic ( StaticHostStackFunction ) ,
106106 ArgsFactory ( Arc < HostArgsFactory > ) ,
107107 ArgsStatic ( StaticHostArgsFunction ) ,
108+ ArgsStaticNonYielding ( StaticHostArgsFunction ) ,
108109}
109110
110111#[ derive( Clone ) ]
@@ -308,6 +309,32 @@ impl HostFunctionRegistry {
308309 self . invalidate_plan_cache ( ) ;
309310 }
310311
312+ pub fn register_static_non_yielding_args (
313+ & mut self ,
314+ name : impl Into < String > ,
315+ arity : u8 ,
316+ function : StaticHostArgsFunction ,
317+ ) {
318+ let name = name. into ( ) ;
319+ if let Some ( & slot) = self . by_name . get ( & name)
320+ && let Some ( entry) = Arc :: make_mut ( & mut self . entries ) . get_mut ( slot as usize )
321+ {
322+ entry. arity = arity;
323+ entry. kind = RegistryEntryKind :: ArgsStaticNonYielding ( function) ;
324+ self . invalidate_plan_cache ( ) ;
325+ return ;
326+ }
327+
328+ let entries = Arc :: make_mut ( & mut self . entries ) ;
329+ let slot = entries. len ( ) as u16 ;
330+ entries. push ( RegistryEntry {
331+ arity,
332+ kind : RegistryEntryKind :: ArgsStaticNonYielding ( function) ,
333+ } ) ;
334+ Arc :: make_mut ( & mut self . by_name ) . insert ( name, slot) ;
335+ self . invalidate_plan_cache ( ) ;
336+ }
337+
311338 pub fn bind_vm_cached ( & self , vm : & mut Vm ) -> VmResult < ( ) > {
312339 let plan = self . prepare_shared_plan ( & vm. program . imports ) ?;
313340 self . bind_vm_with_plan ( vm, & plan)
@@ -415,6 +442,9 @@ impl HostFunctionRegistry {
415442 RegistryEntryKind :: ArgsStatic ( function) => {
416443 vm. register_static_args_function ( * function) ;
417444 }
445+ RegistryEntryKind :: ArgsStaticNonYielding ( function) => {
446+ vm. register_static_non_yielding_args_function ( * function) ;
447+ }
418448 }
419449 }
420450 vm. install_resolved_calls ( plan. resolved_calls . clone ( ) ) ?;
0 commit comments