wasmtime 0.3.0

Command-line interface for Wasmtime
Documentation
diff --git a/lib/runtime/src/vmcontext.rs b/lib/runtime/src/vmcontext.rs
index 1a4e5f4..fec9f9a 100644
--- a/lib/runtime/src/vmcontext.rs
+++ b/lib/runtime/src/vmcontext.rs
@@ -476,6 +476,8 @@ impl Default for VMCallerCheckedAnyfunc {
 #[derive(Debug)]
 #[repr(C)]
 pub struct VMContext {}
+fixme: prohibit independent construction of VMContext? that would make
+instance_contents and host_state safe.
 
 impl VMContext {
     /// Return a mutable reference to the associated `Instance`.
diff --git a/lib/wasi/src/syscalls.rs b/lib/wasi/src/syscalls.rs
index c1c4391..8276d82 100644
--- a/lib/wasi/src/syscalls.rs
+++ b/lib/wasi/src/syscalls.rs
@@ -12,8 +12,8 @@ fn return_encoded_errno(e: host::__wasi_errno_t) -> wasm32::__wasi_errno_t {
     errno
 }
 
-unsafe fn get_curfds(vmctx: *mut VMContext) -> *mut fd_table {
-    (&mut *(&mut *vmctx)
+fn get_curfds(vmctx: &mut VMContext) -> *mut fd_table {
+    (&mut *vmctx
         .host_state()
         .downcast_mut::<WASIState>()
         .unwrap()
@@ -92,7 +92,7 @@ impl AbiRet for () {
 }
 
 macro_rules! syscalls {
-    ($(pub unsafe extern "C" fn $name:ident($ctx:ident: *mut VMContext $(, $arg:ident: $ty:ty)*,) -> $ret:ty {
+    ($(pub extern "C" fn $name:ident($ctx:ident: &mut VMContext $(, $arg:ident: $ty:ty)*,) -> $ret:ty {
         $($body:tt)*
     })*) => ($(
         pub mod $name {
@@ -114,13 +114,13 @@ macro_rules! syscalls {
             ///
             /// NB: ideally we'd expose `shim` below, but it seems like there's
             /// a compiler bug which prvents that from being cast to a `usize`.
-            pub static SHIM: unsafe extern "C" fn(
-                *mut VMContext,
+            pub static SHIM: extern "C" fn(
+                &mut VMContext,
                 $(<$ty as AbiParam>::Abi),*
             ) -> <$ret as AbiRet>::Abi = shim;
 
-            unsafe extern "C" fn shim(
-                $ctx: *mut VMContext,
+            extern "C" fn shim(
+                $ctx: &mut VMContext,
                 $($arg: <$ty as AbiParam>::Abi,)*
             ) -> <$ret as AbiRet>::Abi {
                 let r = super::$name($ctx, $(<$ty as AbiParam>::convert($arg),)*);
@@ -128,7 +128,7 @@ macro_rules! syscalls {
             }
         }
 
-        pub unsafe extern "C" fn $name($ctx: *mut VMContext, $($arg: $ty,)*) -> $ret {
+        pub extern "C" fn $name($ctx: &mut VMContext, $($arg: $ty,)*) -> $ret {
             $($body)*
         }
     )*)
@@ -136,8 +136,8 @@ macro_rules! syscalls {
 
 syscalls! {
 
-    pub unsafe extern "C" fn clock_res_get(
-        vmctx: *mut VMContext,
+    pub extern "C" fn clock_res_get(
+        vmctx: &mut VMContext,
         clock_id: wasm32::__wasi_clockid_t,
         resolution: wasm32::uintptr_t,
     ) -> wasm32::__wasi_errno_t {
@@ -147,7 +147,6 @@ syscalls! {
             resolution,
         );
 
-        let vmctx = &mut *vmctx;
         let clock_id = decode_clockid(clock_id);
         let mut host_resolution = match decode_timestamp_byref(vmctx, resolution) {
             Ok(host_resolution) => host_resolution,
@@ -162,8 +161,8 @@ syscalls! {
         return_encoded_errno(e)
     }
 
-    pub unsafe extern "C" fn clock_time_get(
-        vmctx: *mut VMContext,
+    pub extern "C" fn clock_time_get(
+        vmctx: &mut VMContext,
         clock_id: wasm32::__wasi_clockid_t,
         precision: wasm32::__wasi_timestamp_t,
         time: wasm32::uintptr_t,
@@ -175,7 +174,6 @@ syscalls! {
             time,
         );
 
-        let vmctx = &mut *vmctx;
         let clock_id = decode_clockid(clock_id);
         let precision = decode_timestamp(precision);
         let mut host_time = match decode_timestamp_byref(vmctx, time) {
@@ -191,13 +189,12 @@ syscalls! {
         return_encoded_errno(e)
     }
 
-    pub unsafe extern "C" fn fd_close(
-        vmctx: *mut VMContext,
+    pub extern "C" fn fd_close(
+        vmctx: &mut VMContext,
         fd: wasm32::__wasi_fd_t,
     ) -> wasm32::__wasi_errno_t {
         trace!("fd_close(fd={:?})", fd);
 
-        let vmctx = &mut *vmctx;
         let curfds = get_curfds(vmctx);
         let fd = decode_fd(fd);
 
@@ -206,13 +203,12 @@ syscalls! {
         return_encoded_errno(e)
     }
 
-    pub unsafe extern "C" fn fd_datasync(
-        vmctx: *mut VMContext,
+    pub extern "C" fn fd_datasync(
+        vmctx: &mut VMContext,
         fd: wasm32::__wasi_fd_t,
     ) -> wasm32::__wasi_errno_t {
         trace!("fd_datasync(fd={:?})", fd);
 
-        let vmctx = &mut *vmctx;
         let curfds = get_curfds(vmctx);
         let fd = decode_fd(fd);
 
@@ -221,8 +217,8 @@ syscalls! {
         return_encoded_errno(e)
     }
 
-    pub unsafe extern "C" fn fd_pread(
-        vmctx: *mut VMContext,
+    pub extern "C" fn fd_pread(
+        vmctx: &mut VMContext,
         fd: wasm32::__wasi_fd_t,
         iovs: wasm32::uintptr_t,
         iovs_len: wasm32::size_t,
@@ -238,7 +234,6 @@ syscalls! {
             nread
         );
 
-        let vmctx = &mut *vmctx;
         let curfds = get_curfds(vmctx);
         let fd = decode_fd(fd);
         let iovs = match decode_iovec_slice(vmctx, iovs, iovs_len) {
@@ -266,8 +261,8 @@ syscalls! {
         return_encoded_errno(e)
     }
 
-    pub unsafe extern "C" fn fd_pwrite(
-        vmctx: *mut VMContext,
+    pub extern "C" fn fd_pwrite(
+        vmctx: &mut VMContext,
         fd: wasm32::__wasi_fd_t,
         iovs: wasm32::uintptr_t,
         iovs_len: wasm32::size_t,
@@ -283,7 +278,6 @@ syscalls! {
             nwritten
         );
 
-        let vmctx = &mut *vmctx;
         let curfds = get_curfds(vmctx);
         let fd = decode_fd(fd);
         let iovs = match decode_ciovec_slice(vmctx, iovs, iovs_len) {
@@ -311,8 +305,8 @@ syscalls! {
         return_encoded_errno(e)
     }
 
-    pub unsafe extern "C" fn fd_read(
-        vmctx: *mut VMContext,
+    pub extern "C" fn fd_read(
+        vmctx: &mut VMContext,
         fd: wasm32::__wasi_fd_t,
         iovs: wasm32::uintptr_t,
         iovs_len: wasm32::size_t,
@@ -326,7 +320,6 @@ syscalls! {
             nread
         );
 
-        let vmctx = &mut *vmctx;
         let curfds = get_curfds(vmctx);
         let fd = decode_fd(fd);
         let iovs = match decode_iovec_slice(vmctx, iovs, iovs_len) {
@@ -346,14 +339,13 @@ syscalls! {
         return_encoded_errno(e)
     }
 
-    pub unsafe extern "C" fn fd_renumber(
-        vmctx: *mut VMContext,
+    pub extern "C" fn fd_renumber(
+        vmctx: &mut VMContext,
         from: wasm32::__wasi_fd_t,
         to: wasm32::__wasi_fd_t,
     ) -> wasm32::__wasi_errno_t {
         trace!("fd_renumber(from={:?}, to={:?})", from, to);
 
-        let vmctx = &mut *vmctx;
         let curfds = get_curfds(vmctx);
         let from = decode_fd(from);
         let to = decode_fd(to);
@@ -363,8 +355,8 @@ syscalls! {
         return_encoded_errno(e)
     }
 
-    pub unsafe extern "C" fn fd_seek(
-        vmctx: *mut VMContext,
+    pub extern "C" fn fd_seek(
+        vmctx: &mut VMContext,
         fd: wasm32::__wasi_fd_t,
         offset: wasm32::__wasi_filedelta_t,
         whence: wasm32::__wasi_whence_t,
@@ -378,7 +370,6 @@ syscalls! {
             newoffset
         );
 
-        let vmctx = &mut *vmctx;
         let curfds = get_curfds(vmctx);
         let fd = decode_fd(fd);
         let offset = decode_filedelta(offset);
@@ -396,14 +387,13 @@ syscalls! {
         return_encoded_errno(e)
     }
 
-    pub unsafe extern "C" fn fd_tell(
-        vmctx: *mut VMContext,
+    pub extern "C" fn fd_tell(
+        vmctx: &mut VMContext,
         fd: wasm32::__wasi_fd_t,
         newoffset: wasm32::uintptr_t,
     ) -> wasm32::__wasi_errno_t {
         trace!("fd_tell(fd={:?}, newoffset={:#x?})", fd, newoffset);
 
-        let vmctx = &mut *vmctx;
         let curfds = get_curfds(vmctx);
         let fd = decode_fd(fd);
         let mut host_newoffset = match decode_filesize_byref(vmctx, newoffset) {
@@ -419,14 +409,13 @@ syscalls! {
         return_encoded_errno(e)
     }
 
-    pub unsafe extern "C" fn fd_stat_get(
-        vmctx: *mut VMContext,
+    pub extern "C" fn fd_stat_get(
+        vmctx: &mut VMContext,
         fd: wasm32::__wasi_fd_t,
         buf: wasm32::uintptr_t,
     ) -> wasm32::__wasi_errno_t {
         trace!("fd_stat_get(fd={:?}, buf={:#x?})", fd, buf);
 
-        let vmctx = &mut *vmctx;
         let curfds = get_curfds(vmctx);
         let fd = decode_fd(fd);
         let mut host_buf = match decode_fdstat_byref(vmctx, buf) {
@@ -442,8 +431,8 @@ syscalls! {
         return_encoded_errno(e)
     }
 
-    pub unsafe extern "C" fn fd_stat_put(
-        vmctx: *mut VMContext,
+    pub extern "C" fn fd_stat_put(
+        vmctx: &mut VMContext,
         fd: wasm32::__wasi_fd_t,
         buf: wasm32::uintptr_t,
         flags: wasm32::__wasi_fdsflags_t,
@@ -455,7 +444,6 @@ syscalls! {
             flags
         );
 
-        let vmctx = &mut *vmctx;
         let curfds = get_curfds(vmctx);
         let fd = decode_fd(fd);
         let host_buf = match decode_fdstat_byref(vmctx, buf) {
@@ -469,13 +457,12 @@ syscalls! {
         return_encoded_errno(e)
     }
 
-    pub unsafe extern "C" fn fd_sync(
-        vmctx: *mut VMContext,
+    pub extern "C" fn fd_sync(
+        vmctx: &mut VMContext,
         fd: wasm32::__wasi_fd_t,
     ) -> wasm32::__wasi_errno_t {
         trace!("fd_sync(fd={:?})", fd);
 
-        let vmctx = &mut *vmctx;
         let curfds = get_curfds(vmctx);
         let fd = decode_fd(fd);
 
@@ -484,8 +471,8 @@ syscalls! {
         return_encoded_errno(e)
     }
 
-    pub unsafe extern "C" fn fd_write(
-        vmctx: *mut VMContext,
+    pub extern "C" fn fd_write(
+        vmctx: &mut VMContext,
         fd: wasm32::__wasi_fd_t,
         iovs: wasm32::uintptr_t,
         iovs_len: wasm32::size_t,
@@ -499,7 +486,6 @@ syscalls! {
             nwritten
         );
 
-        let vmctx = &mut *vmctx;
         let curfds = get_curfds(vmctx);
         let fd = decode_fd(fd);
         let iovs = match decode_ciovec_slice(vmctx, iovs, iovs_len) {
@@ -519,8 +505,8 @@ syscalls! {
         return_encoded_errno(e)
     }
 
-    pub unsafe extern "C" fn file_advise(
-        vmctx: *mut VMContext,
+    pub extern "C" fn file_advise(
+        vmctx: &mut VMContext,
         fd: wasm32::__wasi_fd_t,
         offset: wasm32::__wasi_filesize_t,
         len: wasm32::__wasi_filesize_t,
@@ -534,7 +520,6 @@ syscalls! {
             advice
         );
 
-        let vmctx = &mut *vmctx;
         let curfds = get_curfds(vmctx);
         let fd = decode_fd(fd);
         let offset = decode_filesize(offset);
@@ -546,15 +531,14 @@ syscalls! {
         return_encoded_errno(e)
     }
 
-    pub unsafe extern "C" fn file_allocate(
-        vmctx: *mut VMContext,
+    pub extern "C" fn file_allocate(
+        vmctx: &mut VMContext,
         fd: wasm32::__wasi_fd_t,
         offset: wasm32::__wasi_filesize_t,
         len: wasm32::__wasi_filesize_t,
     ) -> wasm32::__wasi_errno_t {
         trace!("file_allocate(fd={:?}, offset={}, len={})", fd, offset, len);
 
-        let vmctx = &mut *vmctx;
         let curfds = get_curfds(vmctx);
         let fd = decode_fd(fd);
         let offset = decode_filesize(offset);
@@ -565,8 +549,8 @@ syscalls! {
         return_encoded_errno(e)
     }
 
-    pub unsafe extern "C" fn file_mkdir(
-        vmctx: *mut VMContext,
+    pub extern "C" fn file_mkdir(
+        vmctx: &mut VMContext,
         fd: wasm32::__wasi_fd_t,
         path: wasm32::uintptr_t,
         path_len: wasm32::size_t,
@@ -578,7 +562,6 @@ syscalls! {
             path_len,
         );
 
-        let vmctx = &mut *vmctx;
         let curfds = get_curfds(vmctx);
         let fd = decode_fd(fd);
         let (path, path_len) = match decode_char_slice(vmctx, path, path_len) {
@@ -591,8 +574,8 @@ syscalls! {
         return_encoded_errno(e)
     }
 
-    pub unsafe extern "C" fn file_link(
-        vmctx: *mut VMContext,
+    pub extern "C" fn file_link(
+        vmctx: &mut VMContext,
         fd0: wasm32::__wasi_fd_t,
         flags0: wasm32::__wasi_lookupflags_t,
         path0: wasm32::uintptr_t,
@@ -612,7 +595,6 @@ syscalls! {
             path_len1
         );
 
-        let vmctx = &mut *vmctx;
         let curfds = get_curfds(vmctx);
         let fd0 = decode_fd(fd0);
         let flags0 = decode_lookupflags(flags0);
@@ -634,8 +616,8 @@ syscalls! {
 
     // TODO: When multi-value happens, switch to that instead of passing
     // the `fd` by reference?
-    pub unsafe extern "C" fn file_open(
-        vmctx: *mut VMContext,
+    pub extern "C" fn file_open(
+        vmctx: &mut VMContext,
         dirfd: wasm32::__wasi_fd_t,
         dirflags: wasm32::__wasi_lookupflags_t,
         path: wasm32::uintptr_t,
@@ -655,7 +637,6 @@ syscalls! {
             fd
         );
 
-        let vmctx = &mut *vmctx;
         let curfds = get_curfds(vmctx);
         let dirfd = decode_fd(dirfd);
         let dirflags = decode_lookupflags(dirflags);
@@ -687,8 +668,8 @@ syscalls! {
         return_encoded_errno(e)
     }
 
-    pub unsafe extern "C" fn file_readdir(
-        vmctx: *mut VMContext,
+    pub extern "C" fn file_readdir(
+        vmctx: &mut VMContext,
         fd: wasm32::__wasi_fd_t,
         buf: wasm32::uintptr_t,
         buf_len: wasm32::size_t,
@@ -704,7 +685,6 @@ syscalls! {
             buf_used,
         );
 
-        let vmctx = &mut *vmctx;
         let curfds = get_curfds(vmctx);
         let fd = decode_fd(fd);
         let (buf, buf_len) = match decode_char_slice(vmctx, buf, buf_len) {
@@ -732,8 +712,8 @@ syscalls! {
         return_encoded_errno(e)
     }
 
-    pub unsafe extern "C" fn file_readlink(
-        vmctx: *mut VMContext,
+    pub extern "C" fn file_readlink(
+        vmctx: &mut VMContext,
         fd: wasm32::__wasi_fd_t,
         path: wasm32::uintptr_t,
         path_len: wasm32::size_t,
@@ -751,7 +731,6 @@ syscalls! {
             buf_used,
         );
 
-        let vmctx = &mut *vmctx;
         let curfds = get_curfds(vmctx);
         let fd = decode_fd(fd);
         let (path, path_len) = match decode_char_slice(vmctx, path, path_len) {
@@ -783,8 +762,8 @@ syscalls! {
         return_encoded_errno(e)
     }
 
-    pub unsafe extern "C" fn file_rename(
-        vmctx: *mut VMContext,
+    pub extern "C" fn file_rename(
+        vmctx: &mut VMContext,
         fd0: wasm32::__wasi_fd_t,
         path0: wasm32::uintptr_t,
         path_len0: wasm32::size_t,
@@ -802,7 +781,6 @@ syscalls! {
             path_len1,
         );
 
-        let vmctx = &mut *vmctx;
         let curfds = get_curfds(vmctx);
         let fd0 = decode_fd(fd0);
         let (path0, path_len0) = match decode_char_slice(vmctx, path0, path_len0) {
@@ -820,14 +798,13 @@ syscalls! {
         return_encoded_errno(e)
     }
 
-    pub unsafe extern "C" fn file_stat_fget(
-        vmctx: *mut VMContext,
+    pub extern "C" fn file_stat_fget(
+        vmctx: &mut VMContext,
         fd: wasm32::__wasi_fd_t,
         buf: wasm32::uintptr_t,
     ) -> wasm32::__wasi_errno_t {
         trace!("file_stat_fget(fd={:?}, buf={:#x?})", fd, buf);
 
-        let vmctx = &mut *vmctx;
         let curfds = get_curfds(vmctx);
         let fd = decode_fd(fd);
         let mut host_buf = match decode_filestat_byref(vmctx, buf) {
@@ -843,8 +820,8 @@ syscalls! {
         return_encoded_errno(e)
     }
 
-    pub unsafe extern "C" fn file_stat_fput(
-        vmctx: *mut VMContext,
+    pub extern "C" fn file_stat_fput(
+        vmctx: &mut VMContext,
         fd: wasm32::__wasi_fd_t,
         buf: wasm32::uintptr_t,
         fsflags: wasm32::__wasi_fsflags_t,
@@ -856,7 +833,6 @@ syscalls! {
             fsflags
         );
 
-        let vmctx = &mut *vmctx;
         let curfds = get_curfds(vmctx);
         let fd = decode_fd(fd);
         let host_buf = match decode_filestat_byref(vmctx, buf) {
@@ -870,8 +846,8 @@ syscalls! {
         return_encoded_errno(e)
     }
 
-    pub unsafe extern "C" fn file_stat_get(
-        vmctx: *mut VMContext,
+    pub extern "C" fn file_stat_get(
+        vmctx: &mut VMContext,
         fd: wasm32::__wasi_fd_t,
         flags: wasm32::__wasi_lookupflags_t,
         path: wasm32::uintptr_t,
@@ -887,7 +863,6 @@ syscalls! {
             buf
         );
 
-        let vmctx = &mut *vmctx;
         let curfds = get_curfds(vmctx);
         let fd = decode_fd(fd);
         let flags = decode_lookupflags(flags);
@@ -908,8 +883,8 @@ syscalls! {
         return_encoded_errno(e)
     }
 
-    pub unsafe extern "C" fn file_stat_put(
-        vmctx: *mut VMContext,
+    pub extern "C" fn file_stat_put(
+        vmctx: &mut VMContext,
         fd: wasm32::__wasi_fd_t,
         flags: wasm32::__wasi_lookupflags_t,
         path: wasm32::uintptr_t,
@@ -927,7 +902,6 @@ syscalls! {
             fsflags
         );
 
-        let vmctx = &mut *vmctx;
         let curfds = get_curfds(vmctx);
         let fd = decode_fd(fd);
         let flags = decode_lookupflags(flags);
@@ -946,8 +920,8 @@ syscalls! {
         return_encoded_errno(e)
     }
 
-    pub unsafe extern "C" fn file_symlink(
-        vmctx: *mut VMContext,
+    pub extern "C" fn file_symlink(
+        vmctx: &mut VMContext,
         path0: wasm32::uintptr_t,
         path_len0: wasm32::size_t,
         fd: wasm32::__wasi_fd_t,
@@ -963,7 +937,6 @@ syscalls! {
             path_len1
         );
 
-        let vmctx = &mut *vmctx;
         let curfds = get_curfds(vmctx);
         let (path0, path_len0) = match decode_char_slice(vmctx, path0, path_len0) {
             Ok((path0, path_len0)) => (path0, path_len0),
@@ -980,8 +953,8 @@ syscalls! {
         return_encoded_errno(e)
     }
 
-    pub unsafe extern "C" fn file_unlink(
-        vmctx: *mut VMContext,
+    pub extern "C" fn file_unlink(
+        vmctx: &mut VMContext,
         fd: wasm32::__wasi_fd_t,
         path: wasm32::uintptr_t,
         path_len: wasm32::size_t,
@@ -995,7 +968,6 @@ syscalls! {
             flags
         );
 
-        let vmctx = &mut *vmctx;
         let curfds = get_curfds(vmctx);
         let fd = decode_fd(fd);
         let (path, path_len) = match decode_char_slice(vmctx, path, path_len) {
@@ -1009,8 +981,8 @@ syscalls! {
         return_encoded_errno(e)
     }
 
-    pub unsafe extern "C" fn poll_oneoff(
-        vmctx: *mut VMContext,
+    pub extern "C" fn poll_oneoff(
+        vmctx: &mut VMContext,
         in_: wasm32::uintptr_t,
         out: wasm32::uintptr_t,
         nsubscriptions: wasm32::size_t,
@@ -1024,7 +996,6 @@ syscalls! {
             nevents,
         );
 
-        let vmctx = &mut *vmctx;
         let curfds = get_curfds(vmctx);
         let in_ = match decode_subscription_slice(vmctx, in_, nsubscriptions) {
             Ok(in_) => in_,
@@ -1063,7 +1034,7 @@ syscalls! {
         return_encoded_errno(e)
     }
 
-    pub unsafe extern "C" fn proc_exit(_vmctx: *mut VMContext, rval: u32,) -> () {
+    pub extern "C" fn proc_exit(_vmctx: &mut VMContext, rval: u32,) -> () {
         trace!("proc_exec(rval={:?})", rval);
 
         let rval = decode_exitcode(rval);
@@ -1074,21 +1045,20 @@ syscalls! {
         panic!("__wasi_proc_exit({})", rval)
     }
 
-    pub unsafe extern "C" fn proc_raise(
-        _vmctx: *mut VMContext,
+    pub extern "C" fn proc_raise(
+        _vmctx: &mut VMContext,
         _sig: wasm32::__wasi_signal_t,
     ) -> wasm32::__wasi_errno_t {
         unimplemented!("__wasi_proc_raise");
     }
 
-    pub unsafe extern "C" fn random_get(
-        vmctx: *mut VMContext,
+    pub extern "C" fn random_get(
+        vmctx: &mut VMContext,
         buf: wasm32::uintptr_t,
         buf_len: wasm32::size_t,
     ) -> wasm32::__wasi_errno_t {
         trace!("random_get(buf={:#x?}, buf_len={:?})", buf, buf_len);
 
-        let vmctx = &mut *vmctx;
         let (buf, buf_len) = match decode_char_slice(vmctx, buf, buf_len) {
             Ok((buf, buf_len)) => (buf, buf_len),
             Err(e) => return return_encoded_errno(e),
@@ -1099,14 +1069,14 @@ syscalls! {
         return_encoded_errno(e)
     }
 
-    pub unsafe extern "C" fn sched_yield(_vmctx: *mut VMContext,) -> wasm32::__wasi_errno_t {
+    pub extern "C" fn sched_yield(_vmctx: &mut VMContext,) -> wasm32::__wasi_errno_t {
         let e = host::wasmtime_ssp_sched_yield();
 
         return_encoded_errno(e)
     }
 
-    pub unsafe extern "C" fn sock_recv(
-        vmctx: *mut VMContext,
+    pub extern "C" fn sock_recv(
+        vmctx: &mut VMContext,
         sock: wasm32::__wasi_fd_t,
         in_: wasm32::uintptr_t,
         out: wasm32::uintptr_t,
@@ -1118,7 +1088,6 @@ syscalls! {
             out
         );
 
-        let vmctx = &mut *vmctx;
         let curfds = get_curfds(vmctx);
         let sock = decode_fd(sock);
         let in_ = match decode_recv_in_byref(vmctx, in_) {
@@ -1139,8 +1108,8 @@ syscalls! {
         return_encoded_errno(e)
     }
 
-    pub unsafe extern "C" fn sock_send(
-        vmctx: *mut VMContext,
+    pub extern "C" fn sock_send(
+        vmctx: &mut VMContext,
         sock: wasm32::__wasi_fd_t,
         in_: wasm32::uintptr_t,
         out: wasm32::uintptr_t,
@@ -1152,7 +1121,6 @@ syscalls! {
             out
         );
 
-        let vmctx = &mut *vmctx;
         let curfds = get_curfds(vmctx);
         let sock = decode_fd(sock);
         let in_ = match decode_send_in_byref(vmctx, in_) {
@@ -1172,14 +1140,13 @@ syscalls! {
         return_encoded_errno(e)
     }
 
-    pub unsafe extern "C" fn sock_shutdown(
-        vmctx: *mut VMContext,
+    pub extern "C" fn sock_shutdown(
+        vmctx: &mut VMContext,
         sock: wasm32::__wasi_fd_t,
         how: wasm32::__wasi_sdflags_t,
     ) -> wasm32::__wasi_errno_t {
         trace!("sock_shutdown(sock={:?}, how={:?})", sock, how);
 
-        let vmctx = &mut *vmctx;
         let curfds = get_curfds(vmctx);
         let sock = decode_fd(sock);
         let how = decode_sdflags(how);