mirror of
https://github.com/NixOS/nix.git
synced 2025-11-12 05:26:02 +01:00
libexpr: Call destructor on exception_ptr
This uses `gc_cleanup` to call the exception_ptr destructor when the `Failed` is collected. I don't know exactly how bad it is to deallocate `std::exception_ptr` without destruction, but I guess it ranges from small leak to UB and crash.
This commit is contained in:
parent
6de4db100f
commit
9aa3cc9c8f
1 changed files with 15 additions and 2 deletions
|
|
@ -268,9 +268,22 @@ struct ValueBase
|
||||||
Value * const * elems;
|
Value * const * elems;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Failed : gc
|
/**
|
||||||
|
Representation of an evaluation that previously failed.
|
||||||
|
|
||||||
|
`Value` references `Failed` by packed pointer, and its `new` is GC managed.
|
||||||
|
|
||||||
|
@see gc_cleanup std::exception_ptr
|
||||||
|
*/
|
||||||
|
class Failed : public gc_cleanup
|
||||||
{
|
{
|
||||||
|
public:
|
||||||
std::exception_ptr ex;
|
std::exception_ptr ex;
|
||||||
|
|
||||||
|
Failed(std::exception_ptr && ex)
|
||||||
|
: ex(ex)
|
||||||
|
{
|
||||||
|
}
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -1075,7 +1088,7 @@ public:
|
||||||
|
|
||||||
inline void mkFailed() noexcept
|
inline void mkFailed() noexcept
|
||||||
{
|
{
|
||||||
setStorage(new Value::Failed{.ex = std::current_exception()});
|
setStorage(new Value::Failed(std::current_exception()));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isList() const noexcept
|
bool isList() const noexcept
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue