refactor(tvix/eval) s/NixPath/NixSearchPath/
Since NixString is the Rust type for nix strings, people might mistake NixPath for the Rust type of nix paths, which it is not. Let's call it NixSearchPath instead. Signed-off-by: Adam Joseph <adam@westernsemico.com> Change-Id: Ib2ea155c4b27cb90d6180a04ea7b951d86607373 Reviewed-on: https://cl.tvl.fyi/c/depot/+/6927 Reviewed-by: kanepyork <rikingcoding@gmail.com> Tested-by: BuildkiteCI Reviewed-by: tazjin <tazjin@tvl.su>
This commit is contained in:
		
							parent
							
								
									04fccd89a5
								
							
						
					
					
						commit
						32ac7d6c6d
					
				
					 5 changed files with 49 additions and 46 deletions
				
			
		| 
						 | 
					@ -3,7 +3,7 @@ use std::{cell::RefCell, path::PathBuf, rc::Rc};
 | 
				
			||||||
use crate::{
 | 
					use crate::{
 | 
				
			||||||
    builtins::global_builtins,
 | 
					    builtins::global_builtins,
 | 
				
			||||||
    errors::{Error, ErrorKind, EvalResult},
 | 
					    errors::{Error, ErrorKind, EvalResult},
 | 
				
			||||||
    nix_path::NixPath,
 | 
					    nix_search_path::NixSearchPath,
 | 
				
			||||||
    observer::{DisassemblingObserver, NoOpObserver, TracingObserver},
 | 
					    observer::{DisassemblingObserver, NoOpObserver, TracingObserver},
 | 
				
			||||||
    value::Value,
 | 
					    value::Value,
 | 
				
			||||||
    SourceCode,
 | 
					    SourceCode,
 | 
				
			||||||
| 
						 | 
					@ -27,7 +27,7 @@ pub struct Options {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /// A colon-separated list of directories to use to resolve `<...>`-style paths
 | 
					    /// A colon-separated list of directories to use to resolve `<...>`-style paths
 | 
				
			||||||
    #[cfg_attr(feature = "repl", clap(long, short = 'I', env = "NIX_PATH"))]
 | 
					    #[cfg_attr(feature = "repl", clap(long, short = 'I', env = "NIX_PATH"))]
 | 
				
			||||||
    nix_path: Option<NixPath>,
 | 
					    nix_search_path: Option<NixSearchPath>,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pub fn interpret(code: &str, location: Option<PathBuf>, options: Options) -> EvalResult<Value> {
 | 
					pub fn interpret(code: &str, location: Option<PathBuf>, options: Options) -> EvalResult<Value> {
 | 
				
			||||||
| 
						 | 
					@ -111,13 +111,13 @@ pub fn interpret(code: &str, location: Option<PathBuf>, options: Options) -> Eva
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let result = if options.trace_runtime {
 | 
					    let result = if options.trace_runtime {
 | 
				
			||||||
        crate::vm::run_lambda(
 | 
					        crate::vm::run_lambda(
 | 
				
			||||||
            options.nix_path.unwrap_or_default(),
 | 
					            options.nix_search_path.unwrap_or_default(),
 | 
				
			||||||
            &mut TracingObserver::new(std::io::stderr()),
 | 
					            &mut TracingObserver::new(std::io::stderr()),
 | 
				
			||||||
            result.lambda,
 | 
					            result.lambda,
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        crate::vm::run_lambda(
 | 
					        crate::vm::run_lambda(
 | 
				
			||||||
            options.nix_path.unwrap_or_default(),
 | 
					            options.nix_search_path.unwrap_or_default(),
 | 
				
			||||||
            &mut NoOpObserver::default(),
 | 
					            &mut NoOpObserver::default(),
 | 
				
			||||||
            result.lambda,
 | 
					            result.lambda,
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -12,7 +12,7 @@ mod value;
 | 
				
			||||||
mod vm;
 | 
					mod vm;
 | 
				
			||||||
mod warnings;
 | 
					mod warnings;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
mod nix_path;
 | 
					mod nix_search_path;
 | 
				
			||||||
#[cfg(test)]
 | 
					#[cfg(test)]
 | 
				
			||||||
mod properties;
 | 
					mod properties;
 | 
				
			||||||
#[cfg(test)]
 | 
					#[cfg(test)]
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -6,11 +6,11 @@ use std::str::FromStr;
 | 
				
			||||||
use crate::errors::ErrorKind;
 | 
					use crate::errors::ErrorKind;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#[derive(Debug, Clone, PartialEq, Eq)]
 | 
					#[derive(Debug, Clone, PartialEq, Eq)]
 | 
				
			||||||
enum NixPathEntry {
 | 
					enum NixSearchPathEntry {
 | 
				
			||||||
    /// Resolve subdirectories of this path within `<...>` brackets. This
 | 
					    /// Resolve subdirectories of this path within `<...>` brackets. This
 | 
				
			||||||
    /// corresponds to bare paths within the `NIX_PATH` environment variable
 | 
					    /// corresponds to bare paths within the `NIX_PATH` environment variable
 | 
				
			||||||
    ///
 | 
					    ///
 | 
				
			||||||
    /// For example, with `NixPathEntry::Path("/example")` and the following
 | 
					    /// For example, with `NixSearchPathEntry::Path("/example")` and the following
 | 
				
			||||||
    /// directory structure:
 | 
					    /// directory structure:
 | 
				
			||||||
    ///
 | 
					    ///
 | 
				
			||||||
    /// ```notrust
 | 
					    /// ```notrust
 | 
				
			||||||
| 
						 | 
					@ -27,7 +27,7 @@ enum NixPathEntry {
 | 
				
			||||||
    /// Resolve paths starting with `prefix` as subdirectories of `path`. This
 | 
					    /// Resolve paths starting with `prefix` as subdirectories of `path`. This
 | 
				
			||||||
    /// corresponds to `prefix=path` within the `NIX_PATH` environment variable.
 | 
					    /// corresponds to `prefix=path` within the `NIX_PATH` environment variable.
 | 
				
			||||||
    ///
 | 
					    ///
 | 
				
			||||||
    /// For example, with `NixPathEntry::Prefix { prefix: "prefix", path:
 | 
					    /// For example, with `NixSearchPathEntry::Prefix { prefix: "prefix", path:
 | 
				
			||||||
    /// "/example" }` and the following directory structure:
 | 
					    /// "/example" }` and the following directory structure:
 | 
				
			||||||
    ///
 | 
					    ///
 | 
				
			||||||
    /// ```notrust
 | 
					    /// ```notrust
 | 
				
			||||||
| 
						 | 
					@ -42,7 +42,7 @@ enum NixPathEntry {
 | 
				
			||||||
    Prefix { prefix: PathBuf, path: PathBuf },
 | 
					    Prefix { prefix: PathBuf, path: PathBuf },
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
impl NixPathEntry {
 | 
					impl NixSearchPathEntry {
 | 
				
			||||||
    fn resolve(&self, lookup_path: &Path) -> io::Result<Option<PathBuf>> {
 | 
					    fn resolve(&self, lookup_path: &Path) -> io::Result<Option<PathBuf>> {
 | 
				
			||||||
        let resolve_in =
 | 
					        let resolve_in =
 | 
				
			||||||
            |parent: &Path, lookup_path: &Path| match parent.join(lookup_path).canonicalize() {
 | 
					            |parent: &Path, lookup_path: &Path| match parent.join(lookup_path).canonicalize() {
 | 
				
			||||||
| 
						 | 
					@ -52,8 +52,8 @@ impl NixPathEntry {
 | 
				
			||||||
            };
 | 
					            };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        match self {
 | 
					        match self {
 | 
				
			||||||
            NixPathEntry::Path(p) => resolve_in(p, lookup_path),
 | 
					            NixSearchPathEntry::Path(p) => resolve_in(p, lookup_path),
 | 
				
			||||||
            NixPathEntry::Prefix { prefix, path } => {
 | 
					            NixSearchPathEntry::Prefix { prefix, path } => {
 | 
				
			||||||
                if let Ok(child_path) = lookup_path.strip_prefix(prefix) {
 | 
					                if let Ok(child_path) = lookup_path.strip_prefix(prefix) {
 | 
				
			||||||
                    resolve_in(path, child_path)
 | 
					                    resolve_in(path, child_path)
 | 
				
			||||||
                } else {
 | 
					                } else {
 | 
				
			||||||
| 
						 | 
					@ -64,7 +64,7 @@ impl NixPathEntry {
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
impl FromStr for NixPathEntry {
 | 
					impl FromStr for NixSearchPathEntry {
 | 
				
			||||||
    type Err = Infallible;
 | 
					    type Err = Infallible;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    fn from_str(s: &str) -> Result<Self, Self::Err> {
 | 
					    fn from_str(s: &str) -> Result<Self, Self::Err> {
 | 
				
			||||||
| 
						 | 
					@ -83,14 +83,14 @@ impl FromStr for NixPathEntry {
 | 
				
			||||||
///
 | 
					///
 | 
				
			||||||
/// This struct can be constructed by parsing a string using the [`FromStr`]
 | 
					/// This struct can be constructed by parsing a string using the [`FromStr`]
 | 
				
			||||||
/// impl, or via [`str::parse`]. Nix `<...>` paths can then be resolved using
 | 
					/// impl, or via [`str::parse`]. Nix `<...>` paths can then be resolved using
 | 
				
			||||||
/// [`NixPath::resolve`].
 | 
					/// [`NixSearchPath::resolve`].
 | 
				
			||||||
#[derive(Default, Debug, Clone, PartialEq, Eq)]
 | 
					#[derive(Default, Debug, Clone, PartialEq, Eq)]
 | 
				
			||||||
pub struct NixPath {
 | 
					pub struct NixSearchPath {
 | 
				
			||||||
    entries: Vec<NixPathEntry>,
 | 
					    entries: Vec<NixSearchPathEntry>,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
impl NixPath {
 | 
					impl NixSearchPath {
 | 
				
			||||||
    /// Attempt to resolve the given `path` within this [`NixPath`] using the
 | 
					    /// Attempt to resolve the given `path` within this [`NixSearchPath`] using the
 | 
				
			||||||
    /// path resolution rules for `<...>`-style paths
 | 
					    /// path resolution rules for `<...>`-style paths
 | 
				
			||||||
    #[allow(dead_code)] // TODO(grfn)
 | 
					    #[allow(dead_code)] // TODO(grfn)
 | 
				
			||||||
    pub fn resolve<P>(&self, path: P) -> Result<PathBuf, ErrorKind>
 | 
					    pub fn resolve<P>(&self, path: P) -> Result<PathBuf, ErrorKind>
 | 
				
			||||||
| 
						 | 
					@ -110,7 +110,7 @@ impl NixPath {
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
impl FromStr for NixPath {
 | 
					impl FromStr for NixSearchPath {
 | 
				
			||||||
    type Err = Infallible;
 | 
					    type Err = Infallible;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    fn from_str(s: &str) -> Result<Self, Self::Err> {
 | 
					    fn from_str(s: &str) -> Result<Self, Self::Err> {
 | 
				
			||||||
| 
						 | 
					@ -118,7 +118,7 @@ impl FromStr for NixPath {
 | 
				
			||||||
            .split(':')
 | 
					            .split(':')
 | 
				
			||||||
            .map(|s| s.parse())
 | 
					            .map(|s| s.parse())
 | 
				
			||||||
            .collect::<Result<Vec<_>, _>>()?;
 | 
					            .collect::<Result<Vec<_>, _>>()?;
 | 
				
			||||||
        Ok(NixPath { entries })
 | 
					        Ok(NixSearchPath { entries })
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -132,11 +132,11 @@ mod tests {
 | 
				
			||||||
        #[test]
 | 
					        #[test]
 | 
				
			||||||
        fn bare_paths() {
 | 
					        fn bare_paths() {
 | 
				
			||||||
            assert_eq!(
 | 
					            assert_eq!(
 | 
				
			||||||
                NixPath::from_str("/foo/bar:/baz").unwrap(),
 | 
					                NixSearchPath::from_str("/foo/bar:/baz").unwrap(),
 | 
				
			||||||
                NixPath {
 | 
					                NixSearchPath {
 | 
				
			||||||
                    entries: vec![
 | 
					                    entries: vec![
 | 
				
			||||||
                        NixPathEntry::Path("/foo/bar".into()),
 | 
					                        NixSearchPathEntry::Path("/foo/bar".into()),
 | 
				
			||||||
                        NixPathEntry::Path("/baz".into())
 | 
					                        NixSearchPathEntry::Path("/baz".into())
 | 
				
			||||||
                    ],
 | 
					                    ],
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
| 
						 | 
					@ -145,14 +145,14 @@ mod tests {
 | 
				
			||||||
        #[test]
 | 
					        #[test]
 | 
				
			||||||
        fn mixed_prefix_and_paths() {
 | 
					        fn mixed_prefix_and_paths() {
 | 
				
			||||||
            assert_eq!(
 | 
					            assert_eq!(
 | 
				
			||||||
                NixPath::from_str("nixpkgs=/my/nixpkgs:/etc/nixos").unwrap(),
 | 
					                NixSearchPath::from_str("nixpkgs=/my/nixpkgs:/etc/nixos").unwrap(),
 | 
				
			||||||
                NixPath {
 | 
					                NixSearchPath {
 | 
				
			||||||
                    entries: vec![
 | 
					                    entries: vec![
 | 
				
			||||||
                        NixPathEntry::Prefix {
 | 
					                        NixSearchPathEntry::Prefix {
 | 
				
			||||||
                            prefix: "nixpkgs".into(),
 | 
					                            prefix: "nixpkgs".into(),
 | 
				
			||||||
                            path: "/my/nixpkgs".into()
 | 
					                            path: "/my/nixpkgs".into()
 | 
				
			||||||
                        },
 | 
					                        },
 | 
				
			||||||
                        NixPathEntry::Path("/etc/nixos".into())
 | 
					                        NixSearchPathEntry::Path("/etc/nixos".into())
 | 
				
			||||||
                    ],
 | 
					                    ],
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
| 
						 | 
					@ -168,15 +168,15 @@ mod tests {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        #[test]
 | 
					        #[test]
 | 
				
			||||||
        fn simple_dir() {
 | 
					        fn simple_dir() {
 | 
				
			||||||
            let nix_path = NixPath::from_str("./.").unwrap();
 | 
					            let nix_search_path = NixSearchPath::from_str("./.").unwrap();
 | 
				
			||||||
            let res = nix_path.resolve("src").unwrap();
 | 
					            let res = nix_search_path.resolve("src").unwrap();
 | 
				
			||||||
            assert_eq!(res, current_dir().unwrap().join("src").clean());
 | 
					            assert_eq!(res, current_dir().unwrap().join("src").clean());
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        #[test]
 | 
					        #[test]
 | 
				
			||||||
        fn failed_resolution() {
 | 
					        fn failed_resolution() {
 | 
				
			||||||
            let nix_path = NixPath::from_str("./.").unwrap();
 | 
					            let nix_search_path = NixSearchPath::from_str("./.").unwrap();
 | 
				
			||||||
            let err = nix_path.resolve("nope").unwrap_err();
 | 
					            let err = nix_search_path.resolve("nope").unwrap_err();
 | 
				
			||||||
            assert!(
 | 
					            assert!(
 | 
				
			||||||
                matches!(err, ErrorKind::PathResolution(..)),
 | 
					                matches!(err, ErrorKind::PathResolution(..)),
 | 
				
			||||||
                "err = {err:?}"
 | 
					                "err = {err:?}"
 | 
				
			||||||
| 
						 | 
					@ -185,22 +185,22 @@ mod tests {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        #[test]
 | 
					        #[test]
 | 
				
			||||||
        fn second_in_path() {
 | 
					        fn second_in_path() {
 | 
				
			||||||
            let nix_path = NixPath::from_str("./.:/").unwrap();
 | 
					            let nix_search_path = NixSearchPath::from_str("./.:/").unwrap();
 | 
				
			||||||
            let res = nix_path.resolve("bin").unwrap();
 | 
					            let res = nix_search_path.resolve("bin").unwrap();
 | 
				
			||||||
            assert_eq!(res, Path::new("/bin"));
 | 
					            assert_eq!(res, Path::new("/bin"));
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        #[test]
 | 
					        #[test]
 | 
				
			||||||
        fn prefix() {
 | 
					        fn prefix() {
 | 
				
			||||||
            let nix_path = NixPath::from_str("/:tvix=.").unwrap();
 | 
					            let nix_search_path = NixSearchPath::from_str("/:tvix=.").unwrap();
 | 
				
			||||||
            let res = nix_path.resolve("tvix/src").unwrap();
 | 
					            let res = nix_search_path.resolve("tvix/src").unwrap();
 | 
				
			||||||
            assert_eq!(res, current_dir().unwrap().join("src").clean());
 | 
					            assert_eq!(res, current_dir().unwrap().join("src").clean());
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        #[test]
 | 
					        #[test]
 | 
				
			||||||
        fn matching_prefix() {
 | 
					        fn matching_prefix() {
 | 
				
			||||||
            let nix_path = NixPath::from_str("/:tvix=.").unwrap();
 | 
					            let nix_search_path = NixSearchPath::from_str("/:tvix=.").unwrap();
 | 
				
			||||||
            let res = nix_path.resolve("tvix").unwrap();
 | 
					            let res = nix_search_path.resolve("tvix").unwrap();
 | 
				
			||||||
            assert_eq!(res, current_dir().unwrap().clean());
 | 
					            assert_eq!(res, current_dir().unwrap().clean());
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					@ -113,9 +113,9 @@ pub enum OpCode {
 | 
				
			||||||
    OpCoerceToString,
 | 
					    OpCoerceToString,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Paths
 | 
					    // Paths
 | 
				
			||||||
    /// Attempt to resolve the Value on the stack using the configured [`NixPath`][]
 | 
					    /// Attempt to resolve the Value on the stack using the configured [`NixSearchPath`][]
 | 
				
			||||||
    ///
 | 
					    ///
 | 
				
			||||||
    /// [`NixPath`]: crate::nix_path::NixPath
 | 
					    /// [`NixSearchPath`]: crate::nix_search_path::NixSearchPath
 | 
				
			||||||
    OpFindFile,
 | 
					    OpFindFile,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Type assertion operators
 | 
					    // Type assertion operators
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -8,7 +8,7 @@ use path_clean::PathClean;
 | 
				
			||||||
use crate::{
 | 
					use crate::{
 | 
				
			||||||
    chunk::Chunk,
 | 
					    chunk::Chunk,
 | 
				
			||||||
    errors::{Error, ErrorKind, EvalResult},
 | 
					    errors::{Error, ErrorKind, EvalResult},
 | 
				
			||||||
    nix_path::NixPath,
 | 
					    nix_search_path::NixSearchPath,
 | 
				
			||||||
    observer::RuntimeObserver,
 | 
					    observer::RuntimeObserver,
 | 
				
			||||||
    opcode::{CodeIdx, Count, JumpOffset, OpCode, StackIdx, UpvalueIdx},
 | 
					    opcode::{CodeIdx, Count, JumpOffset, OpCode, StackIdx, UpvalueIdx},
 | 
				
			||||||
    upvalues::{UpvalueCarrier, Upvalues},
 | 
					    upvalues::{UpvalueCarrier, Upvalues},
 | 
				
			||||||
| 
						 | 
					@ -50,7 +50,7 @@ pub struct VM<'o> {
 | 
				
			||||||
    /// Runtime warnings collected during evaluation.
 | 
					    /// Runtime warnings collected during evaluation.
 | 
				
			||||||
    warnings: Vec<EvalWarning>,
 | 
					    warnings: Vec<EvalWarning>,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    nix_path: NixPath,
 | 
					    nix_search_path: NixSearchPath,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    observer: &'o mut dyn RuntimeObserver,
 | 
					    observer: &'o mut dyn RuntimeObserver,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -142,9 +142,9 @@ macro_rules! cmp_op {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
impl<'o> VM<'o> {
 | 
					impl<'o> VM<'o> {
 | 
				
			||||||
    pub fn new(nix_path: NixPath, observer: &'o mut dyn RuntimeObserver) -> Self {
 | 
					    pub fn new(nix_search_path: NixSearchPath, observer: &'o mut dyn RuntimeObserver) -> Self {
 | 
				
			||||||
        Self {
 | 
					        Self {
 | 
				
			||||||
            nix_path,
 | 
					            nix_search_path,
 | 
				
			||||||
            observer,
 | 
					            observer,
 | 
				
			||||||
            frames: vec![],
 | 
					            frames: vec![],
 | 
				
			||||||
            stack: vec![],
 | 
					            stack: vec![],
 | 
				
			||||||
| 
						 | 
					@ -518,7 +518,10 @@ impl<'o> VM<'o> {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            OpCode::OpFindFile => {
 | 
					            OpCode::OpFindFile => {
 | 
				
			||||||
                let path = self.pop().to_str().map_err(|e| self.error(e))?;
 | 
					                let path = self.pop().to_str().map_err(|e| self.error(e))?;
 | 
				
			||||||
                let resolved = self.nix_path.resolve(path).map_err(|e| self.error(e))?;
 | 
					                let resolved = self
 | 
				
			||||||
 | 
					                    .nix_search_path
 | 
				
			||||||
 | 
					                    .resolve(path)
 | 
				
			||||||
 | 
					                    .map_err(|e| self.error(e))?;
 | 
				
			||||||
                self.push(resolved.into());
 | 
					                self.push(resolved.into());
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -887,11 +890,11 @@ fn unwrap_or_clone_rc<T: Clone>(rc: Rc<T>) -> T {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pub fn run_lambda(
 | 
					pub fn run_lambda(
 | 
				
			||||||
    nix_path: NixPath,
 | 
					    nix_search_path: NixSearchPath,
 | 
				
			||||||
    observer: &mut dyn RuntimeObserver,
 | 
					    observer: &mut dyn RuntimeObserver,
 | 
				
			||||||
    lambda: Rc<Lambda>,
 | 
					    lambda: Rc<Lambda>,
 | 
				
			||||||
) -> EvalResult<RuntimeResult> {
 | 
					) -> EvalResult<RuntimeResult> {
 | 
				
			||||||
    let mut vm = VM::new(nix_path, observer);
 | 
					    let mut vm = VM::new(nix_search_path, observer);
 | 
				
			||||||
    vm.enter_frame(lambda, Upvalues::with_capacity(0), 0)?;
 | 
					    vm.enter_frame(lambda, Upvalues::with_capacity(0), 0)?;
 | 
				
			||||||
    let value = vm.pop();
 | 
					    let value = vm.pop();
 | 
				
			||||||
    vm.force_for_output(&value)?;
 | 
					    vm.force_for_output(&value)?;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue