1
- use crate :: ffi:: CStr ;
2
- use crate :: io;
3
- use crate :: sys:: cvt_wasi;
4
1
use crate :: ffi:: OsString ;
5
2
use crate :: marker:: PhantomData ;
6
3
use crate :: os:: wasi:: ffi:: OsStringExt ;
7
4
use crate :: vec;
8
5
6
+ use :: wasi:: wasi_unstable as wasi;
7
+
9
8
pub unsafe fn init ( _argc : isize , _argv : * const * const u8 ) {
10
9
}
11
10
@@ -19,31 +18,17 @@ pub struct Args {
19
18
20
19
/// Returns the command line arguments
21
20
pub 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
47
32
}
48
33
}
49
34
0 commit comments