refactor(tvix/eval): keep globals alive through VM struct

This forces users to pass the fully constructed set of globals to the
VM, making it harder to accidentally "lose" the set while weak
references to it still exist.

This doesn't modify any functionality, but is laying the foundation
for simplifying some of the builtins behaviour that has grown more
complex again.

Change-Id: I5120f97861c65dc46d90b8a4e2c92ad32cc53e03
Reviewed-on: https://cl.tvl.fyi/c/depot/+/7877
Autosubmit: tazjin <tazjin@tvl.su>
Tested-by: BuildkiteCI
Reviewed-by: flokli <flokli@flokli.de>
This commit is contained in:
Vincent Ambo 2023-01-20 16:18:06 +03:00 committed by clbot
parent 6d03e31060
commit 7442558b33
4 changed files with 59 additions and 10 deletions

View file

@ -578,7 +578,12 @@ mod tests {
#[proptest(ProptestConfig { cases: 5, ..Default::default() })]
fn reflexive(x: Value) {
let mut observer = NoOpObserver {};
let mut vm = VM::new(Default::default(), Box::new(crate::DummyIO), &mut observer);
let mut vm = VM::new(
Default::default(),
Box::new(crate::DummyIO),
&mut observer,
Default::default(),
);
assert!(x.nix_eq(&x, &mut vm).unwrap())
}
@ -586,7 +591,12 @@ mod tests {
#[proptest(ProptestConfig { cases: 5, ..Default::default() })]
fn symmetric(x: Value, y: Value) {
let mut observer = NoOpObserver {};
let mut vm = VM::new(Default::default(), Box::new(crate::DummyIO), &mut observer);
let mut vm = VM::new(
Default::default(),
Box::new(crate::DummyIO),
&mut observer,
Default::default(),
);
assert_eq!(
x.nix_eq(&y, &mut vm).unwrap(),
@ -597,7 +607,12 @@ mod tests {
#[proptest(ProptestConfig { cases: 5, ..Default::default() })]
fn transitive(x: Value, y: Value, z: Value) {
let mut observer = NoOpObserver {};
let mut vm = VM::new(Default::default(), Box::new(crate::DummyIO), &mut observer);
let mut vm = VM::new(
Default::default(),
Box::new(crate::DummyIO),
&mut observer,
Default::default(),
);
if x.nix_eq(&y, &mut vm).unwrap() && y.nix_eq(&z, &mut vm).unwrap() {
assert!(x.nix_eq(&z, &mut vm).unwrap())
@ -607,7 +622,12 @@ mod tests {
#[test]
fn list_int_float_fungibility() {
let mut observer = NoOpObserver {};
let mut vm = VM::new(Default::default(), Box::new(crate::DummyIO), &mut observer);
let mut vm = VM::new(
Default::default(),
Box::new(crate::DummyIO),
&mut observer,
Default::default(),
);
let v1 = Value::List(NixList::from(vector![Value::Integer(1)]));
let v2 = Value::List(NixList::from(vector![Value::Float(1.0)]));