diff options
-rw-r--r-- | tvix/eval/src/tests/tvix_tests/eval-okay-or-operator-non-set.exp | 1 | ||||
-rw-r--r-- | tvix/eval/src/tests/tvix_tests/eval-okay-or-operator-non-set.nix | 2 | ||||
-rw-r--r-- | tvix/eval/src/vm.rs | 14 |
3 files changed, 12 insertions, 5 deletions
diff --git a/tvix/eval/src/tests/tvix_tests/eval-okay-or-operator-non-set.exp b/tvix/eval/src/tests/tvix_tests/eval-okay-or-operator-non-set.exp new file mode 100644 index 000000000000..a833e32892e4 --- /dev/null +++ b/tvix/eval/src/tests/tvix_tests/eval-okay-or-operator-non-set.exp @@ -0,0 +1 @@ +"works fine" diff --git a/tvix/eval/src/tests/tvix_tests/eval-okay-or-operator-non-set.nix b/tvix/eval/src/tests/tvix_tests/eval-okay-or-operator-non-set.nix new file mode 100644 index 000000000000..fd09bfee64c2 --- /dev/null +++ b/tvix/eval/src/tests/tvix_tests/eval-okay-or-operator-non-set.nix @@ -0,0 +1,2 @@ +# `or` operator should keep working if it encounters a non-set type. +{ a.b = 42; }.a.b.c or "works fine" diff --git a/tvix/eval/src/vm.rs b/tvix/eval/src/vm.rs index d050fa807106..d18cd7977bbe 100644 --- a/tvix/eval/src/vm.rs +++ b/tvix/eval/src/vm.rs @@ -182,12 +182,16 @@ impl VM { OpCode::OpAttrOrNotFound => { let key = self.pop().to_string()?; - let attrs = self.pop().to_attrs()?; + let value = match self.pop() { + Value::Attrs(attrs) => match attrs.select(key.as_str()) { + Some(value) => value.clone(), + None => Value::NotFound, + }, - match attrs.select(key.as_str()) { - Some(value) => self.push(value.clone()), - None => self.push(Value::NotFound), - } + _ => Value::NotFound, + }; + + self.push(value); } OpCode::OpAttrsIsSet => { |