@@ -319,6 +319,92 @@ pub fn return_call_internal(
319319 dispatch ! ( state, callee_ip, callee_sp, mem0, mem0_len, instance)
320320}
321321
322+ pub fn return_call_imported (
323+ state : & mut VmState ,
324+ ip : Ip ,
325+ _sp : Sp ,
326+ mem0 : Mem0Ptr ,
327+ mem0_len : Mem0Len ,
328+ instance : NonNull < InstanceEntity > ,
329+ ) -> Done {
330+ let ( _, crate :: ir:: decode:: ReturnCallImported { params, func } ) = unsafe { decode_op ( ip) } ;
331+ let func = fetch_func ( instance, func) ;
332+ let func = resolve_func ( state. store , & func) ;
333+ let ( callee_ip, sp, mem0, mem0_len, instance) = match func {
334+ FuncEntity :: Wasm ( func) => {
335+ let engine_func = func. func_body ( ) ;
336+ let callee_instance = * func. instance ( ) ;
337+ let ( callee_ip, size) = compile_or_get_func ! ( state, engine_func) ;
338+ let callee_instance = resolve_instance ( state. store , & callee_instance) . into ( ) ;
339+ let callee_sp = match state. stack . replace_frame (
340+ callee_ip,
341+ params,
342+ size,
343+ ( instance != callee_instance) . then_some ( callee_instance) ,
344+ ) {
345+ Ok ( sp) => sp,
346+ Err ( trap) => done ! ( state, trap) ,
347+ } ;
348+ let ( instance, mem0, mem0_len) =
349+ update_instance ( state. store , instance, callee_instance, mem0, mem0_len) ;
350+ ( callee_ip, callee_sp, mem0, mem0_len, instance)
351+ }
352+ FuncEntity :: Host ( _func) => {
353+ todo ! ( )
354+ }
355+ } ;
356+ dispatch ! ( state, callee_ip, sp, mem0, mem0_len, instance)
357+ }
358+
359+ pub fn return_call_indirect (
360+ state : & mut VmState ,
361+ ip : Ip ,
362+ sp : Sp ,
363+ mem0 : Mem0Ptr ,
364+ mem0_len : Mem0Len ,
365+ instance : NonNull < InstanceEntity > ,
366+ ) -> Done {
367+ let (
368+ _,
369+ crate :: ir:: decode:: ReturnCallIndirect {
370+ params,
371+ index,
372+ func_type,
373+ table,
374+ } ,
375+ ) = unsafe { decode_op ( ip) } ;
376+ let func = match resolve_indirect_func ( index, table, func_type, state, sp, instance) {
377+ Ok ( func) => func,
378+ Err ( trap) => done ! ( state, trap) ,
379+ } ;
380+ let func = resolve_func ( state. store , & func) ;
381+ let ( callee_ip, sp, mem0, mem0_len, instance) = match func {
382+ FuncEntity :: Wasm ( func) => {
383+ let engine_func = func. func_body ( ) ;
384+ let callee_instance = * func. instance ( ) ;
385+ let ( callee_ip, size) = compile_or_get_func ! ( state, engine_func) ;
386+ let callee_instance: NonNull < InstanceEntity > =
387+ resolve_instance ( state. store , & callee_instance) . into ( ) ;
388+ let callee_sp = match state. stack . replace_frame (
389+ callee_ip,
390+ params,
391+ size,
392+ ( instance != callee_instance) . then_some ( callee_instance) ,
393+ ) {
394+ Ok ( sp) => sp,
395+ Err ( trap) => done ! ( state, trap) ,
396+ } ;
397+ let ( instance, mem0, mem0_len) =
398+ update_instance ( state. store , instance, callee_instance, mem0, mem0_len) ;
399+ ( callee_ip, callee_sp, mem0, mem0_len, instance)
400+ }
401+ FuncEntity :: Host ( _func) => {
402+ todo ! ( )
403+ }
404+ } ;
405+ dispatch ! ( state, callee_ip, sp, mem0, mem0_len, instance)
406+ }
407+
322408pub fn r#return (
323409 state : & mut VmState ,
324410 _ip : Ip ,
0 commit comments