@@ -1874,34 +1874,42 @@ impl Bindgen for FunctionBindgen<'_> {
1874
1874
self . gen . needs_copy_slice = true ;
1875
1875
self . needs_functions
1876
1876
. insert ( free. to_string ( ) , NeededFunction :: Free ) ;
1877
- let ( stringify, align) = match element {
1878
- Type :: Char => ( true , 1 ) ,
1879
- _ => ( false , self . gen . sizes . align ( element) ) ,
1877
+ let ( stringify, align, el_size) = match element {
1878
+ Type :: Char => ( true , 1 , 1 ) ,
1879
+ _ => (
1880
+ false ,
1881
+ self . sizes ( ) . align ( element) ,
1882
+ self . sizes ( ) . size ( element) ,
1883
+ ) ,
1880
1884
} ;
1881
1885
let tmp = self . tmp ( ) ;
1882
1886
self . push_str ( & format ! ( "let ptr{} = {};\n " , tmp, operands[ 0 ] ) ) ;
1883
1887
self . push_str ( & format ! ( "let len{} = {};\n " , tmp, operands[ 1 ] ) ) ;
1884
- let result = format ! (
1888
+ self . push_str ( & format ! (
1885
1889
"
1886
- copy_slice(
1887
- &mut caller,
1888
- memory,
1889
- func_{},
1890
- ptr{tmp}, len{tmp}, {}
1891
- )?
1892
- " ,
1893
- free,
1890
+ let data{tmp} = copy_slice(
1891
+ &mut caller,
1892
+ memory,
1893
+ ptr{tmp}, len{tmp}, {}
1894
+ )?;
1895
+ " ,
1894
1896
align,
1895
- tmp = tmp
1897
+ tmp = tmp,
1898
+ ) ) ;
1899
+ self . call_intrinsic (
1900
+ free,
1901
+ // we use normal multiplication here as copy_slice has
1902
+ // already verified that multiplied size fits i32
1903
+ format ! ( "(ptr{tmp}, len{tmp} * {}, {})" , el_size, align, tmp = tmp) ,
1896
1904
) ;
1897
1905
if stringify {
1898
1906
results. push ( format ! (
1899
- "String::from_utf8({})
1907
+ "String::from_utf8(data {})
1900
1908
.map_err(|_| wasmtime::Trap::new(\" invalid utf-8\" ))?" ,
1901
- result
1909
+ tmp ,
1902
1910
) ) ;
1903
1911
} else {
1904
- results. push ( result ) ;
1912
+ results. push ( format ! ( "data{}" , tmp ) ) ;
1905
1913
}
1906
1914
}
1907
1915
None => {
0 commit comments