@@ -55,47 +55,48 @@ pub fn transcoder_decorator(nif_attributes: NifAttributes, fun: syn::ItemFn) ->
5555 }
5656
5757 quote ! {
58- rustler :: codegen_runtime :: inventory :: submit! (
59- rustler:: Nif {
60- name : concat! ( #erl_func_name , " \0 " ) . as_ptr ( )
61- as * const rustler:: codegen_runtime :: c_char ,
62- arity : #arity ,
63- flags : #flags as rustler:: codegen_runtime:: c_uint ,
64- raw_func : {
65- unsafe extern "C" fn nif_func (
66- nif_env : rustler :: codegen_runtime :: NIF_ENV ,
67- argc : rustler :: codegen_runtime :: c_int ,
68- argv : * const rustler:: codegen_runtime:: NIF_TERM
69- ) -> rustler:: codegen_runtime:: NIF_TERM {
70- let lifetime = ( ) ;
71- let env = rustler:: Env :: new ( & lifetime , nif_env ) ;
72-
73- let terms = std :: slice :: from_raw_parts ( argv , argc as usize )
74- . iter ( )
75- . map ( |term| rustler :: Term :: new ( env , * term ) )
76- . collect :: < Vec <rustler :: Term >> ( ) ;
77-
78- fn wrapper< ' a> (
79- env : rustler :: Env < ' a> ,
80- args : & [ rustler :: Term <' a>]
81- ) -> rustler:: codegen_runtime :: NifReturned {
82- let result : std :: thread :: Result <_> =
83- std :: panic :: catch_unwind ( move || {
84- #decoded_terms
85- #function
86- Ok ( #name ( #argument_names ) )
87- } ) ;
88-
89- rustler :: codegen_runtime :: handle_nif_result (
90- result , env
91- )
92- }
93- wrapper ( env , & terms ) . apply ( env )
58+ # [ allow ( non_upper_case_globals ) ]
59+ # [ rustler:: codegen_runtime :: linkme :: distributed_slice ( rustler :: codegen_runtime :: NIFS ) ]
60+ # [ linkme ( crate = rustler :: codegen_runtime :: linkme ) ]
61+ static #name : rustler :: Nif = rustler:: Nif {
62+ name : concat! ( #erl_func_name , " \0 " ) . as_ptr ( )
63+ as * const rustler:: codegen_runtime:: c_char ,
64+ arity : #arity ,
65+ flags : #flags as rustler :: codegen_runtime :: c_uint ,
66+ raw_func : {
67+ unsafe extern "C" fn nif_func (
68+ nif_env : rustler:: codegen_runtime:: NIF_ENV ,
69+ argc : rustler:: codegen_runtime:: c_int ,
70+ argv : * const rustler :: codegen_runtime :: NIF_TERM
71+ ) -> rustler:: codegen_runtime :: NIF_TERM {
72+ let lifetime = ( ) ;
73+ let env = rustler :: Env :: new ( & lifetime , nif_env ) ;
74+
75+ let terms = std :: slice :: from_raw_parts ( argv , argc as usize )
76+ . iter ( )
77+ . map ( |term| rustler :: Term :: new ( env , * term ) )
78+ . collect :: < Vec <rustler :: Term >> ( ) ;
79+
80+ fn wrapper <' a>(
81+ env : rustler:: Env < ' a> ,
82+ args : & [ rustler :: Term < ' a> ]
83+ ) -> rustler :: codegen_runtime :: NifReturned {
84+ let result : std :: thread :: Result <_> =
85+ std :: panic :: catch_unwind ( move || {
86+ #decoded_terms
87+ #function
88+ Ok ( #name ( #argument_names ) )
89+ } ) ;
90+
91+ rustler :: codegen_runtime :: handle_nif_result (
92+ result , env
93+ )
9494 }
95- nif_func
95+ wrapper ( env , & terms ) . apply ( env )
9696 }
97+ nif_func
9798 }
98- ) ;
99+ } ;
99100 }
100101}
101102
0 commit comments