Skip to content

Commit 040ed32

Browse files
committed
glib: Optimize ToGlibPtrFromSlice impls for shared/boxed/object/boxed-inline
1 parent 5276976 commit 040ed32

File tree

4 files changed

+38
-24
lines changed

4 files changed

+38
-24
lines changed

glib/src/boxed.rs

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -107,19 +107,22 @@ macro_rules! glib_boxed_wrapper {
107107

108108
fn to_glib_none_from_slice(t: &'a [Self]) -> (*mut *const $ffi_name, Self::Storage) {
109109
let mut v_ptr = Vec::with_capacity(t.len() + 1);
110-
v_ptr.extend(t.iter().map(|t| t.as_ptr() as *const $ffi_name));
111-
v_ptr.push(std::ptr::null());
110+
unsafe {
111+
let ptr = v_ptr.as_mut_ptr();
112+
std::ptr::copy_nonoverlapping(t.as_ptr() as *mut *const $ffi_name, ptr, t.len());
113+
std::ptr::write(ptr.add(t.len()), std::ptr::null_mut());
114+
v_ptr.set_len(t.len() + 1);
115+
}
112116

113117
(v_ptr.as_ptr() as *mut *const $ffi_name, (std::marker::PhantomData, Some(v_ptr)))
114118
}
115119

116120
fn to_glib_container_from_slice(t: &'a [Self]) -> (*mut *const $ffi_name, Self::Storage) {
117121
let v_ptr = unsafe {
118-
let v_ptr = $crate::ffi::g_malloc0(std::mem::size_of::<*const $ffi_name>() * (t.len() + 1)) as *mut *const $ffi_name;
122+
let v_ptr = $crate::ffi::g_malloc(std::mem::size_of::<*const $ffi_name>() * (t.len() + 1)) as *mut *const $ffi_name;
119123

120-
for (i, t) in t.iter().enumerate() {
121-
std::ptr::write(v_ptr.add(i), t.as_ptr());
122-
}
124+
std::ptr::copy_nonoverlapping(t.as_ptr() as *mut *const $ffi_name, v_ptr, t.len());
125+
std::ptr::write(v_ptr.add(t.len()), std::ptr::null_mut());
123126

124127
v_ptr
125128
};
@@ -129,11 +132,12 @@ macro_rules! glib_boxed_wrapper {
129132

130133
fn to_glib_full_from_slice(t: &[Self]) -> *mut *const $ffi_name {
131134
unsafe {
132-
let v_ptr = $crate::ffi::g_malloc0(std::mem::size_of::<*const $ffi_name>() * (t.len() + 1)) as *mut *const $ffi_name;
135+
let v_ptr = $crate::ffi::g_malloc(std::mem::size_of::<*const $ffi_name>() * (t.len() + 1)) as *mut *const $ffi_name;
133136

134137
for (i, s) in t.iter().enumerate() {
135138
std::ptr::write(v_ptr.add(i), $crate::translate::ToGlibPtr::to_glib_full(s));
136139
}
140+
std::ptr::write(v_ptr.add(t.len()), std::ptr::null_mut());
137141

138142
v_ptr
139143
}

glib/src/boxed_inline.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -248,11 +248,12 @@ macro_rules! glib_boxed_inline_wrapper {
248248

249249
fn to_glib_container_from_slice(t: &'a [Self]) -> (*mut *const $ffi_name, Self::Storage) {
250250
let v_ptr = unsafe {
251-
let v_ptr = $crate::ffi::g_malloc0(std::mem::size_of::<*const $ffi_name>() * (t.len() + 1)) as *mut *const $ffi_name;
251+
let v_ptr = $crate::ffi::g_malloc(std::mem::size_of::<*const $ffi_name>() * (t.len() + 1)) as *mut *const $ffi_name;
252252

253253
for (i, s) in t.iter().enumerate() {
254254
std::ptr::write(v_ptr.add(i), &s.inner as *const $ffi_name);
255255
}
256+
std::ptr::write(v_ptr.add(t.len()), std::ptr::null_mut());
256257

257258
v_ptr
258259
};
@@ -262,11 +263,12 @@ macro_rules! glib_boxed_inline_wrapper {
262263

263264
fn to_glib_full_from_slice(t: &[Self]) -> *mut *const $ffi_name {
264265
unsafe {
265-
let v_ptr = $crate::ffi::g_malloc0(std::mem::size_of::<*const $ffi_name>() * (t.len() + 1)) as *mut *const $ffi_name;
266+
let v_ptr = $crate::ffi::g_malloc(std::mem::size_of::<*const $ffi_name>() * (t.len() + 1)) as *mut *const $ffi_name;
266267

267268
for (i, s) in t.iter().enumerate() {
268269
std::ptr::write(v_ptr.add(i), $crate::translate::ToGlibPtr::to_glib_full(s));
269270
}
271+
std::ptr::write(v_ptr.add(t.len()), std::ptr::null_mut());
270272

271273
v_ptr
272274
}
@@ -312,7 +314,7 @@ macro_rules! glib_boxed_inline_wrapper {
312314

313315
fn to_glib_full_from_slice(t: &[Self]) -> *mut $ffi_name {
314316
let v_ptr = unsafe {
315-
let v_ptr = $crate::ffi::g_malloc0(std::mem::size_of::<$ffi_name>()) as *mut $ffi_name;
317+
let v_ptr = $crate::ffi::g_malloc(std::mem::size_of::<$ffi_name>()) as *mut $ffi_name;
316318

317319
for (i, s) in t.iter().enumerate() {
318320
let copy_into = |$copy_into_arg_dest: *mut $ffi_name, $copy_into_arg_src: *const $ffi_name| $copy_into_expr;

glib/src/object.rs

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -816,19 +816,22 @@ macro_rules! glib_object_wrapper {
816816

817817
fn to_glib_none_from_slice(t: &'a [Self]) -> (*mut *mut $ffi_name, Self::Storage) {
818818
let mut v_ptr = Vec::with_capacity(t.len() + 1);
819-
v_ptr.extend(t.iter().map(|t| <Self as $crate::ObjectType>::as_ptr(t)));
820-
v_ptr.push(std::ptr::null_mut());
819+
unsafe {
820+
let ptr = v_ptr.as_mut_ptr();
821+
std::ptr::copy_nonoverlapping(t.as_ptr() as *mut *mut $ffi_name, ptr, t.len());
822+
std::ptr::write(ptr.add(t.len()), std::ptr::null_mut());
823+
v_ptr.set_len(t.len() + 1);
824+
}
821825

822826
(v_ptr.as_ptr() as *mut *mut $ffi_name, (std::marker::PhantomData, Some(v_ptr)))
823827
}
824828

825829
fn to_glib_container_from_slice(t: &'a [Self]) -> (*mut *mut $ffi_name, Self::Storage) {
826830
let v_ptr = unsafe {
827-
let v_ptr = $crate::ffi::g_malloc0(std::mem::size_of::<*mut $ffi_name>() * (t.len() + 1)) as *mut *mut $ffi_name;
831+
let v_ptr = $crate::ffi::g_malloc(std::mem::size_of::<*mut $ffi_name>() * (t.len() + 1)) as *mut *mut $ffi_name;
828832

829-
for (i, t) in t.iter().enumerate() {
830-
std::ptr::write(v_ptr.add(i), <Self as $crate::ObjectType>::as_ptr(t));
831-
}
833+
std::ptr::copy_nonoverlapping(t.as_ptr() as *mut *mut $ffi_name, v_ptr, t.len());
834+
std::ptr::write(v_ptr.add(t.len()), std::ptr::null_mut());
832835

833836
v_ptr
834837
};
@@ -838,11 +841,12 @@ macro_rules! glib_object_wrapper {
838841

839842
fn to_glib_full_from_slice(t: &[Self]) -> *mut *mut $ffi_name {
840843
unsafe {
841-
let v_ptr = $crate::ffi::g_malloc0(std::mem::size_of::<*mut $ffi_name>() * (t.len() + 1)) as *mut *mut $ffi_name;
844+
let v_ptr = $crate::ffi::g_malloc(std::mem::size_of::<*mut $ffi_name>() * (t.len() + 1)) as *mut *mut $ffi_name;
842845

843846
for (i, s) in t.iter().enumerate() {
844847
std::ptr::write(v_ptr.add(i), $crate::translate::ToGlibPtr::to_glib_full(s));
845848
}
849+
std::ptr::write(v_ptr.add(t.len()), std::ptr::null_mut());
846850

847851
v_ptr
848852
}

glib/src/shared.rs

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -118,19 +118,22 @@ macro_rules! glib_shared_wrapper {
118118

119119
fn to_glib_none_from_slice(t: &'a [Self]) -> (*mut *mut $ffi_name, Self::Storage) {
120120
let mut v_ptr = Vec::with_capacity(t.len() + 1);
121-
v_ptr.extend(t.iter().map(|t| t.as_ptr()));
122-
v_ptr.push(std::ptr::null_mut());
121+
unsafe {
122+
let ptr = v_ptr.as_mut_ptr();
123+
std::ptr::copy_nonoverlapping(t.as_ptr() as *mut *mut $ffi_name, ptr, t.len());
124+
std::ptr::write(ptr.add(t.len()), std::ptr::null_mut());
125+
v_ptr.set_len(t.len() + 1);
126+
}
123127

124128
(v_ptr.as_ptr() as *mut *mut $ffi_name, (std::marker::PhantomData, Some(v_ptr)))
125129
}
126130

127131
fn to_glib_container_from_slice(t: &'a [Self]) -> (*mut *mut $ffi_name, Self::Storage) {
128132
let v_ptr = unsafe {
129-
let v_ptr = $crate::ffi::g_malloc0(std::mem::size_of::<*mut $ffi_name>() * (t.len() + 1)) as *mut *mut $ffi_name;
133+
let v_ptr = $crate::ffi::g_malloc(std::mem::size_of::<*mut $ffi_name>() * (t.len() + 1)) as *mut *mut $ffi_name;
130134

131-
for (i, t) in t.iter().enumerate() {
132-
std::ptr::write(v_ptr.add(i), t.as_ptr());
133-
}
135+
std::ptr::copy_nonoverlapping(t.as_ptr() as *mut *mut $ffi_name, v_ptr, t.len());
136+
std::ptr::write(v_ptr.add(t.len()), std::ptr::null_mut());
134137

135138
v_ptr
136139
};
@@ -140,11 +143,12 @@ macro_rules! glib_shared_wrapper {
140143

141144
fn to_glib_full_from_slice(t: &[Self]) -> *mut *mut $ffi_name {
142145
unsafe {
143-
let v_ptr = $crate::ffi::g_malloc0(std::mem::size_of::<*mut $ffi_name>() * (t.len() + 1)) as *mut *mut $ffi_name;
146+
let v_ptr = $crate::ffi::g_malloc(std::mem::size_of::<*mut $ffi_name>() * (t.len() + 1)) as *mut *mut $ffi_name;
144147

145148
for (i, s) in t.iter().enumerate() {
146149
std::ptr::write(v_ptr.add(i), $crate::translate::ToGlibPtr::to_glib_full(s));
147150
}
151+
std::ptr::write(v_ptr.add(t.len()), std::ptr::null_mut());
148152

149153
v_ptr
150154
}

0 commit comments

Comments
 (0)