From f0179c92d3248667b7f037de91c6b9eb737a40d2 Mon Sep 17 00:00:00 2001 From: Vincent Ambo Date: Mon, 3 Oct 2022 11:26:32 +0300 Subject: [PATCH] refactor(tvix/eval): allow impure Value builtins Allows impure builtins that have a different shape than a Rust function pointer; specifically this is required for builtins.currentTime which does not work in WASM. Change-Id: I1362d8eeafe770ce4d1c5ebe4d119aeb0abb5c9b Reviewed-on: https://cl.tvl.fyi/c/depot/+/6849 Reviewed-by: sterni Tested-by: BuildkiteCI Reviewed-by: grfn Reviewed-by: wpcarro --- tvix/eval/src/builtins/impure.rs | 25 ++++++++++++++++++++++--- tvix/eval/src/builtins/mod.rs | 12 +++++------- 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/tvix/eval/src/builtins/impure.rs b/tvix/eval/src/builtins/impure.rs index 3438aa06f..41e3805b2 100644 --- a/tvix/eval/src/builtins/impure.rs +++ b/tvix/eval/src/builtins/impure.rs @@ -1,7 +1,26 @@ -use crate::value::Builtin; +use std::{ + collections::BTreeMap, + time::{SystemTime, UNIX_EPOCH}, +}; + +use smol_str::SmolStr; + +use crate::{ + value::{Builtin, NixString}, + Value, +}; + +fn impure_builtins() -> Vec { + vec![] +} /// 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 { - vec![] +pub(super) fn builtins() -> BTreeMap { + let mut map: BTreeMap = impure_builtins() + .into_iter() + .map(|b| (b.name().into(), Value::Builtin(b))) + .collect(); + + map } diff --git a/tvix/eval/src/builtins/mod.rs b/tvix/eval/src/builtins/mod.rs index cd4200a13..848ac9e25 100644 --- a/tvix/eval/src/builtins/mod.rs +++ b/tvix/eval/src/builtins/mod.rs @@ -3,12 +3,10 @@ //! See //tvix/eval/docs/builtins.md for a some context on the //! available builtins in Nix. -use std::{ - cmp, - collections::{BTreeMap, HashMap}, - path::PathBuf, - rc::Rc, -}; +use std::cmp; +use std::collections::{BTreeMap, HashMap}; +use std::path::PathBuf; +use std::rc::Rc; use crate::{ errors::ErrorKind, @@ -385,7 +383,7 @@ fn builtins_set() -> NixAttrs { add_builtins(pure_builtins()); #[cfg(feature = "impure")] { - add_builtins(impure::builtins()); + map.extend(impure::builtins()); } NixAttrs::from_map(map)