fix: Do not duplicate ctx expr in check_call_opt_key!

(cherry picked from commit 86ddc63a573cd08ec19008448ec2fca33a84159e)
This commit is contained in:
Robert Hensing 2024-06-15 14:55:23 +02:00
parent 35803f4a30
commit da26721bea
2 changed files with 8 additions and 7 deletions

View file

@ -223,9 +223,9 @@ impl EvalState {
.with_context(|| "require_attrs_select_opt: attrName contains null byte")?; .with_context(|| "require_attrs_select_opt: attrName contains null byte")?;
let v2 = unsafe { let v2 = unsafe {
check_call_opt_key!(raw::get_attr_byname[ check_call_opt_key!(raw::get_attr_byname[
self.context, &mut self.context,
v.raw_ptr(), v.raw_ptr(),
self.raw_ptr(), self.eval_state.as_ptr(),
attr_name.as_ptr() attr_name.as_ptr()
]) ])
}?; }?;

View file

@ -107,15 +107,16 @@ pub use check_call;
macro_rules! check_call_opt_key { macro_rules! check_call_opt_key {
($f:path[$ctx:expr, $($arg:expr),*]) => { ($f:path[$ctx:expr, $($arg:expr),*]) => {
{ {
let ret = $f($ctx.ptr(), $($arg,)*); let ctx : &mut $crate::context::Context = $ctx;
if unsafe { raw::err_code($ctx.ptr()) == raw::NIX_ERR_KEY } { let ret = $f(ctx.ptr(), $($arg,)*);
$ctx.clear(); if unsafe { raw::err_code(ctx.ptr()) == raw::NIX_ERR_KEY } {
ctx.clear();
return Ok(None); return Ok(None);
} }
match $ctx.check_err() { match ctx.check_err() {
Ok(_) => Ok(Some(ret)), Ok(_) => Ok(Some(ret)),
Err(e) => { Err(e) => {
$ctx.clear(); ctx.clear();
Err(e) Err(e)
} }
} }