diff options
author | Griffin Smith <root@gws.fyi> | 2022-09-18T20·34-0400 |
---|---|---|
committer | grfn <grfn@gws.fyi> | 2022-09-22T01·36+0000 |
commit | 9e16d708092e88d0013ef96ef9a33ec28b2c46ea (patch) | |
tree | d645f726f9e06164e16747ede5bd833c9eeeedb9 /tvix/eval | |
parent | 7bf1b4deea0be5fcb183b7b39165185c2e9fc521 (diff) |
feat(tvix/eval): Sketch out impure builtins r/4954
Sketch out a new set of "impure" builtins, which supplement the existing set of "pure" builtins but are gated behind a feature flag, which allows them to be omitted by crates depending on tvix-eval that only want pure evaluation, such as tvixbolt. Change-Id: I2736017b5c9b4776bbba8758e108ec84887abd66 Reviewed-on: https://cl.tvl.fyi/c/depot/+/6655 Reviewed-by: wpcarro <wpcarro@gmail.com> Tested-by: BuildkiteCI Reviewed-by: sterni <sternenseemann@systemli.org> Reviewed-by: tazjin <tazjin@tvl.su>
Diffstat (limited to 'tvix/eval')
-rw-r--r-- | tvix/eval/Cargo.toml | 5 | ||||
-rw-r--r-- | tvix/eval/src/builtins/impure.rs | 7 | ||||
-rw-r--r-- | tvix/eval/src/builtins/mod.rs | 14 |
3 files changed, 23 insertions, 3 deletions
diff --git a/tvix/eval/Cargo.toml b/tvix/eval/Cargo.toml index bf34159656aa..b23fc057ad5a 100644 --- a/tvix/eval/Cargo.toml +++ b/tvix/eval/Cargo.toml @@ -39,7 +39,7 @@ itertools = "0.10.3" tempdir = "0.3.7" [features] -default = [ "repl", "arbitrary" ] +default = [ "repl", "impure", "arbitrary" ] # Enables running the Nix language test suite from the original C++ # Nix implementation (at version 2.3) against Tvix. @@ -48,6 +48,9 @@ nix_tests = [] # Enables building the binary (tvix-eval REPL) repl = [ "dep:rustyline", "dep:clap" ] +# Enables operations in the VM which depend on the ability to perform I/O +impure = [] + # Enables Arbitrary impls for internal types (required to run tests) arbitrary = [ "proptest", "test-strategy" ] diff --git a/tvix/eval/src/builtins/impure.rs b/tvix/eval/src/builtins/impure.rs new file mode 100644 index 000000000000..3438aa06f424 --- /dev/null +++ b/tvix/eval/src/builtins/impure.rs @@ -0,0 +1,7 @@ +use crate::value::Builtin; + +/// Return all impure builtins, that is all builtins which may perform I/O outside of the VM and so +/// cannot be used in all contexts (e.g. WASM). +pub(super) fn builtins() -> Vec<Builtin> { + vec![] +} diff --git a/tvix/eval/src/builtins/mod.rs b/tvix/eval/src/builtins/mod.rs index 55135c4d8d45..f40c6f9574b1 100644 --- a/tvix/eval/src/builtins/mod.rs +++ b/tvix/eval/src/builtins/mod.rs @@ -20,6 +20,8 @@ use crate::arithmetic_op; use self::versions::{VersionPart, VersionPartsIter}; +#[cfg(feature = "impure")] +mod impure; pub mod versions; /// Coerce a Nix Value to a plain path, e.g. in order to access the file it @@ -292,8 +294,16 @@ fn pure_builtins() -> Vec<Builtin> { fn builtins_set() -> NixAttrs { let mut map: BTreeMap<NixString, Value> = BTreeMap::new(); - for builtin in pure_builtins() { - map.insert(builtin.name().into(), Value::Builtin(builtin)); + let mut add_builtins = |builtins: Vec<Builtin>| { + for builtin in builtins { + map.insert(builtin.name().into(), Value::Builtin(builtin)); + } + }; + + add_builtins(pure_builtins()); + #[cfg(feature = "impure")] + { + add_builtins(impure::builtins()); } NixAttrs::from_map(map) |