mirror of
https://github.com/fluencelabs/wasmer
synced 2025-03-16 00:00:49 +00:00
fix Drop of uninit Ctx; use MaybeUninit
This commit is contained in:
parent
b8ea3edec1
commit
3c952f307e
@ -16,7 +16,7 @@ use crate::{
|
||||
vm::{self, InternalField},
|
||||
};
|
||||
use smallvec::{smallvec, SmallVec};
|
||||
use std::{mem, ptr::NonNull, sync::Arc};
|
||||
use std::{mem, pin::Pin, ptr::NonNull, sync::Arc};
|
||||
|
||||
pub(crate) struct InstanceInner {
|
||||
#[allow(dead_code)]
|
||||
@ -41,7 +41,7 @@ impl Drop for InstanceInner {
|
||||
/// [`ImportObject`]: struct.ImportObject.html
|
||||
pub struct Instance {
|
||||
pub module: Arc<ModuleInner>,
|
||||
inner: Box<InstanceInner>,
|
||||
inner: Pin<Box<InstanceInner>>,
|
||||
#[allow(dead_code)]
|
||||
import_object: ImportObject,
|
||||
}
|
||||
@ -51,32 +51,32 @@ impl Instance {
|
||||
// We need the backing and import_backing to create a vm::Ctx, but we need
|
||||
// a vm::Ctx to create a backing and an import_backing. The solution is to create an
|
||||
// uninitialized vm::Ctx and then initialize it in-place.
|
||||
let mut vmctx = unsafe { Box::new(mem::uninitialized()) };
|
||||
let mut vmctx: Box<mem::MaybeUninit<vm::Ctx>> =
|
||||
Box::new(mem::MaybeUninit::<vm::Ctx>::zeroed());
|
||||
|
||||
let import_backing = ImportBacking::new(&module, &imports, &mut *vmctx)?;
|
||||
let backing = LocalBacking::new(&module, &import_backing, &mut *vmctx);
|
||||
let import_backing = ImportBacking::new(&module, &imports, vmctx.as_mut_ptr())?;
|
||||
let backing = LocalBacking::new(&module, &import_backing, vmctx.as_mut_ptr());
|
||||
|
||||
// When Pin is stablized, this will use `Box::pinned` instead of `Box::new`.
|
||||
let mut inner = Box::new(InstanceInner {
|
||||
let mut inner = Box::pin(InstanceInner {
|
||||
backing,
|
||||
import_backing,
|
||||
vmctx: Box::leak(vmctx),
|
||||
vmctx: vmctx.as_mut_ptr(),
|
||||
});
|
||||
|
||||
// Initialize the vm::Ctx in-place after the backing
|
||||
// has been boxed.
|
||||
unsafe {
|
||||
*inner.vmctx = match imports.call_state_creator() {
|
||||
Some((data, dtor)) => vm::Ctx::new_with_data(
|
||||
&mut inner.backing,
|
||||
&mut inner.import_backing,
|
||||
&module,
|
||||
data,
|
||||
dtor,
|
||||
),
|
||||
None => vm::Ctx::new(&mut inner.backing, &mut inner.import_backing, &module),
|
||||
let backing = &mut *(&mut inner.backing as *mut _);
|
||||
let import_backing = &mut *(&mut inner.import_backing as *mut _);
|
||||
let real_ctx = match imports.call_state_creator() {
|
||||
Some((data, dtor)) => {
|
||||
vm::Ctx::new_with_data(backing, import_backing, &module, data, dtor)
|
||||
}
|
||||
None => vm::Ctx::new(backing, import_backing, &module),
|
||||
};
|
||||
vmctx.as_mut_ptr().write(real_ctx);
|
||||
};
|
||||
Box::leak(vmctx);
|
||||
|
||||
let instance = Instance {
|
||||
module,
|
||||
|
Loading…
x
Reference in New Issue
Block a user