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 } ;
5
3
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;
7
8
wrapper ! (
8
9
struct Tuple ( TermType :: Tuple )
9
10
) ;
@@ -33,7 +34,7 @@ impl<'a> Tuple<'a> {
33
34
pub fn get ( & self , index : usize ) -> Option < Term < ' a > > {
34
35
self . get_elements ( )
35
36
. get ( index)
36
- . map ( |ptr| unsafe { Term :: new ( self . get_env ( ) , ptr) } )
37
+ . map ( |ptr| unsafe { Term :: new ( self . get_env ( ) , * ptr) } )
37
38
}
38
39
39
40
/// 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> {
56
57
/// Convert a vector of terms to an Erlang tuple. (To convert from a Rust tuple to an Erlang tuple,
57
58
/// use `Encoder` instead.)
58
59
pub 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)) }
61
67
}
62
68
63
69
/// 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 {
83
89
Encoder for tuple!( $( $tyvar ) ,* )
84
90
{
85
91
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)
90
94
}
91
95
}
92
96
@@ -95,7 +99,7 @@ macro_rules! impl_nifencoder_nifdecoder_for_tuple {
95
99
{
96
100
fn decode( term: Term <' a>) -> NifResult <tuple!( $( $tyvar ) ,* ) >
97
101
{
98
- match unsafe { tuple :: get_tuple( term. get_env ( ) . as_c_arg ( ) , term . as_c_arg ( ) ) } {
102
+ match unsafe { get_tuple( term) } {
99
103
Ok ( elements) if elements. len( ) == count!( $( $index ) ,* ) =>
100
104
Ok ( tuple!( $(
101
105
( <$tyvar as Decoder >:: decode(
0 commit comments