Skip to content

Commit cc71092

Browse files
committed
Use memoffset crate instead of implementing our own offsetof
This avoids using `core::mem::uninitialized`. Fixes #2.
1 parent ca672e9 commit cc71092

File tree

3 files changed

+20
-32
lines changed

3 files changed

+20
-32
lines changed

Cargo.lock

Lines changed: 18 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ version = "0.1.0"
1212
travis-ci = { repository = "fitzgen/wee_alloc" }
1313

1414
[dependencies]
15+
memoffset = "0.5.5"
1516
unreachable = "1.0.0"
1617

1718
[dev-dependencies]

src/lib.rs

Lines changed: 1 addition & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -282,26 +282,7 @@ macro_rules! impl_intrusive_node {
282282
unsafe fn node_to_elem(
283283
node: & $intrusive_node_lifetime $crate::Node< $intrusive_node_lifetime >
284284
) -> & $intrusive_node_lifetime Self::Elem {
285-
let s: Self::Elem = $crate::uninitialized();
286-
287-
let offset = {
288-
let base = &s as *const _ as usize;
289-
290-
// XXX: We are careful not to deref the uninitialized data
291-
// by using irrefutable let patterns instead of `s.$node`.
292-
let Self::Elem { ref $node, .. } = s;
293-
294-
// Annotate with explicit types here so that compilation
295-
// will fail if someone uses this macro with a non-Node
296-
// field of `Self::Elem`.
297-
let $node: &$crate::Node = $node;
298-
let field = $node as *const $crate::Node as usize;
299-
300-
field - base
301-
};
302-
303-
// Don't run destructors on uninitialized data.
304-
$crate::forget(s);
285+
let offset = memoffset::offset_of!(Self::Elem, $node);
305286

306287
let node = node as *const _ as *const u8;
307288
let elem = node.offset(-(offset as isize)) as *const Self::Elem;
@@ -311,18 +292,6 @@ macro_rules! impl_intrusive_node {
311292
}
312293
}
313294

314-
#[doc(hidden)]
315-
#[inline(always)]
316-
pub unsafe fn uninitialized<T>() -> T {
317-
core::mem::uninitialized()
318-
}
319-
320-
#[doc(hidden)]
321-
#[inline(always)]
322-
pub unsafe fn forget<T>(t: T) {
323-
core::mem::forget(t);
324-
}
325-
326295
/// A total ordering between the `Self` type and the tree's element type
327296
/// `T::Elem`.
328297
///

0 commit comments

Comments
 (0)