diff --git a/nixide/src/expr/evalstate.rs b/nixide/src/expr/eval_state.rs similarity index 77% rename from nixide/src/expr/evalstate.rs rename to nixide/src/expr/eval_state.rs index 4696549..3818d1a 100644 --- a/nixide/src/expr/evalstate.rs +++ b/nixide/src/expr/eval_state.rs @@ -1,10 +1,12 @@ +use std::cell::RefCell; use std::ffi::CString; use std::ptr::NonNull; +use std::rc::Rc; use std::sync::Arc; use crate::errors::new_nixide_error; -use super::{NixValue, Value}; +use super::Value; use crate::errors::ErrorContext; use crate::sys; use crate::util::wrappers::AsInnerPtr; @@ -16,7 +18,7 @@ use crate::{NixideResult, Store}; /// This provides the main interface for evaluating Nix expressions /// and creating values. pub struct EvalState { - inner: NonNull, + inner: Rc>>, // XXX: TODO: is an `Arc` necessary or just a `Store` store: Arc, @@ -25,24 +27,32 @@ pub struct EvalState { impl AsInnerPtr for EvalState { #[inline] unsafe fn as_ptr(&self) -> *mut sys::EvalState { - self.inner.as_ptr() + self.inner.borrow().as_ptr() } #[inline] unsafe fn as_ref(&self) -> &sys::EvalState { - unsafe { self.inner.as_ref() } + unsafe { self.inner.borrow().as_ref() } } #[inline] unsafe fn as_mut(&mut self) -> &mut sys::EvalState { - unsafe { self.inner.as_mut() } + unsafe { self.inner.borrow_mut().as_mut() } } } impl EvalState { /// Construct a new EvalState directly from its attributes pub(super) fn new(inner: NonNull, store: Arc) -> Self { - Self { inner, store } + Self { + inner: Rc::new(RefCell::new(inner)), + store, + } + } + + #[inline] + pub(crate) fn inner_ref(&self) -> Rc>> { + self.inner.clone() } #[inline] @@ -82,22 +92,7 @@ impl EvalState { ); value }) - .map(|ptr| Value::from((ptr, std::rc::Rc::new(std::cell::RefCell::new(self))))) - } - - /// Allocate a new value. - /// - /// # Errors - /// - /// Returns an error if value allocation fails. - pub(self) fn new_value(&self) -> NixideResult { - // XXX: TODO: should this function be `Value::new` instead? - let inner = wrap::nix_ptr_fn!(|ctx: &ErrorContext| unsafe { - sys::nix_alloc_value(ctx.as_ptr(), self.as_ptr()) - })?; - - // Ok(Value::from((inner, self))) - todo!() + .map(|ptr| Value::from((ptr, self.inner_ref()))) } } diff --git a/nixide/src/expr/evalstatebuilder.rs b/nixide/src/expr/eval_state_builder.rs similarity index 93% rename from nixide/src/expr/evalstatebuilder.rs rename to nixide/src/expr/eval_state_builder.rs index 1c6d34c..de2672b 100644 --- a/nixide/src/expr/evalstatebuilder.rs +++ b/nixide/src/expr/eval_state_builder.rs @@ -129,13 +129,14 @@ impl EvalStateBuilder { .map(|()| self); // ensure all allocated memory is dropped - unsafe { - Vec::from_raw_parts(ptr, paths_len, paths_capacity) - .into_iter() - .map(|p| { - _ = CString::from_raw(p as *mut c_char); - }) - }; + // XXX: TODO!! + // unsafe { + // Vec::from_raw_parts(ptr, paths_len, paths_capacity) + // .into_iter() + // .map(|p| { + // _ = CString::from_raw(p as *mut c_char); + // }) + // }; result } diff --git a/nixide/src/expr/mod.rs b/nixide/src/expr/mod.rs index 57f6808..6865d5b 100644 --- a/nixide/src/expr/mod.rs +++ b/nixide/src/expr/mod.rs @@ -1,12 +1,12 @@ #[cfg(test)] mod tests; -mod evalstate; -mod evalstatebuilder; +mod eval_state; +mod eval_state_builder; mod realised_string; mod values; -pub use evalstate::EvalState; -pub use evalstatebuilder::EvalStateBuilder; +pub use eval_state::EvalState; +pub use eval_state_builder::EvalStateBuilder; pub use realised_string::RealisedString; pub use values::*;