From a4a95dafd1b0c4d0393cb1ff4c18837e2e38b74e Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Sun, 28 Aug 2016 11:16:47 +0530 Subject: [PATCH] stylo: Add sugar for nsCSSShadowArray --- ports/geckolib/binding_tools/regen.py | 2 +- ports/geckolib/gecko_bindings/bindings.rs | 6 ++ .../geckolib/gecko_bindings/structs_debug.rs | 5 +- .../gecko_bindings/structs_release.rs | 5 +- ports/geckolib/gecko_bindings/sugar/mod.rs | 1 + .../sugar/ns_css_shadow_array.rs | 65 +++++++++++++++++++ 6 files changed, 77 insertions(+), 7 deletions(-) create mode 100644 ports/geckolib/gecko_bindings/sugar/ns_css_shadow_array.rs diff --git a/ports/geckolib/binding_tools/regen.py b/ports/geckolib/binding_tools/regen.py index 72aeef2d5ef..601e378f2fb 100755 --- a/ports/geckolib/binding_tools/regen.py +++ b/ports/geckolib/binding_tools/regen.py @@ -143,7 +143,7 @@ COMPILATION_TARGETS = { "nsChangeHint", "SheetParsingMode", "nsMainThreadPtrHandle", "nsMainThreadPtrHolder", "nscolor", "nsFont", "FontFamilyList", "FontFamilyType", "nsIAtom", "nsStyleContext", "StyleClipPath", - "StyleBasicShapeType", "StyleBasicShape" + "StyleBasicShapeType", "StyleBasicShape", "nsCSSShadowArray", ], "void_types": [ "nsINode", "nsIDocument", "nsIPrincipal", "nsIURI", diff --git a/ports/geckolib/gecko_bindings/bindings.rs b/ports/geckolib/gecko_bindings/bindings.rs index 6ee617fc585..4a45f41d046 100644 --- a/ports/geckolib/gecko_bindings/bindings.rs +++ b/ports/geckolib/gecko_bindings/bindings.rs @@ -157,6 +157,7 @@ impl HeapSizeOf for nsStyleContext { fn heap_size_of_children(&self) -> usize { use structs::StyleClipPath; use structs::StyleBasicShapeType; use structs::StyleBasicShape; +use structs::nsCSSShadowArray; pub type RawGeckoNode = nsINode; pub enum Element { } @@ -345,6 +346,11 @@ extern "C" { max_len: u32); pub fn Gecko_AddRefCalcArbitraryThread(aPtr: *mut Calc); pub fn Gecko_ReleaseCalcArbitraryThread(aPtr: *mut Calc); + pub fn Gecko_NewCSSShadowArray(len: u32) -> *mut nsCSSShadowArray; + pub fn Gecko_AddRefCSSShadowArrayArbitraryThread(aPtr: + *mut nsCSSShadowArray); + pub fn Gecko_ReleaseCSSShadowArrayArbitraryThread(aPtr: + *mut nsCSSShadowArray); pub fn Gecko_Construct_nsStyleFont(ptr: *mut nsStyleFont); pub fn Gecko_CopyConstruct_nsStyleFont(ptr: *mut nsStyleFont, other: *const nsStyleFont); diff --git a/ports/geckolib/gecko_bindings/structs_debug.rs b/ports/geckolib/gecko_bindings/structs_debug.rs index 7edbb0a23ac..6a27a5acc60 100644 --- a/ports/geckolib/gecko_bindings/structs_debug.rs +++ b/ports/geckolib/gecko_bindings/structs_debug.rs @@ -5917,14 +5917,13 @@ fn bindgen_test_layout_nsCSSShadowItem() { #[repr(C)] #[derive(Debug)] pub struct nsCSSShadowArray { - pub mRefCnt: nsAutoRefCnt, - pub _mOwningThread: nsAutoOwningThread, + pub mRefCnt: ThreadSafeAutoRefCnt, pub mLength: u32, pub mArray: [nsCSSShadowItem; 1usize], } #[test] fn bindgen_test_layout_nsCSSShadowArray() { - assert_eq!(::std::mem::size_of::() , 48usize); + assert_eq!(::std::mem::size_of::() , 40usize); assert_eq!(::std::mem::align_of::() , 8usize); } #[repr(C)] diff --git a/ports/geckolib/gecko_bindings/structs_release.rs b/ports/geckolib/gecko_bindings/structs_release.rs index 455fbdb2cf3..8a493c90dbd 100644 --- a/ports/geckolib/gecko_bindings/structs_release.rs +++ b/ports/geckolib/gecko_bindings/structs_release.rs @@ -5895,14 +5895,13 @@ fn bindgen_test_layout_nsCSSShadowItem() { #[repr(C)] #[derive(Debug)] pub struct nsCSSShadowArray { - pub mRefCnt: nsAutoRefCnt, - pub _mOwningThread: nsAutoOwningThread, + pub mRefCnt: ThreadSafeAutoRefCnt, pub mLength: u32, pub mArray: [nsCSSShadowItem; 1usize], } #[test] fn bindgen_test_layout_nsCSSShadowArray() { - assert_eq!(::std::mem::size_of::() , 48usize); + assert_eq!(::std::mem::size_of::() , 40usize); assert_eq!(::std::mem::align_of::() , 8usize); } #[repr(C)] diff --git a/ports/geckolib/gecko_bindings/sugar/mod.rs b/ports/geckolib/gecko_bindings/sugar/mod.rs index 4dfa016d3a9..a4c6b1b98c2 100644 --- a/ports/geckolib/gecko_bindings/sugar/mod.rs +++ b/ports/geckolib/gecko_bindings/sugar/mod.rs @@ -2,6 +2,7 @@ * 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/. */ +mod ns_css_shadow_array; mod ns_style_auto_array; pub mod ns_style_coord; mod ns_t_array; diff --git a/ports/geckolib/gecko_bindings/sugar/ns_css_shadow_array.rs b/ports/geckolib/gecko_bindings/sugar/ns_css_shadow_array.rs new file mode 100644 index 00000000000..6c0a0e6dc03 --- /dev/null +++ b/ports/geckolib/gecko_bindings/sugar/ns_css_shadow_array.rs @@ -0,0 +1,65 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * 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_AddRefCSSShadowArrayArbitraryThread; +use bindings::Gecko_NewCSSShadowArray; +use bindings::Gecko_ReleaseCSSShadowArrayArbitraryThread; +use std::ops::{Deref, DerefMut}; +use std::{ptr, slice}; +use structs::{nsCSSShadowArray, nsCSSShadowItem, RefPtr}; + +impl RefPtr { + pub fn replace_with_new(&mut self, len: u32) { + unsafe { + if !self.mRawPtr.is_null() { + Gecko_ReleaseCSSShadowArrayArbitraryThread(self.mRawPtr); + } + + self.mRawPtr = if len == 0 { + ptr::null_mut() + } else { + Gecko_NewCSSShadowArray(len) + } + } + } + pub fn copy_from(&mut self, other: &Self) { + unsafe { + if !self.mRawPtr.is_null() { + Gecko_ReleaseCSSShadowArrayArbitraryThread(self.mRawPtr); + } + if !other.mRawPtr.is_null() { + Gecko_AddRefCSSShadowArrayArbitraryThread(other.mRawPtr); + } + + self.mRawPtr = other.mRawPtr; + } + } +} + +impl Deref for RefPtr { + type Target = [nsCSSShadowItem]; + fn deref(&self) -> &[nsCSSShadowItem] { + if self.mRawPtr.is_null() { + &[] + } else { + unsafe { + slice::from_raw_parts((*self.mRawPtr).mArray.as_ptr(), + (*self.mRawPtr).mLength as usize) + } + } + } +} + +impl DerefMut for RefPtr { + fn deref_mut(&mut self) -> &mut [nsCSSShadowItem] { + if self.mRawPtr.is_null() { + &mut [] + } else { + unsafe { + slice::from_raw_parts_mut((*self.mRawPtr).mArray.as_mut_ptr(), + (*self.mRawPtr).mLength as usize) + } + } + } +}