From: Mark Thom Date: Thu, 13 Feb 2020 06:52:30 +0000 (-0700) Subject: allow the frontier of the RawVec to be offset by a trait function X-Git-Tag: v0.8.118~8 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=1c4e2c0ed6a425cec717612932e0574feb3708e2;p=scryer-prolog.git allow the frontier of the RawVec to be offset by a trait function --- diff --git a/src/prolog/machine/raw_vec.rs b/src/prolog/machine/raw_vec.rs index d902d4cf..f482dfa4 100644 --- a/src/prolog/machine/raw_vec.rs +++ b/src/prolog/machine/raw_vec.rs @@ -7,6 +7,7 @@ use std::ptr; pub(crate) trait RawVecTraits { fn init_size() -> usize; fn align() -> usize; + fn base_offset(base: *const u8) -> *const u8; } pub(crate) struct RawVec { @@ -24,7 +25,7 @@ impl RawVec { top: ptr::null(), _marker: PhantomData }; - unsafe { + unsafe { vec.grow(); } @@ -39,11 +40,11 @@ impl RawVec { self.base = alloc::alloc(layout) as *const _; self.size = T::init_size(); - self.top = self.base.offset(T::align() as isize); + self.top = T::base_offset(self.base); } else { let layout = alloc::Layout::from_size_align_unchecked(T::init_size(), T::align()); let top_dist = self.top as usize - self.base as usize; - + self.base = alloc::realloc(self.base as *mut _, layout, self.size*2) as *const _; self.top = (self.base as usize + top_dist) as *const _; self.size *= 2; @@ -75,10 +76,10 @@ impl RawVec { #[inline] pub(crate) - unsafe fn new_block(&mut self, block_size: usize) -> *const u8 { + unsafe fn new_block(&mut self, size: usize) -> *const u8 { loop { - if self.free_space() >= block_size { - return (self.top as usize + block_size) as *const _; + if self.free_space() >= size { + return (self.top as usize + size) as *const _; } else { self.grow(); } @@ -96,5 +97,5 @@ impl RawVec { self.base = ptr::null(); self.size = 0; } - } + } } diff --git a/src/prolog/machine/stack.rs b/src/prolog/machine/stack.rs index 15b96ad9..5dca3cee 100644 --- a/src/prolog/machine/stack.rs +++ b/src/prolog/machine/stack.rs @@ -19,6 +19,13 @@ impl RawVecTraits for StackTraits { fn align() -> usize { mem::align_of::() } + + #[inline] + fn base_offset(base: *const u8) -> *const u8 { + unsafe { + base.offset(Self::align() as isize) + } + } } const fn prelude_size() -> usize {