WASI: Implement translation for events and subscriptions.

This commit is contained in:
Dan Gohman
2019-04-01 15:09:01 -07:00
parent 7151c110d7
commit 5b77f95284
3 changed files with 385 additions and 119 deletions

View File

@@ -193,8 +193,7 @@ syscalls! {
let e = host::wasmtime_ssp_args_get(argv_environ, host_argv.as_mut_ptr(), host_argv_buf); let e = host::wasmtime_ssp_args_get(argv_environ, host_argv.as_mut_ptr(), host_argv_buf);
encode_charstar_slice(argv, host_argv.as_mut_ptr(), (*argv_environ).argc + 1, encode_charstar_slice(argv, host_argv, argv_buf, host_argv_buf);
argv_buf, host_argv_buf);
return_encoded_errno(e) return_encoded_errno(e)
} }
@@ -327,8 +326,7 @@ syscalls! {
let e = host::wasmtime_ssp_environ_get(argv_environ, host_environ.as_mut_ptr(), host_environ_buf); let e = host::wasmtime_ssp_environ_get(argv_environ, host_environ.as_mut_ptr(), host_environ_buf);
encode_charstar_slice(environ, host_environ.as_mut_ptr(), (*argv_environ).environ_count + 1, encode_charstar_slice(environ, host_environ, environ_buf, host_environ_buf);
environ_buf, host_environ_buf);
return_encoded_errno(e) return_encoded_errno(e)
} }
@@ -1376,7 +1374,7 @@ syscalls! {
trace!(" | *out[{}]=...", index); trace!(" | *out[{}]=...", index);
} }
} }
encode_event_slice(vmctx, out, host_out).unwrap(); encode_event_slice(vmctx, out, host_out);
return_encoded_errno(e) return_encoded_errno(e)
} }

View File

