value types now store Rc<RefCell<NonNull<sys::EvalState>>>

This commit is contained in:
do butterflies cry? 2026-03-29 18:29:47 +10:00
parent 07a3b6c0bc
commit 37e78a9052
Signed by: cry
GPG key ID: F68745A836CA0412
11 changed files with 50 additions and 50 deletions

View file

@ -4,16 +4,16 @@ use std::ptr::{self, NonNull};
use std::rc::Rc; use std::rc::Rc;
use super::{NixThunk, NixValue, Value}; use super::{NixThunk, NixValue, Value};
use crate::NixError;
use crate::errors::{ErrorContext, NixideError}; use crate::errors::{ErrorContext, NixideError};
use crate::stdext::{AsCPtr, CCharPtrExt}; use crate::stdext::{AsCPtr, CCharPtrExt};
use crate::sys; use crate::sys;
use crate::util::wrappers::AsInnerPtr; use crate::util::wrappers::AsInnerPtr;
use crate::util::{panic_issue_call_failed, wrap}; use crate::util::{panic_issue_call_failed, wrap};
use crate::{EvalState, NixError};
pub struct NixAttrs { pub struct NixAttrs {
inner: NonNull<sys::nix_value>, inner: NonNull<sys::nix_value>,
state: Rc<RefCell<EvalState>>, state: Rc<RefCell<NonNull<sys::EvalState>>>,
len: u32, len: u32,
} }
@ -61,7 +61,7 @@ impl NixValue for NixAttrs {
sys::ValueType_NIX_TYPE_ATTRS sys::ValueType_NIX_TYPE_ATTRS
} }
fn from(inner: NonNull<sys::nix_value>, state: Rc<RefCell<EvalState>>) -> Self { fn from(inner: NonNull<sys::nix_value>, state: Rc<RefCell<NonNull<sys::EvalState>>>) -> Self {
let len = wrap::nix_fn!(|ctx: &ErrorContext| unsafe { let len = wrap::nix_fn!(|ctx: &ErrorContext| unsafe {
sys::nix_get_attrs_size(ctx.as_ptr(), inner.as_ptr()) sys::nix_get_attrs_size(ctx.as_ptr(), inner.as_ptr())
}) })
@ -88,7 +88,7 @@ impl NixAttrs {
sys::nix_get_attr_byidx( sys::nix_get_attr_byidx(
ctx.as_ptr(), ctx.as_ptr(),
self.as_ptr(), self.as_ptr(),
self.state.borrow().as_ptr(), self.state.borrow_mut().as_ptr(),
index, index,
name_ptr, name_ptr,
) )
@ -115,7 +115,7 @@ impl NixAttrs {
sys::nix_get_attr_byidx_lazy( sys::nix_get_attr_byidx_lazy(
ctx.as_ptr(), ctx.as_ptr(),
self.as_ptr(), self.as_ptr(),
self.state.borrow().as_ptr(), self.state.borrow_mut().as_ptr(),
index, index,
name_ptr, name_ptr,
) )
@ -140,7 +140,7 @@ impl NixAttrs {
sys::nix_get_attr_name_byidx( sys::nix_get_attr_name_byidx(
ctx.as_ptr(), ctx.as_ptr(),
self.as_ptr(), self.as_ptr(),
self.state.borrow().as_ptr(), self.state.borrow_mut().as_ptr(),
index, index,
) )
}) })
@ -161,7 +161,7 @@ impl NixAttrs {
sys::nix_get_attr_byname( sys::nix_get_attr_byname(
ctx.as_ptr(), ctx.as_ptr(),
self.as_ptr(), self.as_ptr(),
self.state.borrow().as_ptr(), self.state.borrow_mut().as_ptr(),
name.as_ref() name.as_ref()
.into_c_ptr() .into_c_ptr()
.unwrap_or_else(|err| panic_issue_call_failed!("{}", err)), .unwrap_or_else(|err| panic_issue_call_failed!("{}", err)),
@ -187,7 +187,7 @@ impl NixAttrs {
sys::nix_get_attr_byname_lazy( sys::nix_get_attr_byname_lazy(
ctx.as_ptr(), ctx.as_ptr(),
self.as_ptr(), self.as_ptr(),
self.state.borrow().as_ptr(), self.state.borrow_mut().as_ptr(),
name.as_ref() name.as_ref()
.into_c_ptr() .into_c_ptr()
.unwrap_or_else(|err| panic_issue_call_failed!("{}", err)), .unwrap_or_else(|err| panic_issue_call_failed!("{}", err)),

View file

@ -5,14 +5,14 @@ use std::rc::Rc;
use super::NixValue; use super::NixValue;
use crate::errors::ErrorContext; use crate::errors::ErrorContext;
use crate::sys;
use crate::util::panic_issue_call_failed; use crate::util::panic_issue_call_failed;
use crate::util::wrap; use crate::util::wrap;
use crate::util::wrappers::AsInnerPtr; use crate::util::wrappers::AsInnerPtr;
use crate::{EvalState, sys};
pub struct NixBool { pub struct NixBool {
inner: NonNull<sys::nix_value>, inner: NonNull<sys::nix_value>,
state: Rc<RefCell<EvalState>>, state: Rc<RefCell<NonNull<sys::EvalState>>>,
value: bool, value: bool,
} }
@ -60,7 +60,7 @@ impl NixValue for NixBool {
sys::ValueType_NIX_TYPE_BOOL sys::ValueType_NIX_TYPE_BOOL
} }
fn from(inner: NonNull<sys::nix_value>, state: Rc<RefCell<EvalState>>) -> Self { fn from(inner: NonNull<sys::nix_value>, state: Rc<RefCell<NonNull<sys::EvalState>>>) -> Self {
let value = wrap::nix_fn!(|ctx: &ErrorContext| unsafe { let value = wrap::nix_fn!(|ctx: &ErrorContext| unsafe {
sys::nix_get_bool(ctx.as_ptr(), inner.as_ptr()) sys::nix_get_bool(ctx.as_ptr(), inner.as_ptr())
}) })

View file

@ -5,13 +5,13 @@ use std::rc::Rc;
use super::NixValue; use super::NixValue;
use crate::errors::ErrorContext; use crate::errors::ErrorContext;
use crate::sys;
use crate::util::wrappers::AsInnerPtr; use crate::util::wrappers::AsInnerPtr;
use crate::util::{panic_issue_call_failed, wrap}; use crate::util::{panic_issue_call_failed, wrap};
use crate::{EvalState, sys};
pub struct NixFloat { pub struct NixFloat {
inner: NonNull<sys::nix_value>, inner: NonNull<sys::nix_value>,
state: Rc<RefCell<EvalState>>, state: Rc<RefCell<NonNull<sys::EvalState>>>,
value: f64, value: f64,
} }
@ -59,7 +59,7 @@ impl NixValue for NixFloat {
sys::ValueType_NIX_TYPE_FLOAT sys::ValueType_NIX_TYPE_FLOAT
} }
fn from(inner: NonNull<sys::nix_value>, state: Rc<RefCell<EvalState>>) -> Self { fn from(inner: NonNull<sys::nix_value>, state: Rc<RefCell<NonNull<sys::EvalState>>>) -> Self {
let value = wrap::nix_fn!(|ctx: &ErrorContext| unsafe { let value = wrap::nix_fn!(|ctx: &ErrorContext| unsafe {
sys::nix_get_float(ctx.as_ptr(), inner.as_ptr()) sys::nix_get_float(ctx.as_ptr(), inner.as_ptr())
}) })

View file

@ -3,16 +3,16 @@ use std::fmt::{Debug, Display, Formatter, Result as FmtResult};
use std::ptr::NonNull; use std::ptr::NonNull;
use std::rc::Rc; use std::rc::Rc;
use super::{NixThunk, NixValue, Value}; use super::{NixValue, Value};
use crate::errors::ErrorContext; use crate::errors::ErrorContext;
use crate::stdext::SliceExt; use crate::stdext::SliceExt;
use crate::sys;
use crate::util::wrappers::AsInnerPtr; use crate::util::wrappers::AsInnerPtr;
use crate::util::{panic_issue_call_failed, wrap}; use crate::util::{panic_issue_call_failed, wrap};
use crate::{EvalState, sys};
pub struct NixFunction { pub struct NixFunction {
inner: NonNull<sys::nix_value>, inner: NonNull<sys::nix_value>,
state: Rc<RefCell<EvalState>>, state: Rc<RefCell<NonNull<sys::EvalState>>>,
value: i64, value: i64,
} }
@ -60,7 +60,7 @@ impl NixValue for NixFunction {
sys::ValueType_NIX_TYPE_FUNCTION sys::ValueType_NIX_TYPE_FUNCTION
} }
fn from(inner: NonNull<sys::nix_value>, state: Rc<RefCell<EvalState>>) -> Self { fn from(inner: NonNull<sys::nix_value>, state: Rc<RefCell<NonNull<sys::EvalState>>>) -> Self {
let value = wrap::nix_fn!(|ctx: &ErrorContext| unsafe { let value = wrap::nix_fn!(|ctx: &ErrorContext| unsafe {
sys::nix_get_int(ctx.as_ptr(), inner.as_ptr()) sys::nix_get_int(ctx.as_ptr(), inner.as_ptr())
}) })

View file

@ -5,13 +5,13 @@ use std::rc::Rc;
use super::NixValue; use super::NixValue;
use crate::errors::ErrorContext; use crate::errors::ErrorContext;
use crate::sys;
use crate::util::wrappers::AsInnerPtr; use crate::util::wrappers::AsInnerPtr;
use crate::util::{panic_issue_call_failed, wrap}; use crate::util::{panic_issue_call_failed, wrap};
use crate::{EvalState, sys};
pub struct NixInt { pub struct NixInt {
inner: NonNull<sys::nix_value>, inner: NonNull<sys::nix_value>,
state: Rc<RefCell<EvalState>>, state: Rc<RefCell<NonNull<sys::EvalState>>>,
value: i64, value: i64,
} }
@ -59,7 +59,7 @@ impl NixValue for NixInt {
sys::ValueType_NIX_TYPE_INT sys::ValueType_NIX_TYPE_INT
} }
fn from(inner: NonNull<sys::nix_value>, state: Rc<RefCell<EvalState>>) -> Self { fn from(inner: NonNull<sys::nix_value>, state: Rc<RefCell<NonNull<sys::EvalState>>>) -> Self {
let value = wrap::nix_fn!(|ctx: &ErrorContext| unsafe { let value = wrap::nix_fn!(|ctx: &ErrorContext| unsafe {
sys::nix_get_int(ctx.as_ptr(), inner.as_ptr()) sys::nix_get_int(ctx.as_ptr(), inner.as_ptr())
}) })

View file

@ -5,14 +5,13 @@ use std::rc::Rc;
use super::{NixThunk, NixValue, Value}; use super::{NixThunk, NixValue, Value};
use crate::errors::ErrorContext; use crate::errors::ErrorContext;
use crate::sys;
use crate::util::wrappers::AsInnerPtr; use crate::util::wrappers::AsInnerPtr;
use crate::util::{panic_issue_call_failed, wrap}; use crate::util::{panic_issue_call_failed, wrap};
use crate::{EvalState, sys};
pub struct NixList { pub struct NixList {
inner: NonNull<sys::nix_value>, inner: NonNull<sys::nix_value>,
state: Rc<RefCell<EvalState>>, state: Rc<RefCell<NonNull<sys::EvalState>>>,
value: i64,
} }
impl Drop for NixList { impl Drop for NixList {
@ -59,17 +58,8 @@ impl NixValue for NixList {
sys::ValueType_NIX_TYPE_LIST sys::ValueType_NIX_TYPE_LIST
} }
fn from(inner: NonNull<sys::nix_value>, state: Rc<RefCell<EvalState>>) -> Self { fn from(inner: NonNull<sys::nix_value>, state: Rc<RefCell<NonNull<sys::EvalState>>>) -> Self {
let value = wrap::nix_fn!(|ctx: &ErrorContext| unsafe { Self { inner, state }
sys::nix_get_int(ctx.as_ptr(), inner.as_ptr())
})
.unwrap_or_else(|err| panic_issue_call_failed!("{}", err));
Self {
inner,
state,
value,
}
} }
} }

View file

@ -45,7 +45,7 @@ pub trait NixValue: Drop + Display + Debug + AsInnerPtr<sys::nix_value> {
fn type_id(&self) -> sys::ValueType; fn type_id(&self) -> sys::ValueType;
/// TODO /// TODO
fn from(inner: NonNull<sys::nix_value>, state: Rc<RefCell<EvalState>>) -> Self; fn from(inner: NonNull<sys::nix_value>, state: Rc<RefCell<NonNull<sys::EvalState>>>) -> Self;
} }
/// A Nix value /// A Nix value
@ -111,8 +111,18 @@ pub enum Value {
// Failed(NixFailed), // Failed(NixFailed),
} }
impl From<(NonNull<sys::nix_value>, Rc<RefCell<EvalState>>)> for Value { impl
fn from(value: (NonNull<sys::nix_value>, Rc<RefCell<EvalState>>)) -> Self { From<(
NonNull<sys::nix_value>,
Rc<RefCell<NonNull<sys::EvalState>>>,
)> for Value
{
fn from(
value: (
NonNull<sys::nix_value>,
Rc<RefCell<NonNull<sys::EvalState>>>,
),
) -> Self {
let (inner, state) = value; let (inner, state) = value;
wrap::nix_fn!(|ctx: &ErrorContext| unsafe { wrap::nix_fn!(|ctx: &ErrorContext| unsafe {
@ -125,6 +135,7 @@ impl From<(NonNull<sys::nix_value>, Rc<RefCell<EvalState>>)> for Value {
}) })
.unwrap_or_else(|err| panic_issue_call_failed!("{}", err)); .unwrap_or_else(|err| panic_issue_call_failed!("{}", err));
#[allow(non_upper_case_globals)]
match type_id { match type_id {
ValueType_NIX_TYPE_THUNK => Value::Thunk(<NixThunk as NixValue>::from(inner, state)), ValueType_NIX_TYPE_THUNK => Value::Thunk(<NixThunk as NixValue>::from(inner, state)),
ValueType_NIX_TYPE_INT => Value::Int(<NixInt as NixValue>::from(inner, state)), ValueType_NIX_TYPE_INT => Value::Int(<NixInt as NixValue>::from(inner, state)),

View file

@ -5,12 +5,12 @@ use std::rc::Rc;
use super::NixValue; use super::NixValue;
use crate::errors::ErrorContext; use crate::errors::ErrorContext;
use crate::sys;
use crate::util::wrappers::AsInnerPtr; use crate::util::wrappers::AsInnerPtr;
use crate::{EvalState, sys};
pub struct NixNull { pub struct NixNull {
inner: NonNull<sys::nix_value>, inner: NonNull<sys::nix_value>,
state: Rc<RefCell<EvalState>>, state: Rc<RefCell<NonNull<sys::EvalState>>>,
} }
impl Drop for NixNull { impl Drop for NixNull {
@ -57,7 +57,7 @@ impl NixValue for NixNull {
sys::ValueType_NIX_TYPE_NULL sys::ValueType_NIX_TYPE_NULL
} }
fn from(inner: NonNull<sys::nix_value>, state: Rc<RefCell<EvalState>>) -> Self { fn from(inner: NonNull<sys::nix_value>, state: Rc<RefCell<NonNull<sys::EvalState>>>) -> Self {
Self { inner, state } Self { inner, state }
} }
} }

View file

@ -7,14 +7,14 @@ use std::rc::Rc;
use super::NixValue; use super::NixValue;
use crate::errors::ErrorContext; use crate::errors::ErrorContext;
use crate::stdext::CCharPtrExt; use crate::stdext::CCharPtrExt;
use crate::sys;
use crate::util::panic_issue_call_failed; use crate::util::panic_issue_call_failed;
use crate::util::wrap; use crate::util::wrap;
use crate::util::wrappers::AsInnerPtr; use crate::util::wrappers::AsInnerPtr;
use crate::{EvalState, sys};
pub struct NixPath { pub struct NixPath {
inner: NonNull<sys::nix_value>, inner: NonNull<sys::nix_value>,
state: Rc<RefCell<EvalState>>, state: Rc<RefCell<NonNull<sys::EvalState>>>,
value: PathBuf, value: PathBuf,
} }
@ -62,7 +62,7 @@ impl NixValue for NixPath {
sys::ValueType_NIX_TYPE_PATH sys::ValueType_NIX_TYPE_PATH
} }
fn from(inner: NonNull<sys::nix_value>, state: Rc<RefCell<EvalState>>) -> Self { fn from(inner: NonNull<sys::nix_value>, state: Rc<RefCell<NonNull<sys::EvalState>>>) -> Self {
let value = wrap::nix_fn!(|ctx: &ErrorContext| unsafe { let value = wrap::nix_fn!(|ctx: &ErrorContext| unsafe {
sys::nix_get_path_string(ctx.as_ptr(), inner.as_ptr()) sys::nix_get_path_string(ctx.as_ptr(), inner.as_ptr())
}) })

View file

@ -6,14 +6,14 @@ use std::rc::Rc;
use super::NixValue; use super::NixValue;
use crate::errors::ErrorContext; use crate::errors::ErrorContext;
use crate::sys;
use crate::util::panic_issue_call_failed; use crate::util::panic_issue_call_failed;
use crate::util::wrap; use crate::util::wrap;
use crate::util::wrappers::AsInnerPtr; use crate::util::wrappers::AsInnerPtr;
use crate::{EvalState, sys};
pub struct NixString { pub struct NixString {
inner: NonNull<sys::nix_value>, inner: NonNull<sys::nix_value>,
state: Rc<RefCell<EvalState>>, state: Rc<RefCell<NonNull<sys::EvalState>>>,
value: String, value: String,
} }
@ -61,7 +61,7 @@ impl NixValue for NixString {
sys::ValueType_NIX_TYPE_STRING sys::ValueType_NIX_TYPE_STRING
} }
fn from(inner: NonNull<sys::nix_value>, state: Rc<RefCell<EvalState>>) -> Self { fn from(inner: NonNull<sys::nix_value>, state: Rc<RefCell<NonNull<sys::EvalState>>>) -> Self {
let value = wrap::nix_string_callback!( let value = wrap::nix_string_callback!(
|callback, userdata: *mut __UserData, ctx: &ErrorContext| unsafe { |callback, userdata: *mut __UserData, ctx: &ErrorContext| unsafe {
sys::nix_get_string( sys::nix_get_string(

View file

@ -4,7 +4,6 @@ use std::ptr::NonNull;
use std::rc::Rc; use std::rc::Rc;
use super::{NixValue, Value}; use super::{NixValue, Value};
use crate::EvalState;
use crate::errors::ErrorContext; use crate::errors::ErrorContext;
use crate::sys; use crate::sys;
use crate::util::wrappers::AsInnerPtr; use crate::util::wrappers::AsInnerPtr;
@ -12,7 +11,7 @@ use crate::util::{panic_issue_call_failed, wrap};
pub struct NixThunk { pub struct NixThunk {
inner: NonNull<sys::nix_value>, inner: NonNull<sys::nix_value>,
state: Rc<RefCell<EvalState>>, state: Rc<RefCell<NonNull<sys::EvalState>>>,
} }
impl Drop for NixThunk { impl Drop for NixThunk {
@ -59,7 +58,7 @@ impl NixValue for NixThunk {
sys::ValueType_NIX_TYPE_THUNK sys::ValueType_NIX_TYPE_THUNK
} }
fn from(inner: NonNull<sys::nix_value>, state: Rc<RefCell<EvalState>>) -> Self { fn from(inner: NonNull<sys::nix_value>, state: Rc<RefCell<NonNull<sys::EvalState>>>) -> Self {
Self { inner, state } Self { inner, state }
} }
} }