diff --git a/fish-rust/build.rs b/fish-rust/build.rs index 13c1c44eb..ec1b832ba 100644 --- a/fish-rust/build.rs +++ b/fish-rust/build.rs @@ -88,7 +88,6 @@ fn main() { "fish-rust/src/io.rs", "fish-rust/src/job_group.rs", "fish-rust/src/kill.rs", - "fish-rust/src/null_terminated_array.rs", "fish-rust/src/operation_context.rs", "fish-rust/src/output.rs", "fish-rust/src/parse_constants.rs", diff --git a/fish-rust/src/env/env_ffi.rs b/fish-rust/src/env/env_ffi.rs index a440324af..d2532b379 100644 --- a/fish-rust/src/env/env_ffi.rs +++ b/fish-rust/src/env/env_ffi.rs @@ -2,11 +2,9 @@ use super::var::{ElectricVar, EnvVar, EnvVarFlags, Statuses}; use crate::env::EnvMode; use crate::ffi::{wchar_t, wcharz_t, wcstring_list_ffi_t}; -use crate::null_terminated_array::OwningNullTerminatedArrayRefFFI; use crate::signal::Signal; use crate::wchar_ffi::WCharToFFI; use crate::wchar_ffi::{AsWstr, WCharFromFFI}; -use core::ffi::c_char; use cxx::{CxxVector, CxxWString, UniquePtr}; use lazy_static::lazy_static; use std::ffi::c_int; @@ -149,10 +147,6 @@ fn set( fn push(&self, new_scope: bool); fn pop(&self); - // Returns a Box.into_raw() cast to a void*. - // This is because we can't use the same C++ bindings to a Rust type from two different bridges. - fn export_array(&self) -> *mut c_char; - fn snapshot(&self) -> Box; // Access a variable stack that only represents globals. @@ -341,13 +335,6 @@ fn remove(&self, name: &CxxWString, flags: u16) -> EnvStackSetResult { self.0.remove(name.as_wstr(), mode) } - fn export_array(&self) -> *mut c_char { - Box::into_raw(Box::new(OwningNullTerminatedArrayRefFFI( - self.0.export_array(), - ))) - .cast() - } - fn snapshot(&self) -> Box { Box::new(EnvDynFFI(self.0.snapshot())) } diff --git a/fish-rust/src/null_terminated_array.rs b/fish-rust/src/null_terminated_array.rs index df5d06509..5b9f6690b 100644 --- a/fish-rust/src/null_terminated_array.rs +++ b/fish-rust/src/null_terminated_array.rs @@ -3,7 +3,6 @@ use std::marker::PhantomData; use std::pin::Pin; use std::ptr; -use std::sync::Arc; pub trait NulTerminatedString { type CharType: Copy; @@ -140,23 +139,8 @@ pub fn null_terminated_array_length(mut arr: *const *const T) -> usize { len } -/// FFI bits. -/// We often work in Arc. -/// Expose this to C++. -pub struct OwningNullTerminatedArrayRefFFI(pub Arc); -impl OwningNullTerminatedArrayRefFFI { - fn get(&self) -> *mut *const c_char { - self.0.get() - } -} - -unsafe impl cxx::ExternType for OwningNullTerminatedArrayRefFFI { - type Id = cxx::type_id!("OwningNullTerminatedArrayRefFFI"); - type Kind = cxx::kind::Opaque; -} - /// Convert a CxxString to a CString, truncating at the first NUL. -use cxx::{CxxString, CxxVector}; +use cxx::CxxString; fn cxxstring_to_cstring(s: &CxxString) -> CString { let bytes: &[u8] = s.as_bytes(); let nul_pos = bytes.iter().position(|&b| b == 0); @@ -164,29 +148,6 @@ fn cxxstring_to_cstring(s: &CxxString) -> CString { CString::new(slice).unwrap() } -fn new_owning_null_terminated_array_ffi( - strs: &CxxVector, -) -> Box { - let cstrs = strs.iter().map(cxxstring_to_cstring).collect(); - Box::new(OwningNullTerminatedArrayRefFFI(Arc::new( - OwningNullTerminatedArray::new(cstrs), - ))) -} - -#[cxx::bridge] -mod null_terminated_array_ffi { - extern "Rust" { - type OwningNullTerminatedArrayRefFFI; - - fn get(&self) -> *mut *const c_char; - - #[cxx_name = "new_owning_null_terminated_array"] - fn new_owning_null_terminated_array_ffi( - strs: &CxxVector, - ) -> Box; - } -} - #[test] fn test_null_terminated_array_length() { let arr = [&1, &2, &3, std::ptr::null()];