@@ -1,7 +1,7 @@
use cast; use cast;
use cast::From as _0; use cast::From as _0;
use host; use host;
use std::mem::{align_of, size_of}; use std::mem::{align_of, size_of, zeroed};
use std::slice; use std::slice;
use wasm32; use wasm32;
use wasmtime_runtime::{Export, VMContext}; use wasmtime_runtime::{Export, VMContext};
@@ -134,6 +134,22 @@ pub fn encode_linkcount(linkcount: host::__wasi_linkcount_t) -> wasm32::__wasi_l
linkcount linkcount
} }
pub fn decode_userdata(userdata: wasm32::__wasi_userdata_t) -> host::__wasi_userdata_t {
userdata
}
pub fn encode_userdata(userdata: host::__wasi_userdata_t) -> wasm32::__wasi_userdata_t {
userdata
}
pub fn decode_eventtype(eventtype: wasm32::__wasi_eventtype_t) -> host::__wasi_eventtype_t {
eventtype
}
pub fn encode_eventtype(eventtype: host::__wasi_eventtype_t) -> wasm32::__wasi_eventtype_t {
eventtype
}
pub fn decode_filesize(filesize: wasm32::__wasi_filesize_t) -> host::__wasi_filesize_t { pub fn decode_filesize(filesize: wasm32::__wasi_filesize_t) -> host::__wasi_filesize_t {
filesize filesize
} }
@@ -142,6 +158,24 @@ pub fn encode_filesize(filesize: host::__wasi_filesize_t) -> wasm32::__wasi_file
filesize filesize
} }
pub fn decode_eventrwflags(
eventrwflags: wasm32::__wasi_eventrwflags_t,
) -> host::__wasi_eventrwflags_t {
eventrwflags
}
pub fn encode_eventrwflags(
eventrwflags: host::__wasi_eventrwflags_t,
) -> wasm32::__wasi_eventrwflags_t {
eventrwflags
}
pub fn decode_subclockflags(
subclockflags: wasm32::__wasi_subclockflags_t,
) -> host::__wasi_subclockflags_t {
subclockflags
}
pub fn decode_fd(fd: wasm32::__wasi_fd_t) -> host::__wasi_fd_t { pub fn decode_fd(fd: wasm32::__wasi_fd_t) -> host::__wasi_fd_t {
fd fd
} }
@@ -261,17 +295,15 @@ pub unsafe fn decode_charstar_slice(
pub unsafe fn encode_charstar_slice( pub unsafe fn encode_charstar_slice(
ptr: *mut wasm32::uintptr_t, ptr: *mut wasm32::uintptr_t,
host_ptr: *mut *mut libc::c_char, host_vec: Vec<*mut libc::c_char>,
count: usize,
guest_base: wasm32::uintptr_t, guest_base: wasm32::uintptr_t,
host_base: *mut libc::c_char, host_base: *mut libc::c_char,
) { ) {
for i in 0..count { for (i, host) in host_vec.iter().enumerate() {
let host = host_ptr.add(i).read();
let guest = if host.is_null() { let guest = if host.is_null() {
0 0
} else { } else {
guest_base + (host as usize - host_base as usize) as wasm32::uintptr_t guest_base + (*host as usize - host_base as usize) as wasm32::uintptr_t
}; };
ptr.add(i).write(guest); ptr.add(i).write(guest);
} }
@@ -319,11 +351,38 @@ pub unsafe fn decode_iovec_slice(
slice.iter().map(|iov| decode_iovec(vmctx, iov)).collect() slice.iter().map(|iov| decode_iovec(vmctx, iov)).collect()
} }
pub unsafe fn decode_subscription( pub fn decode_subscription(
_vmctx: &mut VMContext, guest_subscription: wasm32::__wasi_subscription_t,
_subscription: wasm32::__wasi_subscription_t, ) -> Result<host::__wasi_subscription_t, host::__wasi_errno_t> {
) -> host::__wasi_subscription_t { let mut host_subscription = host::__wasi_subscription_t {
unimplemented!("decode_subscription"); userdata: decode_userdata(guest_subscription.userdata),
type_: decode_eventtype(guest_subscription.type_),
u: unsafe { zeroed() },
};
match guest_subscription.type_ {
wasm32::__WASI_EVENTTYPE_CLOCK => unsafe {
host_subscription.u.clock =
host::__wasi_subscription_t___wasi_subscription_u___wasi_subscription_u_clock_t {
identifier: decode_userdata(guest_subscription.u.clock.identifier),
clock_id: decode_clockid(guest_subscription.u.clock.clock_id),
timeout: decode_timestamp(guest_subscription.u.clock.timeout),
precision: decode_timestamp(guest_subscription.u.clock.precision),
flags: decode_subclockflags(guest_subscription.u.clock.flags),
};
},
wasm32::__WASI_EVENTTYPE_FD_READ | wasm32::__WASI_EVENTTYPE_FD_WRITE => unsafe {
host_subscription
.u
.fd_readwrite =
host::__wasi_subscription_t___wasi_subscription_u___wasi_subscription_u_fd_readwrite_t {
fd: decode_fd(guest_subscription.u.fd_readwrite.fd),
}
},
_ => return Err(host::__WASI_EINVAL as host::__wasi_errno_t),
};
Ok(host_subscription)
} }
pub unsafe fn decode_subscription_slice( pub unsafe fn decode_subscription_slice(
@@ -333,17 +392,60 @@ pub unsafe fn decode_subscription_slice(
) -> Result<Vec<host::__wasi_subscription_t>, host::__wasi_errno_t> { ) -> Result<Vec<host::__wasi_subscription_t>, host::__wasi_errno_t> {
let slice = decode_slice_of::<wasm32::__wasi_subscription_t>(vmctx, ptr, len)?; let slice = decode_slice_of::<wasm32::__wasi_subscription_t>(vmctx, ptr, len)?;
let slice = slice::from_raw_parts(slice.0, slice.1); let slice = slice::from_raw_parts(slice.0, slice.1);
Ok(slice slice
.iter() .iter()
.map(|subscription| decode_subscription(vmctx, *subscription)) .map(|subscription| decode_subscription(*subscription))
.collect()) .collect()
} }
pub unsafe fn decode_event( pub fn decode_event(
_vmctx: &mut VMContext, guest_event: wasm32::__wasi_event_t,
_event: wasm32::__wasi_event_t, ) -> Result<host::__wasi_event_t, host::__wasi_errno_t> {
) -> host::__wasi_event_t { let mut host_event = host::__wasi_event_t {
unimplemented!("decode_event"); userdata: decode_userdata(guest_event.userdata),
error: decode_errno(guest_event.error),
type_: decode_eventtype(guest_event.type_),
u: unsafe { zeroed() },
};
match guest_event.type_ {
wasm32::__WASI_EVENTTYPE_CLOCK => {}
wasm32::__WASI_EVENTTYPE_FD_READ | wasm32::__WASI_EVENTTYPE_FD_WRITE => unsafe {
host_event.u.fd_readwrite =
host::__wasi_event_t___wasi_event_u___wasi_event_u_fd_readwrite_t {
nbytes: decode_filesize(guest_event.u.fd_readwrite.nbytes),
flags: decode_eventrwflags(guest_event.u.fd_readwrite.flags),
}
},
_ => return Err(host::__WASI_EINVAL as host::__wasi_errno_t),
};
Ok(host_event)
}
pub fn encode_event(host_event: host::__wasi_event_t) -> wasm32::__wasi_event_t {
let mut guest_event = wasm32::__wasi_event_t {
userdata: encode_userdata(host_event.userdata),
error: encode_errno(host_event.error),
type_: encode_eventtype(host_event.type_),
u: unsafe { zeroed() },
__bindgen_padding_0: 0,
};
match u32::from(host_event.type_) {
host::__WASI_EVENTTYPE_CLOCK => {}
host::__WASI_EVENTTYPE_FD_READ | host::__WASI_EVENTTYPE_FD_WRITE => unsafe {
guest_event.u.fd_readwrite =
wasm32::__wasi_event_t___wasi_event_u___wasi_event_u_fd_readwrite_t {
nbytes: encode_filesize(host_event.u.fd_readwrite.nbytes),
flags: encode_eventrwflags(host_event.u.fd_readwrite.flags),
__bindgen_padding_0: zeroed(),
}
},
_ => panic!("unrecognized event type"),
};
guest_event
} }
pub unsafe fn decode_event_slice( pub unsafe fn decode_event_slice(
@@ -353,18 +455,24 @@ pub unsafe fn decode_event_slice(
) -> Result<Vec<host::__wasi_event_t>, host::__wasi_errno_t> { ) -> Result<Vec<host::__wasi_event_t>, host::__wasi_errno_t> {
let slice = decode_slice_of::<wasm32::__wasi_event_t>(vmctx, ptr, len)?; let slice = decode_slice_of::<wasm32::__wasi_event_t>(vmctx, ptr, len)?;
let slice = slice::from_raw_parts(slice.0, slice.1); let slice = slice::from_raw_parts(slice.0, slice.1);
Ok(slice slice.iter().map(|event| decode_event(*event)).collect()
.iter()
.map(|event| decode_event(vmctx, *event))
.collect())
} }
pub unsafe fn encode_event_slice( pub unsafe fn encode_event_slice(
_vmctx: &mut VMContext, vmctx: &mut VMContext,
_ptr: wasm32::uintptr_t, ptr: wasm32::uintptr_t,
_host: Vec<host::__wasi_event_t>, host_vec: Vec<host::__wasi_event_t>,
) -> Result<(), host::__wasi_errno_t> { ) {
unimplemented!("encode_event_slice"); for (i, host) in host_vec.iter().enumerate() {
let guest = encode_event(*host);
encode_pointee(
vmctx,
ptr + (i * size_of::<wasm32::__wasi_event_t>()) as u32,
guest,
)
.unwrap();
}
} }
pub unsafe fn decode_fd_byref( pub unsafe fn decode_fd_byref(
@@ -556,6 +664,10 @@ pub unsafe fn encode_filestat_byref(
encode_pointee::<wasm32::__wasi_filestat_t>(vmctx, filestat_ptr, wasm32_filestat) encode_pointee::<wasm32::__wasi_filestat_t>(vmctx, filestat_ptr, wasm32_filestat)
} }
pub fn decode_errno(errno: wasm32::__wasi_errno_t) -> host::__wasi_errno_t {
errno
}
pub fn encode_errno(e: host::__wasi_errno_t) -> wasm32::__wasi_errno_t { pub fn encode_errno(e: host::__wasi_errno_t) -> wasm32::__wasi_errno_t {
assert!(e <= wasm32::__WASI_ENOTCAPABLE); assert!(e <= wasm32::__WASI_ENOTCAPABLE);
e e

View File

@@ -213,7 +213,144 @@ pub struct __wasi_event_t {
pub error: __wasi_errno_t, pub error: __wasi_errno_t,
pub type_: __wasi_eventtype_t, pub type_: __wasi_eventtype_t,
pub __bindgen_padding_0: u32, pub __bindgen_padding_0: u32,
pub __bindgen_anon_1: __wasi_event_t__bindgen_ty_1, pub u: __wasi_event_t___wasi_event_u,
}
#[repr(C)]
#[derive(Copy, Clone)]
pub union __wasi_event_t___wasi_event_u {
pub fd_readwrite: __wasi_event_t___wasi_event_u___wasi_event_u_fd_readwrite_t,
_bindgen_union_align: [u64; 2usize],
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct __wasi_event_t___wasi_event_u___wasi_event_u_fd_readwrite_t {
pub nbytes: __wasi_filesize_t,
pub flags: __wasi_eventrwflags_t,
pub __bindgen_padding_0: [u16; 3usize],
}
#[test]
fn bindgen_test_layout___wasi_event_t___wasi_event_u___wasi_event_u_fd_readwrite_t() {
assert_eq!(
::std::mem::size_of::<__wasi_event_t___wasi_event_u___wasi_event_u_fd_readwrite_t>(),
16usize,
concat!(
"Size of: ",
stringify!(__wasi_event_t___wasi_event_u___wasi_event_u_fd_readwrite_t)
)
);
assert_eq!(
::std::mem::align_of::<__wasi_event_t___wasi_event_u___wasi_event_u_fd_readwrite_t>(),
8usize,
concat!(
"Alignment of ",
stringify!(__wasi_event_t___wasi_event_u___wasi_event_u_fd_readwrite_t)
)
);
assert_eq!(
unsafe {
&(*(::std::ptr::null::<__wasi_event_t___wasi_event_u___wasi_event_u_fd_readwrite_t>()))
.nbytes as *const _ as usize
},
0usize,
concat!(
"Offset of field: ",
stringify!(__wasi_event_t___wasi_event_u___wasi_event_u_fd_readwrite_t),
"::",
stringify!(nbytes)
)
);
assert_eq!(
unsafe {
&(*(::std::ptr::null::<__wasi_event_t___wasi_event_u___wasi_event_u_fd_readwrite_t>()))
.flags as *const _ as usize
},
8usize,
concat!(
"Offset of field: ",
stringify!(__wasi_event_t___wasi_event_u___wasi_event_u_fd_readwrite_t),
"::",
stringify!(flags)
)
);
}
#[test]
fn bindgen_test_layout___wasi_event_t___wasi_event_u() {
assert_eq!(
::std::mem::size_of::<__wasi_event_t___wasi_event_u>(),
16usize,
concat!("Size of: ", stringify!(__wasi_event_t___wasi_event_u))
);
assert_eq!(
::std::mem::align_of::<__wasi_event_t___wasi_event_u>(),
8usize,
concat!("Alignment of ", stringify!(__wasi_event_t___wasi_event_u))
);
assert_eq!(
unsafe {
&(*(::std::ptr::null::<__wasi_event_t___wasi_event_u>())).fd_readwrite as *const _
as usize
},
0usize,
concat!(
"Offset of field: ",
stringify!(__wasi_event_t___wasi_event_u),
"::",
stringify!(fd_readwrite)
)
);
}
#[test]
fn bindgen_test_layout___wasi_event_t() {
assert_eq!(
::std::mem::size_of::<__wasi_event_t>(),
32usize,
concat!("Size of: ", stringify!(__wasi_event_t))
);
assert_eq!(
::std::mem::align_of::<__wasi_event_t>(),
8usize,
concat!("Alignment of ", stringify!(__wasi_event_t))
);
assert_eq!(
unsafe { &(*(::std::ptr::null::<__wasi_event_t>())).userdata as *const _ as usize },
0usize,
concat!(
"Offset of field: ",
stringify!(__wasi_event_t),
"::",
stringify!(userdata)
)
);
assert_eq!(
unsafe { &(*(::std::ptr::null::<__wasi_event_t>())).error as *const _ as usize },
8usize,
concat!(
"Offset of field: ",
stringify!(__wasi_event_t),
"::",
stringify!(error)
)
);
assert_eq!(
unsafe { &(*(::std::ptr::null::<__wasi_event_t>())).type_ as *const _ as usize },
10usize,
concat!(
"Offset of field: ",
stringify!(__wasi_event_t),
"::",
stringify!(type_)
)
);
assert_eq!(
unsafe { &(*(::std::ptr::null::<__wasi_event_t>())).u as *const _ as usize },
16usize,
concat!(
"Offset of field: ",
stringify!(__wasi_event_t),
"::",
stringify!(u)
)
);
} }
#[repr(C)] #[repr(C)]
#[derive(Copy, Clone)] #[derive(Copy, Clone)]
@@ -731,18 +868,19 @@ pub struct __wasi_subscription_t {
pub userdata: __wasi_userdata_t, pub userdata: __wasi_userdata_t,
pub type_: __wasi_eventtype_t, pub type_: __wasi_eventtype_t,
pub __bindgen_padding_0: u32, pub __bindgen_padding_0: u32,
pub __bindgen_anon_1: __wasi_subscription_t__bindgen_ty_1, pub u: __wasi_subscription_t___wasi_subscription_u,
} }
#[repr(C)] #[repr(C)]
#[derive(Copy, Clone)] #[derive(Copy, Clone)]
pub union __wasi_subscription_t__bindgen_ty_1 { pub union __wasi_subscription_t___wasi_subscription_u {
pub clock: __wasi_subscription_t__bindgen_ty_1__bindgen_ty_1, pub clock: __wasi_subscription_t___wasi_subscription_u___wasi_subscription_u_clock_t,
pub fd_readwrite: __wasi_subscription_t__bindgen_ty_1__bindgen_ty_3, pub fd_readwrite:
__wasi_subscription_t___wasi_subscription_u___wasi_subscription_u_fd_readwrite_t,
_bindgen_union_align: [u64; 5usize], _bindgen_union_align: [u64; 5usize],
} }
#[repr(C)] #[repr(C)]
#[derive(Debug, Copy, Clone)] #[derive(Debug, Copy, Clone)]
pub struct __wasi_subscription_t__bindgen_ty_1__bindgen_ty_1 { pub struct __wasi_subscription_t___wasi_subscription_u___wasi_subscription_u_clock_t {
pub identifier: __wasi_userdata_t, pub identifier: __wasi_userdata_t,
pub clock_id: __wasi_clockid_t, pub clock_id: __wasi_clockid_t,
pub __bindgen_padding_0: u32, pub __bindgen_padding_0: u32,
@@ -751,78 +889,99 @@ pub struct __wasi_subscription_t__bindgen_ty_1__bindgen_ty_1 {
pub flags: __wasi_subclockflags_t, pub flags: __wasi_subclockflags_t,
pub __bindgen_padding_1: [u16; 3usize], pub __bindgen_padding_1: [u16; 3usize],
} }
#[allow(non_snake_case)]
#[test] #[test]
fn bindgen_test_layout_wasi_subscription_t__bindgen_ty_1__bindgen_ty_1() { fn bindgen_test_layout___wasi_subscription_t___wasi_subscription_u___wasi_subscription_u_clock_t() {
assert_eq!( assert_eq!(
::std::mem::size_of::<__wasi_subscription_t__bindgen_ty_1__bindgen_ty_1>(), ::std::mem::size_of::<
__wasi_subscription_t___wasi_subscription_u___wasi_subscription_u_clock_t,
>(),
40usize, 40usize,
concat!( concat!(
"Size of: ", "Size of: ",
stringify!(__wasi_subscription_t__bindgen_ty_1__bindgen_ty_1) stringify!(__wasi_subscription_t___wasi_subscription_u___wasi_subscription_u_clock_t)
)
);
assert_eq!(
::std::mem::align_of::<
__wasi_subscription_t___wasi_subscription_u___wasi_subscription_u_clock_t,
>(),
8usize,
concat!(
"Alignment of ",
stringify!(__wasi_subscription_t___wasi_subscription_u___wasi_subscription_u_clock_t)
) )
); );
assert_eq!( assert_eq!(
unsafe { unsafe {
&(*(::std::ptr::null::<__wasi_subscription_t__bindgen_ty_1__bindgen_ty_1>())).identifier &(*(::std::ptr::null::<
as *const _ as usize __wasi_subscription_t___wasi_subscription_u___wasi_subscription_u_clock_t,
>()))
.identifier as *const _ as usize
}, },
0usize, 0usize,
concat!( concat!(
"Offset of field: ", "Offset of field: ",
stringify!(__wasi_subscription_t__bindgen_ty_1__bindgen_ty_1), stringify!(__wasi_subscription_t___wasi_subscription_u___wasi_subscription_u_clock_t),
"::", "::",
stringify!(identifier) stringify!(identifier)
) )
); );
assert_eq!( assert_eq!(
unsafe { unsafe {
&(*(::std::ptr::null::<__wasi_subscription_t__bindgen_ty_1__bindgen_ty_1>())).clock_id &(*(::std::ptr::null::<
as *const _ as usize __wasi_subscription_t___wasi_subscription_u___wasi_subscription_u_clock_t,
>()))
.clock_id as *const _ as usize
}, },
8usize, 8usize,
concat!( concat!(
"Offset of field: ", "Offset of field: ",
stringify!(__wasi_subscription_t__bindgen_ty_1__bindgen_ty_1), stringify!(__wasi_subscription_t___wasi_subscription_u___wasi_subscription_u_clock_t),
"::", "::",
stringify!(clock_id) stringify!(clock_id)
) )
); );
assert_eq!( assert_eq!(
unsafe { unsafe {
&(*(::std::ptr::null::<__wasi_subscription_t__bindgen_ty_1__bindgen_ty_1>())).timeout &(*(::std::ptr::null::<
as *const _ as usize __wasi_subscription_t___wasi_subscription_u___wasi_subscription_u_clock_t,
>()))
.timeout as *const _ as usize
}, },
16usize, 16usize,
concat!( concat!(
"Offset of field: ", "Offset of field: ",
stringify!(__wasi_subscription_t__bindgen_ty_1__bindgen_ty_1), stringify!(__wasi_subscription_t___wasi_subscription_u___wasi_subscription_u_clock_t),
"::", "::",
stringify!(timeout) stringify!(timeout)
) )
); );
assert_eq!( assert_eq!(
unsafe { unsafe {
&(*(::std::ptr::null::<__wasi_subscription_t__bindgen_ty_1__bindgen_ty_1>())).precision &(*(::std::ptr::null::<
as *const _ as usize __wasi_subscription_t___wasi_subscription_u___wasi_subscription_u_clock_t,
>()))
.precision as *const _ as usize
}, },
24usize, 24usize,
concat!( concat!(
"Offset of field: ", "Offset of field: ",
stringify!(__wasi_subscription_t__bindgen_ty_1__bindgen_ty_1), stringify!(__wasi_subscription_t___wasi_subscription_u___wasi_subscription_u_clock_t),
"::", "::",
stringify!(precision) stringify!(precision)
) )
); );
assert_eq!( assert_eq!(
unsafe { unsafe {
&(*(::std::ptr::null::<__wasi_subscription_t__bindgen_ty_1__bindgen_ty_1>())).flags &(*(::std::ptr::null::<
as *const _ as usize __wasi_subscription_t___wasi_subscription_u___wasi_subscription_u_clock_t,
>()))
.flags as *const _ as usize
}, },
32usize, 32usize,
concat!( concat!(
"Offset of field: ", "Offset of field: ",
stringify!(__wasi_subscription_t__bindgen_ty_1__bindgen_ty_1), stringify!(__wasi_subscription_t___wasi_subscription_u___wasi_subscription_u_clock_t),
"::", "::",
stringify!(flags) stringify!(flags)
) )
@@ -830,123 +989,111 @@ fn bindgen_test_layout_wasi_subscription_t__bindgen_ty_1__bindgen_ty_1() {
} }
#[repr(C)] #[repr(C)]
#[derive(Debug, Copy, Clone)] #[derive(Debug, Copy, Clone)]
pub struct __wasi_subscription_t__bindgen_ty_1__bindgen_ty_3 { pub struct __wasi_subscription_t___wasi_subscription_u___wasi_subscription_u_fd_readwrite_t {
pub fd: __wasi_fd_t, pub fd: __wasi_fd_t,
} }
#[allow(non_snake_case)]
#[test] #[test]
fn bindgen_test_layout_wasi_subscription_t__bindgen_ty_1__bindgen_ty_3() { fn bindgen_test_layout___wasi_subscription_t___wasi_subscription_u___wasi_subscription_u_fd_readwrite_t(
) {
assert_eq!( assert_eq!(
::std::mem::size_of::<__wasi_subscription_t__bindgen_ty_1__bindgen_ty_3>(), ::std::mem::size_of::<
__wasi_subscription_t___wasi_subscription_u___wasi_subscription_u_fd_readwrite_t,
>(),
4usize, 4usize,
concat!( concat!(
"Size of: ", "Size of: ",
stringify!(__wasi_subscription_t__bindgen_ty_1__bindgen_ty_3) stringify!(
__wasi_subscription_t___wasi_subscription_u___wasi_subscription_u_fd_readwrite_t
)
) )
); );
assert_eq!( assert_eq!(
::std::mem::align_of::<__wasi_subscription_t__bindgen_ty_1__bindgen_ty_3>(), ::std::mem::align_of::<
__wasi_subscription_t___wasi_subscription_u___wasi_subscription_u_fd_readwrite_t,
>(),
4usize, 4usize,
concat!( concat!(
"Alignment of ", "Alignment of ",
stringify!(__wasi_subscription_t__bindgen_ty_1__bindgen_ty_3) stringify!(
__wasi_subscription_t___wasi_subscription_u___wasi_subscription_u_fd_readwrite_t
)
) )
); );
assert_eq!( assert_eq!(
unsafe { unsafe {
&(*(::std::ptr::null::<__wasi_subscription_t__bindgen_ty_1__bindgen_ty_3>())).fd &(*(::std::ptr::null::<
as *const _ as usize __wasi_subscription_t___wasi_subscription_u___wasi_subscription_u_fd_readwrite_t,
>()))
.fd as *const _ as usize
}, },
0usize, 0usize,
concat!( concat!(
"Offset of field: ", "Offset of field: ",
stringify!(__wasi_subscription_t__bindgen_ty_1__bindgen_ty_3), stringify!(
__wasi_subscription_t___wasi_subscription_u___wasi_subscription_u_fd_readwrite_t
),
"::", "::",
stringify!(fd) stringify!(fd)
) )
); );
} }
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct __wasi_subscription_t__bindgen_ty_1__bindgen_ty_5 {
pub fd: __wasi_fd_t,
}
#[allow(non_snake_case)]
#[test] #[test]
fn bindgen_test_layout_wasi_subscription_t__bindgen_ty_1__bindgen_ty_5() { fn bindgen_test_layout___wasi_subscription_t___wasi_subscription_u() {
assert_eq!( assert_eq!(
::std::mem::size_of::<__wasi_subscription_t__bindgen_ty_1__bindgen_ty_5>(), ::std::mem::size_of::<__wasi_subscription_t___wasi_subscription_u>(),
4usize,
concat!(
"Size of: ",
stringify!(__wasi_subscription_t__bindgen_ty_1__bindgen_ty_5)
)
);
assert_eq!(
::std::mem::align_of::<__wasi_subscription_t__bindgen_ty_1__bindgen_ty_5>(),
4usize,
concat!(
"Alignment of ",
stringify!(__wasi_subscription_t__bindgen_ty_1__bindgen_ty_5)
)
);
assert_eq!(
unsafe {
&(*(::std::ptr::null::<__wasi_subscription_t__bindgen_ty_1__bindgen_ty_5>())).fd
as *const _ as usize
},
0usize,
concat!(
"Offset of field: ",
stringify!(__wasi_subscription_t__bindgen_ty_1__bindgen_ty_5),
"::",
stringify!(fd)
)
);
}
#[allow(non_snake_case)]
#[test]
fn bindgen_test_layout_wasi_subscription_t__bindgen_ty_1() {
assert_eq!(
::std::mem::size_of::<__wasi_subscription_t__bindgen_ty_1>(),
40usize, 40usize,
concat!("Size of: ", stringify!(__wasi_subscription_t__bindgen_ty_1)) concat!(
"Size of: ",
stringify!(__wasi_subscription_t___wasi_subscription_u)
)
);
assert_eq!(
::std::mem::align_of::<__wasi_subscription_t___wasi_subscription_u>(),
8usize,
concat!(
"Alignment of ",
stringify!(__wasi_subscription_t___wasi_subscription_u)
)
); );
assert_eq!( assert_eq!(
unsafe { unsafe {
&(*(::std::ptr::null::<__wasi_subscription_t__bindgen_ty_1>())).clock as *const _ &(*(::std::ptr::null::<__wasi_subscription_t___wasi_subscription_u>())).clock
as usize as *const _ as usize
}, },
0usize, 0usize,
concat!( concat!(
"Offset of field: ", "Offset of field: ",
stringify!(__wasi_subscription_t__bindgen_ty_1), stringify!(__wasi_subscription_t___wasi_subscription_u),
"::", "::",
stringify!(clock) stringify!(clock)
) )
); );
assert_eq!( assert_eq!(
unsafe { unsafe {
&(*(::std::ptr::null::<__wasi_subscription_t__bindgen_ty_1>())).fd_readwrite as *const _ &(*(::std::ptr::null::<__wasi_subscription_t___wasi_subscription_u>())).fd_readwrite
as usize as *const _ as usize
}, },
0usize, 0usize,
concat!( concat!(
"Offset of field: ", "Offset of field: ",
stringify!(__wasi_subscription_t__bindgen_ty_1), stringify!(__wasi_subscription_t___wasi_subscription_u),
"::", "::",
stringify!(fd_readwrite) stringify!(fd_readwrite)
) )
); );
} }
#[allow(non_snake_case)]
#[test] #[test]
fn bindgen_test_layout_wasi_subscription_t() { fn bindgen_test_layout___wasi_subscription_t() {
assert_eq!( assert_eq!(
::std::mem::size_of::<__wasi_subscription_t>(), ::std::mem::size_of::<__wasi_subscription_t>(),
56usize, 56usize,
concat!("Size of: ", stringify!(__wasi_subscription_t)) concat!("Size of: ", stringify!(__wasi_subscription_t))
); );
assert_eq!(
::std::mem::align_of::<__wasi_subscription_t>(),
8usize,
concat!("Alignment of ", stringify!(__wasi_subscription_t))
);
assert_eq!( assert_eq!(
unsafe { &(*(::std::ptr::null::<__wasi_subscription_t>())).userdata as *const _ as usize }, unsafe { &(*(::std::ptr::null::<__wasi_subscription_t>())).userdata as *const _ as usize },
0usize, 0usize,
@@ -967,8 +1114,17 @@ fn bindgen_test_layout_wasi_subscription_t() {
stringify!(type_) stringify!(type_)
) )
); );
assert_eq!(
unsafe { &(*(::std::ptr::null::<__wasi_subscription_t>())).u as *const _ as usize },
16usize,
concat!(
"Offset of field: ",
stringify!(__wasi_subscription_t),
"::",
stringify!(u)
)
);
} }
pub fn strerror(errno: __wasi_errno_t) -> &'static str { pub fn strerror(errno: __wasi_errno_t) -> &'static str {
match errno { match errno {
__WASI_ESUCCESS => "__WASI_ESUCCESS", __WASI_ESUCCESS => "__WASI_ESUCCESS",