1- use crate :: ffi:: CStr ;
2- use crate :: io;
3- use crate :: sys:: cvt_wasi;
41use crate :: ffi:: OsString ;
52use crate :: marker:: PhantomData ;
63use crate :: os:: wasi:: ffi:: OsStringExt ;
74use crate :: vec;
85
6+ use :: wasi:: wasi_unstable as wasi;
7+
98pub unsafe fn init ( _argc : isize , _argv : * const * const u8 ) {
109}
1110
@@ -19,31 +18,17 @@ pub struct Args {
1918
2019/// Returns the command line arguments
2120pub fn args ( ) -> Args {
22- maybe_args ( ) . unwrap_or_else ( |_| {
23- Args {
24- iter : Vec :: new ( ) . into_iter ( ) ,
25- _dont_send_or_sync_me : PhantomData
26- }
27- } )
28- }
29-
30- fn maybe_args ( ) -> io:: Result < Args > {
31- unsafe {
32- let ( mut argc, mut argv_buf_size) = ( 0 , 0 ) ;
33- cvt_wasi ( libc:: __wasi_args_sizes_get ( & mut argc, & mut argv_buf_size) ) ?;
34-
35- let mut argc = vec ! [ core:: ptr:: null_mut:: <libc:: c_char>( ) ; argc] ;
36- let mut argv_buf = vec ! [ 0 ; argv_buf_size] ;
37- cvt_wasi ( libc:: __wasi_args_get ( argc. as_mut_ptr ( ) , argv_buf. as_mut_ptr ( ) ) ) ?;
38-
39- let args = argc. into_iter ( )
40- . map ( |ptr| CStr :: from_ptr ( ptr) . to_bytes ( ) . to_vec ( ) )
41- . map ( |bytes| OsString :: from_vec ( bytes) )
42- . collect :: < Vec < _ > > ( ) ;
43- Ok ( Args {
44- iter : args. into_iter ( ) ,
45- _dont_send_or_sync_me : PhantomData ,
46- } )
21+ let buf = wasi:: args_sizes_get ( ) . and_then ( |args_sizes| {
22+ let mut buf = Vec :: with_capacity ( args_sizes. get_count ( ) ) ;
23+ wasi:: args_get ( args_sizes, |arg| {
24+ let arg = OsString :: from_vec ( arg. to_vec ( ) ) ;
25+ buf. push ( arg) ;
26+ } ) ?;
27+ Ok ( buf)
28+ } ) . unwrap_or ( vec ! [ ] ) ;
29+ Args {
30+ iter : buf. into_iter ( ) ,
31+ _dont_send_or_sync_me : PhantomData
4732 }
4833}
4934
0 commit comments