diff --git a/ports/geckolib/gecko_bindings/bindings.rs b/ports/geckolib/gecko_bindings/bindings.rs index f983c039acc..49365492493 100644 --- a/ports/geckolib/gecko_bindings/bindings.rs +++ b/ports/geckolib/gecko_bindings/bindings.rs @@ -243,6 +243,8 @@ extern "C" { pub fn Gecko_GetNodeFlags(node: *mut RawGeckoNode) -> u32; pub fn Gecko_SetNodeFlags(node: *mut RawGeckoNode, flags: u32); pub fn Gecko_UnsetNodeFlags(node: *mut RawGeckoNode, flags: u32); + pub fn Gecko_ArrayEnsureCapacity(array: *mut ::std::os::raw::c_void, + capacity: usize, size: usize); pub fn Servo_StylesheetFromUTF8Bytes(bytes: *const u8, length: u32, parsing_mode: SheetParsingMode, base: *mut ThreadSafeURIHolder, diff --git a/ports/geckolib/gecko_bindings/sugar/ns_style_auto_array.rs b/ports/geckolib/gecko_bindings/sugar/ns_style_auto_array.rs index bfcd7dc3cef..78636b8fe14 100644 --- a/ports/geckolib/gecko_bindings/sugar/ns_style_auto_array.rs +++ b/ports/geckolib/gecko_bindings/sugar/ns_style_auto_array.rs @@ -17,5 +17,5 @@ impl<'a, T> IntoIterator for &'a mut nsStyleAutoArray { type IntoIter = Chain, IterMut<'a, T>>; fn into_iter(self) -> Self::IntoIter { self.iter_mut() - } + } } \ No newline at end of file diff --git a/ports/geckolib/gecko_bindings/sugar/ns_t_array.rs b/ports/geckolib/gecko_bindings/sugar/ns_t_array.rs index 57b6495b040..d24960b727f 100644 --- a/ports/geckolib/gecko_bindings/sugar/ns_t_array.rs +++ b/ports/geckolib/gecko_bindings/sugar/ns_t_array.rs @@ -2,8 +2,10 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +use bindings::Gecko_ArrayEnsureCapacity; use std::mem; use std::ops::{Deref, DerefMut}; +use std::os::raw::c_void; use std::slice; use structs::{nsTArray, nsTArrayHeader}; @@ -33,10 +35,27 @@ impl nsTArray { debug_assert!(!self.mBuffer.is_null()); unsafe { mem::transmute(self.mBuffer) } } + fn header_mut <'a>(&'a mut self) -> &'a mut nsTArrayHeader { + debug_assert!(!self.mBuffer.is_null()); + unsafe { mem::transmute(self.mBuffer) } + } #[inline] unsafe fn slice_begin(&self) -> *mut T { debug_assert!(!self.mBuffer.is_null()); (self.mBuffer as *const nsTArrayHeader).offset(1) as *mut _ } + + fn ensure_capacity(&mut self, cap: usize) { + unsafe { + Gecko_ArrayEnsureCapacity(self as *mut nsTArray as *mut c_void, cap, mem::size_of::()) + } + } + + // unsafe because the array may contain uninits + pub unsafe fn set_len(&mut self, len: u32) { + self.ensure_capacity(len as usize); + let mut header = self.header_mut(); + header.mLength = len; + } }