From 220707d9ee5594c782460272dd7385ff9b947cb4 Mon Sep 17 00:00:00 2001 From: Alejandro Cabeza Romero Date: Fri, 24 Apr 2026 13:47:43 +0200 Subject: [PATCH] Simplify guard. --- .../src/native/witness_input.rs | 37 ++++++------------- 1 file changed, 11 insertions(+), 26 deletions(-) diff --git a/rust/logos-blockchain-circuits-types/src/native/witness_input.rs b/rust/logos-blockchain-circuits-types/src/native/witness_input.rs index 3f6f7be..00843db 100644 --- a/rust/logos-blockchain-circuits-types/src/native/witness_input.rs +++ b/rust/logos-blockchain-circuits-types/src/native/witness_input.rs @@ -1,4 +1,4 @@ -use std::ffi::{c_char, CString, NulError}; +use std::ffi::{CString, NulError}; use crate::ffi; /// Input for witness generators @@ -6,41 +6,36 @@ pub struct WitnessInput { /// The circuit's dat file contents. dat: Vec, /// The JSON string containing the circuit inputs. - inputs_json: String, + inputs_json: CString, } impl WitnessInput { - #[must_use] - pub const fn new(dat: Vec, inputs_json: String) -> Self { - Self { dat, inputs_json } + pub fn new(dat: Vec, inputs_json: String) -> Result { + let inputs_json = CString::new(inputs_json)?; + Ok(Self { dat, inputs_json }) } /// Borrows this value as a temporary FFI-compatible view. - /// - /// Returns an error if `inputs_json` contains an interior null byte. - pub fn as_ffi(&'_ self) -> Result, NulError> { + pub fn as_ffi(&'_ self) -> WitnessInputFfiGuard<'_> { WitnessInputFfiGuard::new(self) } } -/// Temporary FFI view of a [`WitnessInput`], valid for the lifetime of the source. -/// -/// Owns the C string allocation of `WitnessInput::inputs_json` and ensures it is freed when -/// dropped. +/// Temporary FFI view of a [`WitnessInput`], which makes [`ffi::WitnessInput`] lifetime-aware. pub struct WitnessInputFfiGuard<'a> { ffi: ffi::WitnessInput, _lifetime: std::marker::PhantomData<&'a WitnessInput>, } impl<'a> WitnessInputFfiGuard<'a> { - fn new(inner: &'a WitnessInput) -> Result { + fn new(inner: &'a WitnessInput) -> Self { let dat = ffi::ConstBytes { data: inner.dat.as_ptr(), size: inner.dat.len() }; - let inputs_json = CString::new(inner.inputs_json.clone())?.into_raw(); // TODO CLEANER? + let inputs_json = inner.inputs_json.as_ptr(); let ffi = ffi::WitnessInput { dat, inputs_json }; - Ok(Self { + Self { ffi, _lifetime: std::marker::PhantomData, - }) + } } } @@ -49,13 +44,3 @@ impl<'a> AsRef for WitnessInputFfiGuard<'a> { &self.ffi } } - -impl<'a> Drop for WitnessInputFfiGuard<'a> { - fn drop(&mut self) { - if !self.ffi.inputs_json.is_null() { - drop(unsafe { - CString::from_raw(self.ffi.inputs_json as *mut c_char) - }) - } - } -}