refactor(tvix/eval): move unwrap_or_clone_rc to lib module

This is more generally useful than just inside the VM, until it is
stabilised in Rust itself.

Change-Id: Id9aa3d5b533ff38e3d2c6b85ad484394fdd05dcf
Reviewed-on: https://cl.tvl.fyi/c/depot/+/7186
Tested-by: BuildkiteCI
Autosubmit: tazjin <tazjin@tvl.su>
Reviewed-by: grfn <grfn@gws.fyi>
Reviewed-by: Adam Joseph <adam@westernsemico.com>
This commit is contained in:
Vincent Ambo 2022-11-05 14:57:33 +03:00 committed by tazjin
parent 116c8d81c6
commit c877e1d920
2 changed files with 9 additions and 6 deletions

View file

@ -22,6 +22,8 @@ mod test_utils;
#[cfg(test)] #[cfg(test)]
mod tests; mod tests;
use std::rc::Rc;
// Re-export the public interface used by other crates. // Re-export the public interface used by other crates.
pub use crate::builtins::global_builtins; pub use crate::builtins::global_builtins;
pub use crate::compiler::{compile, prepare_globals}; pub use crate::compiler::{compile, prepare_globals};
@ -31,3 +33,9 @@ pub use crate::pretty_ast::pretty_print_expr;
pub use crate::source::SourceCode; pub use crate::source::SourceCode;
pub use crate::value::Value; pub use crate::value::Value;
pub use crate::vm::run_lambda; pub use crate::vm::run_lambda;
// TODO: use Rc::unwrap_or_clone once it is stabilised.
// https://doc.rust-lang.org/std/rc/struct.Rc.html#method.unwrap_or_clone
pub fn unwrap_or_clone_rc<T: Clone>(rc: Rc<T>) -> T {
Rc::try_unwrap(rc).unwrap_or_else(|rc| (*rc).clone())
}

View file

@ -10,6 +10,7 @@ use crate::{
nix_search_path::NixSearchPath, nix_search_path::NixSearchPath,
observer::RuntimeObserver, observer::RuntimeObserver,
opcode::{CodeIdx, Count, JumpOffset, OpCode, StackIdx, UpvalueIdx}, opcode::{CodeIdx, Count, JumpOffset, OpCode, StackIdx, UpvalueIdx},
unwrap_or_clone_rc,
upvalues::Upvalues, upvalues::Upvalues,
value::{Builtin, Closure, CoercionKind, Lambda, NixAttrs, NixList, Thunk, Value}, value::{Builtin, Closure, CoercionKind, Lambda, NixAttrs, NixList, Thunk, Value},
warnings::{EvalWarning, WarningKind}, warnings::{EvalWarning, WarningKind},
@ -884,12 +885,6 @@ impl<'o> VM<'o> {
} }
} }
// TODO: use Rc::unwrap_or_clone once it is stabilised.
// https://doc.rust-lang.org/std/rc/struct.Rc.html#method.unwrap_or_clone
fn unwrap_or_clone_rc<T: Clone>(rc: Rc<T>) -> T {
Rc::try_unwrap(rc).unwrap_or_else(|rc| (*rc).clone())
}
pub fn run_lambda( pub fn run_lambda(
nix_search_path: NixSearchPath, nix_search_path: NixSearchPath,
observer: &mut dyn RuntimeObserver, observer: &mut dyn RuntimeObserver,