1- use crate :: {
2- sys:: { enif_get_tuple, ERL_NIF_TERM } ,
3- Decoder , Encoder , Env , Error , NifResult , Term , TermType ,
4- } ;
1+ use crate :: { Decoder , Encoder , Env , Error , NifResult , Term , TermType } ;
2+ use crate :: sys:: { enif_get_tuple, enif_make_tuple_from_array, ERL_NIF_TERM } ;
53
6- use std:: { ffi:: c_int, mem:: MaybeUninit , ops:: Index } ;
4+ use std:: ffi:: c_int;
5+ use std:: mem:: MaybeUninit ;
6+
7+ use super :: wrapper;
78wrapper ! (
89 struct Tuple ( TermType :: Tuple )
910) ;
@@ -33,7 +34,7 @@ impl<'a> Tuple<'a> {
3334 pub fn get ( & self , index : usize ) -> Option < Term < ' a > > {
3435 self . get_elements ( )
3536 . get ( index)
36- . map ( |ptr| unsafe { Term :: new ( self . get_env ( ) , ptr) } )
37+ . map ( |ptr| unsafe { Term :: new ( self . get_env ( ) , * ptr) } )
3738 }
3839
3940 /// Convert an Erlang tuple to a Rust vector. (To convert to a Rust tuple, use `term.decode()`
@@ -56,8 +57,13 @@ impl<'a> Tuple<'a> {
5657/// Convert a vector of terms to an Erlang tuple. (To convert from a Rust tuple to an Erlang tuple,
5758/// use `Encoder` instead.)
5859pub fn make_tuple < ' a > ( env : Env < ' a > , terms : & [ Term ] ) -> Term < ' a > {
59- let c_terms: Vec < NIF_TERM > = terms. iter ( ) . map ( |term| term. as_c_arg ( ) ) . collect ( ) ;
60- unsafe { Term :: new ( env, tuple:: make_tuple ( env. as_c_arg ( ) , & c_terms) ) }
60+ let c_terms: Vec < ERL_NIF_TERM > = terms. iter ( ) . map ( |term| term. as_c_arg ( ) ) . collect ( ) ;
61+ unsafe {
62+ let term =
63+ enif_make_tuple_from_array ( env. as_c_arg ( ) , c_terms. as_ptr ( ) , c_terms. len ( ) as u32 ) ;
64+ Term :: new ( env, term)
65+ }
66+ // unsafe { Term::new(env, tuple::make_tuple(env.as_c_arg(), &c_terms)) }
6167}
6268
6369/// Helper macro to emit tuple-like syntax. Wraps its arguments in parentheses, and adds a comma if
@@ -83,10 +89,8 @@ macro_rules! impl_nifencoder_nifdecoder_for_tuple {
8389 Encoder for tuple!( $( $tyvar ) ,* )
8490 {
8591 fn encode<' a>( & self , env: Env <' a>) -> Term <' a> {
86- let arr = [ $( Encoder :: encode( & self . $index, env) . as_c_arg( ) ) ,* ] ;
87- unsafe {
88- Term :: new( env, tuple:: make_tuple( env. as_c_arg( ) , & arr) )
89- }
92+ let arr = [ $( Encoder :: encode( & self . $index, env) ) ,* ] ;
93+ make_tuple( env, & arr)
9094 }
9195 }
9296
@@ -95,7 +99,7 @@ macro_rules! impl_nifencoder_nifdecoder_for_tuple {
9599 {
96100 fn decode( term: Term <' a>) -> NifResult <tuple!( $( $tyvar ) ,* ) >
97101 {
98- match unsafe { tuple :: get_tuple( term. get_env ( ) . as_c_arg ( ) , term . as_c_arg ( ) ) } {
102+ match unsafe { get_tuple( term) } {
99103 Ok ( elements) if elements. len( ) == count!( $( $index ) ,* ) =>
100104 Ok ( tuple!( $(
101105 ( <$tyvar as Decoder >:: decode(
0 commit comments