Skip to content

Commit

Permalink
Merge branch 'master' into feat-c-api-update-wasm-h
Browse files Browse the repository at this point in the history
  • Loading branch information
Hywan committed Oct 12, 2020
2 parents 2023016 + bb9149b commit bf389f9
Showing 1 changed file with 31 additions and 2 deletions.
33 changes: 31 additions & 2 deletions lib/c-api/src/wasm_c_api/types/export.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@ use wasmer::ExportType;
pub struct wasm_exporttype_t {
name: NonNull<wasm_name_t>,
extern_type: NonNull<wasm_externtype_t>,

/// If `true`, `name` and `extern_type` will be dropped by
/// `wasm_exporttype_t::drop`.
owns_fields: bool,
}

wasm_declare_boxed_vec!(exporttype);
Expand All @@ -15,7 +19,11 @@ pub extern "C" fn wasm_exporttype_new(
name: NonNull<wasm_name_t>,
extern_type: NonNull<wasm_externtype_t>,
) -> Box<wasm_exporttype_t> {
Box::new(wasm_exporttype_t { name, extern_type })
Box::new(wasm_exporttype_t {
name,
extern_type,
owns_fields: false,
})
}

#[no_mangle]
Expand All @@ -30,6 +38,23 @@ pub extern "C" fn wasm_exporttype_type(
unsafe { et.extern_type.as_ref() }
}

#[no_mangle]
pub extern "C" fn wasm_exporttype_delete(_exporttype: Option<Box<wasm_exporttype_t>>) {}

impl Drop for wasm_exporttype_t {
fn drop(&mut self) {
if self.owns_fields {
// SAFETY: `owns_fields` is set to `true` only in
// `wasm_exporttype_t::from(&ExportType)`, where the data
// are leaked properly and won't be freed somewhere else.
unsafe {
let _ = Box::from_raw(self.name.as_ptr());
let _ = Box::from_raw(self.extern_type.as_ptr());
}
}
}
}

impl From<ExportType> for wasm_exporttype_t {
fn from(other: ExportType) -> Self {
(&other).into()
Expand All @@ -56,6 +81,10 @@ impl From<&ExportType> for wasm_exporttype_t {
unsafe { NonNull::new_unchecked(Box::into_raw(Box::new(extern_type))) }
};

wasm_exporttype_t { name, extern_type }
wasm_exporttype_t {
name,
extern_type,
owns_fields: true,
}
}
}

0 comments on commit bf389f9

Please sign in to comment.