Merge branch 'master' into simd

This commit is contained in:
nlewycky
2019-07-24 14:44:52 -07:00
committed by GitHub

View File

@ -58,6 +58,20 @@ pub struct Ctx {
pub data_finalizer: Option<fn(data: *mut c_void)>, pub data_finalizer: Option<fn(data: *mut c_void)>,
} }
/// When an instance context is destructed, we're calling its `data_finalizer`
/// In order avoid leaking resources.
///
/// Implementing the `data_finalizer` function is the responsibility of the `wasmer` end-user.
///
/// See test: `test_data_finalizer` as an example
impl Drop for Ctx {
fn drop(&mut self) {
if let Some(ref finalizer) = self.data_finalizer {
finalizer(self.data);
}
}
}
/// The internal context of the currently running WebAssembly instance. /// The internal context of the currently running WebAssembly instance.
/// ///
/// ///
@ -749,14 +763,24 @@ mod vm_ctx_tests {
x: u32, x: u32,
y: bool, y: bool,
str: String, str: String,
finalizer: Box<FnMut()>,
}
impl Drop for TestData {
fn drop(&mut self) {
(*self.finalizer)();
}
} }
fn test_data_finalizer(data: *mut c_void) { fn test_data_finalizer(data: *mut c_void) {
let test_data: &mut TestData = unsafe { &mut *(data as *mut TestData) }; let test_data: &mut TestData = unsafe { &mut *(data as *mut TestData) };
assert_eq!(test_data.x, 10);
assert_eq!(test_data.y, true); assert_eq!(10, test_data.x);
assert_eq!(test_data.str, "Test".to_string()); assert_eq!(true, test_data.y);
assert_eq!("Test".to_string(), test_data.str,);
println!("hello from finalizer"); println!("hello from finalizer");
drop(test_data); drop(test_data);
} }
@ -766,7 +790,9 @@ mod vm_ctx_tests {
x: 10, x: 10,
y: true, y: true,
str: "Test".to_string(), str: "Test".to_string(),
finalizer: Box::new(move || {}),
}; };
let mut local_backing = LocalBacking { let mut local_backing = LocalBacking {
memories: Map::new().into_boxed_map(), memories: Map::new().into_boxed_map(),
tables: Map::new().into_boxed_map(), tables: Map::new().into_boxed_map(),
@ -781,6 +807,7 @@ mod vm_ctx_tests {
internals: crate::backing::Internals([0; crate::backing::INTERNALS_SIZE]), internals: crate::backing::Internals([0; crate::backing::INTERNALS_SIZE]),
}; };
let mut import_backing = ImportBacking { let mut import_backing = ImportBacking {
memories: Map::new().into_boxed_map(), memories: Map::new().into_boxed_map(),
tables: Map::new().into_boxed_map(), tables: Map::new().into_boxed_map(),
@ -791,21 +818,24 @@ mod vm_ctx_tests {
vm_tables: Map::new().into_boxed_map(), vm_tables: Map::new().into_boxed_map(),
vm_globals: Map::new().into_boxed_map(), vm_globals: Map::new().into_boxed_map(),
}; };
let module = generate_module(); let module = generate_module();
let data = &mut data as *mut _ as *mut c_void; let data_ptr = &mut data as *mut _ as *mut c_void;
let ctx = unsafe { let ctx = unsafe {
Ctx::new_with_data( Ctx::new_with_data(
&mut local_backing, &mut local_backing,
&mut import_backing, &mut import_backing,
&module, &module,
data, data_ptr,
test_data_finalizer, test_data_finalizer,
) )
}; };
let ctx_test_data = cast_test_data(ctx.data); let ctx_test_data = cast_test_data(ctx.data);
assert_eq!(ctx_test_data.x, 10); assert_eq!(10, ctx_test_data.x);
assert_eq!(ctx_test_data.y, true); assert_eq!(true, ctx_test_data.y);
assert_eq!(ctx_test_data.str, "Test".to_string()); assert_eq!("Test".to_string(), ctx_test_data.str);
drop(ctx); drop(ctx);
} }