fix(tvix/eval): ?
: propagate catchables
This commit fixes out `?` operator so it correctly propagates catchables. Change-Id: Iebaa153a8492101ee3ddd29893c98730ff331547 Reviewed-on: https://cl.tvl.fyi/c/depot/+/10317 Autosubmit: Adam Joseph <adam@westernsemico.com> Reviewed-by: tazjin <tazjin@tvl.su> Tested-by: BuildkiteCI
This commit is contained in:
parent
990c4e727f
commit
fc963033ae
3 changed files with 18 additions and 8 deletions
|
@ -0,0 +1 @@
|
|||
false
|
|
@ -0,0 +1 @@
|
|||
(builtins.tryEval ((throw "fred") ? bob)).success
|
|
@ -707,16 +707,24 @@ impl<'o> VM<'o> {
|
|||
}
|
||||
|
||||
OpCode::OpHasAttr => {
|
||||
let key = self.stack_pop().to_str().with_span(&frame, self)?;
|
||||
let result = match self.stack_pop() {
|
||||
Value::Attrs(attrs) => attrs.contains(key.as_str()),
|
||||
let key = self.stack_pop();
|
||||
let attrs = self.stack_pop();
|
||||
if key.is_catchable() {
|
||||
self.stack.push(key);
|
||||
} else if attrs.is_catchable() {
|
||||
self.stack.push(attrs);
|
||||
} else {
|
||||
let key = key.to_str().with_span(&frame, self)?;
|
||||
let result = match attrs {
|
||||
Value::Attrs(attrs) => attrs.contains(key.as_str()),
|
||||
|
||||
// Nix allows use of `?` on non-set types, but
|
||||
// always returns false in those cases.
|
||||
_ => false,
|
||||
};
|
||||
// Nix allows use of `?` on non-set types, but
|
||||
// always returns false in those cases.
|
||||
_ => false,
|
||||
};
|
||||
|
||||
self.stack.push(Value::Bool(result));
|
||||
self.stack.push(Value::Bool(result));
|
||||
}
|
||||
}
|
||||
|
||||
OpCode::OpConcat => {
|
||||
|
|
Loading…
Reference in a new issue