@@ -8,23 +8,23 @@ use tvm_common::{
8
8
} ;
9
9
10
10
pub trait Module {
11
- fn get_function < S : AsRef < str > > ( & self , name : S ) -> Option < PackedFunc > ;
11
+ fn get_function < S : AsRef < str > > ( & self , name : S ) -> Option < & ( dyn PackedFunc ) > ;
12
12
}
13
13
14
14
pub struct SystemLibModule ;
15
15
16
16
lazy_static ! {
17
- static ref SYSTEM_LIB_FUNCTIONS : Mutex <HashMap <String , BackendPackedCFunc >> =
17
+ static ref SYSTEM_LIB_FUNCTIONS : Mutex <HashMap <String , & ' static ( dyn PackedFunc ) >> =
18
18
Mutex :: new( HashMap :: new( ) ) ;
19
19
}
20
20
21
21
impl Module for SystemLibModule {
22
- fn get_function < S : AsRef < str > > ( & self , name : S ) -> Option < PackedFunc > {
22
+ fn get_function < S : AsRef < str > > ( & self , name : S ) -> Option < & ( dyn PackedFunc ) > {
23
23
SYSTEM_LIB_FUNCTIONS
24
24
. lock ( )
25
25
. unwrap ( )
26
26
. get ( name. as_ref ( ) )
27
- . map ( |func| wrap_backend_packed_func ( name . as_ref ( ) . to_owned ( ) , func . to_owned ( ) ) )
27
+ . map ( |f| * f )
28
28
}
29
29
}
30
30
@@ -35,8 +35,11 @@ impl Default for SystemLibModule {
35
35
}
36
36
37
37
// @see `WrapPackedFunc` in `llvm_module.cc`.
38
- pub ( super ) fn wrap_backend_packed_func ( func_name : String , func : BackendPackedCFunc ) -> PackedFunc {
39
- box move |args : & [ TVMArgValue ] | {
38
+ pub ( super ) fn wrap_backend_packed_func (
39
+ func_name : String ,
40
+ func : BackendPackedCFunc ,
41
+ ) -> Box < dyn PackedFunc > {
42
+ Box :: new ( move |args : & [ TVMArgValue ] | {
40
43
let exit_code = func (
41
44
args. iter ( )
42
45
. map ( |ref arg| arg. value )
@@ -55,7 +58,7 @@ pub(super) fn wrap_backend_packed_func(func_name: String, func: BackendPackedCFu
55
58
func_name. clone ( ) ,
56
59
) )
57
60
}
58
- }
61
+ } )
59
62
}
60
63
61
64
#[ no_mangle]
@@ -64,9 +67,9 @@ pub extern "C" fn TVMBackendRegisterSystemLibSymbol(
64
67
func : BackendPackedCFunc ,
65
68
) -> i32 {
66
69
let name = unsafe { CStr :: from_ptr ( cname) . to_str ( ) . unwrap ( ) } ;
67
- SYSTEM_LIB_FUNCTIONS
68
- . lock ( )
69
- . unwrap ( )
70
- . insert ( name . to_string ( ) , func ) ;
70
+ SYSTEM_LIB_FUNCTIONS . lock ( ) . unwrap ( ) . insert (
71
+ name . to_string ( ) ,
72
+ & * Box :: leak ( wrap_backend_packed_func ( name . to_string ( ) , func ) ) ,
73
+ ) ;
71
74
return 0 ;
72
75
}
0 commit comments