diff options
Diffstat (limited to 'tvix/eval/src/vm')
-rw-r--r-- | tvix/eval/src/vm/mod.rs | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/tvix/eval/src/vm/mod.rs b/tvix/eval/src/vm/mod.rs index 642b6317caee..312d1b893520 100644 --- a/tvix/eval/src/vm/mod.rs +++ b/tvix/eval/src/vm/mod.rs @@ -661,10 +661,17 @@ impl<'o> VM<'o> { OpCode::OpAttrs(Count(count)) => self.run_attrset(&frame, count)?, OpCode::OpAttrsUpdate => { - let rhs = self.stack_pop().to_attrs().with_span(&frame, self)?; - let lhs = self.stack_pop().to_attrs().with_span(&frame, self)?; - - self.stack.push(Value::attrs(lhs.update(*rhs))) + let rhs = self.stack_pop(); + let lhs = self.stack_pop(); + if lhs.is_catchable() { + self.stack.push(lhs); + } else if rhs.is_catchable() { + self.stack.push(rhs); + } else { + let rhs = rhs.to_attrs().with_span(&frame, self)?; + let lhs = lhs.to_attrs().with_span(&frame, self)?; + self.stack.push(Value::attrs(lhs.update(*rhs))) + } } OpCode::OpInvert => { |