mirror of
https://github.com/logos-blockchain/logos-blockchain-circuits.git
synced 2026-05-18 15:29:26 +00:00
Simplify guard.
This commit is contained in:
parent
73c3ca7cb5
commit
220707d9ee
@ -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<u8>,
|
||||
/// The JSON string containing the circuit inputs.
|
||||
inputs_json: String,
|
||||
inputs_json: CString,
|
||||
}
|
||||
|
||||
impl WitnessInput {
|
||||
#[must_use]
|
||||
pub const fn new(dat: Vec<u8>, inputs_json: String) -> Self {
|
||||
Self { dat, inputs_json }
|
||||
pub fn new(dat: Vec<u8>, inputs_json: String) -> Result<Self, NulError> {
|
||||
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<WitnessInputFfiGuard<'_>, 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<Self, NulError> {
|
||||
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<ffi::WitnessInput> 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)
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user