diff --git a/components/style/gecko/generated/bindings.rs b/components/style/gecko/generated/bindings.rs index 2987408705d..c88d389bd3b 100644 --- a/components/style/gecko/generated/bindings.rs +++ b/components/style/gecko/generated/bindings.rs @@ -1,13 +1,13 @@ /* automatically generated by rust-bindgen */ pub use nsstring::{nsACString, nsAString, nsString, nsStringRepr}; +use gecko_bindings::structs::nsTArray; type nsACString_internal = nsACString; type nsAString_internal = nsAString; use gecko_bindings::structs::mozilla::css::GridTemplateAreasValue; use gecko_bindings::structs::mozilla::css::ImageValue; use gecko_bindings::structs::mozilla::css::URLValue; use gecko_bindings::structs::mozilla::Side; -use gecko_bindings::structs::already_AddRefed; use gecko_bindings::structs::RawGeckoAnimationPropertySegment; use gecko_bindings::structs::RawGeckoComputedTiming; use gecko_bindings::structs::RawGeckoCSSPropertyIDList; @@ -190,7 +190,6 @@ unsafe impl Sync for nsStyleVisibility {} use gecko_bindings::structs::nsStyleXUL; unsafe impl Send for nsStyleXUL {} unsafe impl Sync for nsStyleXUL {} -use gecko_bindings::structs::nsTArray; use gecko_bindings::structs::nsTimingFunction; use gecko_bindings::structs::nscolor; use gecko_bindings::structs::nscoord; @@ -1238,7 +1237,7 @@ extern "C" { } extern "C" { pub fn Gecko_CSSValue_SetAtomIdent(css_value: nsCSSValueBorrowedMut, - atom: already_AddRefed); + atom: *mut nsIAtom); } extern "C" { pub fn Gecko_CSSValue_SetArray(css_value: nsCSSValueBorrowedMut, @@ -1982,7 +1981,7 @@ extern "C" { } extern "C" { pub fn Servo_KeyframesRule_SetName(rule: RawServoKeyframesRuleBorrowed, - name: already_AddRefed); + name: *mut nsIAtom); } extern "C" { pub fn Servo_KeyframesRule_GetCount(rule: RawServoKeyframesRuleBorrowed) diff --git a/components/style/gecko/wrapper.rs b/components/style/gecko/wrapper.rs index 71e26e104a4..e043ff57223 100644 --- a/components/style/gecko/wrapper.rs +++ b/components/style/gecko/wrapper.rs @@ -54,7 +54,6 @@ use gecko_bindings::structs::ELEMENT_HAS_SNAPSHOT; use gecko_bindings::structs::EffectCompositor_CascadeLevel as CascadeLevel; use gecko_bindings::structs::NODE_IS_IN_NATIVE_ANONYMOUS_SUBTREE; use gecko_bindings::structs::NODE_IS_NATIVE_ANONYMOUS; -use gecko_bindings::structs::already_AddRefed; use gecko_bindings::sugar::ownership::HasArcFFI; use logical_geometry::WritingMode; use media_queries::Device; @@ -1075,13 +1074,13 @@ impl<'le> PresentationalHintsSynthesizer for GeckoElement<'le> { // // http://www.whatwg.org/specs/web-apps/current-work/multipage/elements.html#language let ptr = unsafe { - already_AddRefed::new(bindings::Gecko_GetXMLLangValue(self.0)) + bindings::Gecko_GetXMLLangValue(self.0) }; - if let Some(ptr) = ptr { + if !ptr.is_null() { let global_style_data = &*GLOBAL_STYLE_DATA; let pdb = PropertyDeclarationBlock::with_one( - PropertyDeclaration::XLang(SpecifiedLang(ptr.into())), + PropertyDeclaration::XLang(SpecifiedLang(unsafe { Atom::from_addrefed(ptr) })), Importance::Normal ); let arc = Arc::new(global_style_data.shared_lock.wrap(pdb)); diff --git a/components/style/gecko_bindings/sugar/already_addrefed.rs b/components/style/gecko_bindings/sugar/already_addrefed.rs deleted file mode 100644 index 01e209fc81f..00000000000 --- a/components/style/gecko_bindings/sugar/already_addrefed.rs +++ /dev/null @@ -1,48 +0,0 @@ -/* 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/. */ - -//! little helpers for `already_AddRefed`. - -use gecko_bindings::structs::already_AddRefed; -use std::marker::PhantomData; -use std::mem; - -impl already_AddRefed { - /// Create an already_AddRefed from an addrefed pointer. - #[inline] - pub unsafe fn new(ptr: *mut T) -> Option { - if !ptr.is_null() { - Some(Self::new_unchecked(ptr)) - } else { - None - } - } - - /// Create an already_AddRefed from an non-nullable addrefed pointer. - #[inline] - pub unsafe fn new_unchecked(ptr: *mut T) -> Self { - debug_assert!(!ptr.is_null()); - already_AddRefed { - mRawPtr: ptr, - _phantom_0: PhantomData, - } - } - - /// Take the addrefed pointer from this struct. - #[inline] - pub fn take(self) -> *mut T { - let ptr = self.mRawPtr; - mem::forget(self); - ptr - } -} - -#[cfg(debug_assertions)] -impl Drop for already_AddRefed { - fn drop(&mut self) { - // We really should instead mark already_AddRefed must_use, but - // we cannot currently, which is servo/rust-bindgen#710. - unreachable!("Destructor shouldn't be called, otherwise we are leaking") - } -} diff --git a/components/style/gecko_bindings/sugar/mod.rs b/components/style/gecko_bindings/sugar/mod.rs index 112a8d8e4fa..f241c94810b 100644 --- a/components/style/gecko_bindings/sugar/mod.rs +++ b/components/style/gecko_bindings/sugar/mod.rs @@ -4,7 +4,6 @@ //! Rust sugar and convenience methods for Gecko types. -mod already_addrefed; mod ns_com_ptr; mod ns_compatibility; mod ns_css_shadow_array; diff --git a/components/style/gecko_bindings/sugar/ns_css_value.rs b/components/style/gecko_bindings/sugar/ns_css_value.rs index 13c3c5a825c..0f91fc4f27a 100644 --- a/components/style/gecko_bindings/sugar/ns_css_value.rs +++ b/components/style/gecko_bindings/sugar/ns_css_value.rs @@ -152,7 +152,7 @@ impl nsCSSValue { /// Set to an atom identifier value pub fn set_atom_ident(&mut self, s: Atom) { - unsafe { bindings::Gecko_CSSValue_SetAtomIdent(self, s.into()) } + unsafe { bindings::Gecko_CSSValue_SetAtomIdent(self, s.into_addrefed()) } } /// Set to a font format diff --git a/components/style/gecko_string_cache/mod.rs b/components/style/gecko_string_cache/mod.rs index 08933c053ff..fa89f5eab48 100644 --- a/components/style/gecko_string_cache/mod.rs +++ b/components/style/gecko_string_cache/mod.rs @@ -10,7 +10,7 @@ use gecko_bindings::bindings::Gecko_AddRefAtom; use gecko_bindings::bindings::Gecko_Atomize; use gecko_bindings::bindings::Gecko_Atomize16; use gecko_bindings::bindings::Gecko_ReleaseAtom; -use gecko_bindings::structs::{already_AddRefed, nsIAtom}; +use gecko_bindings::structs::nsIAtom; use nsstring::nsAString; use precomputed_hash::PrecomputedHash; use std::ascii::AsciiExt; @@ -219,6 +219,24 @@ impl Atom { atom } + /// Creates an atom from a dynamic atom pointer that has already had AddRef + /// called on it. + #[inline] + pub unsafe fn from_addrefed(ptr: *mut nsIAtom) -> Self { + debug_assert!(!ptr.is_null()); + unsafe { + Atom(WeakAtom::new(ptr)) + } + } + + /// Convert this atom into an addrefed nsIAtom pointer. + #[inline] + pub fn into_addrefed(self) -> *mut nsIAtom { + let ptr = self.as_ptr(); + mem::forget(self); + ptr + } + /// Return whether two atoms are ASCII-case-insensitive matches pub fn eq_ignore_ascii_case(&self, other: &Self) -> bool { let a = self.as_slice(); @@ -340,19 +358,3 @@ impl From<*mut nsIAtom> for Atom { } } } - -impl From> for Atom { - #[inline] - fn from(ptr: already_AddRefed) -> Atom { - unsafe { Atom(WeakAtom::new(ptr.take())) } - } -} - -impl From for already_AddRefed { - #[inline] - fn from(atom: Atom) -> already_AddRefed { - let ptr = atom.as_ptr(); - mem::forget(atom); - unsafe { already_AddRefed::new_unchecked(ptr) } - } -} diff --git a/ports/geckolib/glue.rs b/ports/geckolib/glue.rs index 55c031351c8..bc4db3e7204 100644 --- a/ports/geckolib/glue.rs +++ b/ports/geckolib/glue.rs @@ -72,7 +72,6 @@ use style::gecko_bindings::structs::Loader; use style::gecko_bindings::structs::RawGeckoPresContextOwned; use style::gecko_bindings::structs::ServoElementSnapshotTable; use style::gecko_bindings::structs::URLExtraData; -use style::gecko_bindings::structs::already_AddRefed; use style::gecko_bindings::structs::nsCSSValueSharedList; use style::gecko_bindings::structs::nsCompatibility; use style::gecko_bindings::structs::nsresult; @@ -1006,10 +1005,9 @@ pub extern "C" fn Servo_KeyframesRule_GetName(rule: RawServoKeyframesRuleBorrowe } #[no_mangle] -pub extern "C" fn Servo_KeyframesRule_SetName(rule: RawServoKeyframesRuleBorrowed, - name: already_AddRefed) { +pub extern "C" fn Servo_KeyframesRule_SetName(rule: RawServoKeyframesRuleBorrowed, name: *mut nsIAtom) { write_locked_arc(rule, |rule: &mut KeyframesRule| { - rule.name = KeyframesName::Ident(CustomIdent(name.into())); + rule.name = KeyframesName::Ident(CustomIdent(unsafe { Atom::from_addrefed(name) })); }) }