diff options
Diffstat (limited to 'tvix/eval')
-rw-r--r-- | tvix/eval/Cargo.toml | 5 | ||||
-rw-r--r-- | tvix/eval/src/value/string.rs | 18 |
2 files changed, 20 insertions, 3 deletions
diff --git a/tvix/eval/Cargo.toml b/tvix/eval/Cargo.toml index 83600eb6e2bd..ed2ed0440804 100644 --- a/tvix/eval/Cargo.toml +++ b/tvix/eval/Cargo.toml @@ -58,6 +58,11 @@ impure = [] # Enables Arbitrary impls for internal types (required to run tests) arbitrary = ["proptest", "test-strategy", "imbl/proptest"] +# Don't leak strings (enable this if you care about peak memory usage of eval) +# +# This is intended as a stop-gap until we have a garbage collector +no_leak = [] + [[bench]] name = "eval" harness = false diff --git a/tvix/eval/src/value/string.rs b/tvix/eval/src/value/string.rs index 163e140a19c4..3e991890ea5a 100644 --- a/tvix/eval/src/value/string.rs +++ b/tvix/eval/src/value/string.rs @@ -409,6 +409,10 @@ unsafe impl Sync for NixString {} impl Drop for NixString { fn drop(&mut self) { + if !cfg!(feature = "no_leak") { + return; + } + // SAFETY: There's no way to construct a NixString that doesn't leave the allocation correct // according to the rules of dealloc unsafe { @@ -419,9 +423,17 @@ impl Drop for NixString { impl Clone for NixString { fn clone(&self) -> Self { - // SAFETY: There's no way to construct a NixString that doesn't leave the allocation correct - // according to the rules of clone - unsafe { Self(NixStringInner::clone(self.0)) } + if cfg!(feature = "no_leak") || self.context().is_some() { + // SAFETY: There's no way to construct a NixString that doesn't leave the allocation correct + // according to the rules of clone + unsafe { Self(NixStringInner::clone(self.0)) } + } else { + // SAFETY: + // + // - NixStrings are never mutated + // - NixStrings are never freed + Self(self.0) + } } } |