mirror of
https://github.com/servo/servo.git
synced 2025-08-05 13:40:08 +01:00
style: Finish removing HasArcFFI
Use the actual Locked<T> types around (via a typedef, just for convenience). Differential Revision: https://phabricator.services.mozilla.com/D177824
This commit is contained in:
parent
3f03650c88
commit
e9bf977369
6 changed files with 147 additions and 311 deletions
|
@ -2,22 +2,12 @@
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
//! This file lists all arc FFI types and defines corresponding addref
|
//! This file lists all arc FFI types and defines corresponding addref and release functions. This
|
||||||
//! and release functions. This list corresponds to ServoArcTypeList.h
|
//! list loosely corresponds to ServoLockedArcTypeList.h file in Gecko.
|
||||||
//! file in Gecko.
|
|
||||||
|
|
||||||
#![allow(non_snake_case, missing_docs)]
|
#![allow(non_snake_case, missing_docs)]
|
||||||
|
|
||||||
use crate::gecko::url::CssUrlData;
|
use crate::gecko::url::CssUrlData;
|
||||||
use crate::gecko_bindings::structs::{
|
|
||||||
RawServoContainerRule, RawServoCounterStyleRule, RawServoDeclarationBlock,
|
|
||||||
RawServoFontFaceRule, RawServoFontFeatureValuesRule, RawServoFontPaletteValuesRule,
|
|
||||||
RawServoImportRule, RawServoKeyframe, RawServoKeyframesRule, RawServoLayerBlockRule,
|
|
||||||
RawServoLayerStatementRule, RawServoMediaList, RawServoMediaRule, RawServoMozDocumentRule,
|
|
||||||
RawServoNamespaceRule, RawServoPageRule, RawServoStyleRule, RawServoSupportsRule,
|
|
||||||
ServoCssRules,
|
|
||||||
};
|
|
||||||
use crate::gecko_bindings::sugar::ownership::HasArcFFI;
|
|
||||||
use crate::media_queries::MediaList;
|
use crate::media_queries::MediaList;
|
||||||
use crate::properties::animated_properties::AnimationValue;
|
use crate::properties::animated_properties::AnimationValue;
|
||||||
use crate::properties::{ComputedValues, PropertyDeclarationBlock};
|
use crate::properties::{ComputedValues, PropertyDeclarationBlock};
|
||||||
|
@ -30,81 +20,6 @@ use crate::stylesheets::{
|
||||||
};
|
};
|
||||||
use servo_arc::Arc;
|
use servo_arc::Arc;
|
||||||
|
|
||||||
macro_rules! impl_arc_ffi {
|
|
||||||
($servo_type:ty => $gecko_type:ty[$addref:ident, $release:ident]) => {
|
|
||||||
unsafe impl HasArcFFI for $servo_type {
|
|
||||||
type FFIType = $gecko_type;
|
|
||||||
}
|
|
||||||
|
|
||||||
#[no_mangle]
|
|
||||||
pub unsafe extern "C" fn $addref(obj: &$gecko_type) {
|
|
||||||
<$servo_type>::addref(obj);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[no_mangle]
|
|
||||||
pub unsafe extern "C" fn $release(obj: &$gecko_type) {
|
|
||||||
<$servo_type>::release(obj);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
impl_arc_ffi!(Locked<CssRules> => ServoCssRules
|
|
||||||
[Servo_CssRules_AddRef, Servo_CssRules_Release]);
|
|
||||||
|
|
||||||
impl_arc_ffi!(Locked<PropertyDeclarationBlock> => RawServoDeclarationBlock
|
|
||||||
[Servo_DeclarationBlock_AddRef, Servo_DeclarationBlock_Release]);
|
|
||||||
|
|
||||||
impl_arc_ffi!(Locked<StyleRule> => RawServoStyleRule
|
|
||||||
[Servo_StyleRule_AddRef, Servo_StyleRule_Release]);
|
|
||||||
|
|
||||||
impl_arc_ffi!(Locked<ImportRule> => RawServoImportRule
|
|
||||||
[Servo_ImportRule_AddRef, Servo_ImportRule_Release]);
|
|
||||||
|
|
||||||
impl_arc_ffi!(Locked<Keyframe> => RawServoKeyframe
|
|
||||||
[Servo_Keyframe_AddRef, Servo_Keyframe_Release]);
|
|
||||||
|
|
||||||
impl_arc_ffi!(Locked<KeyframesRule> => RawServoKeyframesRule
|
|
||||||
[Servo_KeyframesRule_AddRef, Servo_KeyframesRule_Release]);
|
|
||||||
|
|
||||||
impl_arc_ffi!(Locked<LayerBlockRule> => RawServoLayerBlockRule
|
|
||||||
[Servo_LayerBlockRule_AddRef, Servo_LayerBlockRule_Release]);
|
|
||||||
|
|
||||||
impl_arc_ffi!(Locked<LayerStatementRule> => RawServoLayerStatementRule
|
|
||||||
[Servo_LayerStatementRule_AddRef, Servo_LayerStatementRule_Release]);
|
|
||||||
|
|
||||||
impl_arc_ffi!(Locked<MediaList> => RawServoMediaList
|
|
||||||
[Servo_MediaList_AddRef, Servo_MediaList_Release]);
|
|
||||||
|
|
||||||
impl_arc_ffi!(Locked<MediaRule> => RawServoMediaRule
|
|
||||||
[Servo_MediaRule_AddRef, Servo_MediaRule_Release]);
|
|
||||||
|
|
||||||
impl_arc_ffi!(Locked<NamespaceRule> => RawServoNamespaceRule
|
|
||||||
[Servo_NamespaceRule_AddRef, Servo_NamespaceRule_Release]);
|
|
||||||
|
|
||||||
impl_arc_ffi!(Locked<PageRule> => RawServoPageRule
|
|
||||||
[Servo_PageRule_AddRef, Servo_PageRule_Release]);
|
|
||||||
|
|
||||||
impl_arc_ffi!(Locked<SupportsRule> => RawServoSupportsRule
|
|
||||||
[Servo_SupportsRule_AddRef, Servo_SupportsRule_Release]);
|
|
||||||
|
|
||||||
impl_arc_ffi!(Locked<ContainerRule> => RawServoContainerRule
|
|
||||||
[Servo_ContainerRule_AddRef, Servo_ContainerRule_Release]);
|
|
||||||
|
|
||||||
impl_arc_ffi!(Locked<DocumentRule> => RawServoMozDocumentRule
|
|
||||||
[Servo_DocumentRule_AddRef, Servo_DocumentRule_Release]);
|
|
||||||
|
|
||||||
impl_arc_ffi!(Locked<FontFeatureValuesRule> => RawServoFontFeatureValuesRule
|
|
||||||
[Servo_FontFeatureValuesRule_AddRef, Servo_FontFeatureValuesRule_Release]);
|
|
||||||
|
|
||||||
impl_arc_ffi!(Locked<FontPaletteValuesRule> => RawServoFontPaletteValuesRule
|
|
||||||
[Servo_FontPaletteValuesRule_AddRef, Servo_FontPaletteValuesRule_Release]);
|
|
||||||
|
|
||||||
impl_arc_ffi!(Locked<FontFaceRule> => RawServoFontFaceRule
|
|
||||||
[Servo_FontFaceRule_AddRef, Servo_FontFaceRule_Release]);
|
|
||||||
|
|
||||||
impl_arc_ffi!(Locked<CounterStyleRule> => RawServoCounterStyleRule
|
|
||||||
[Servo_CounterStyleRule_AddRef, Servo_CounterStyleRule_Release]);
|
|
||||||
|
|
||||||
macro_rules! impl_simple_arc_ffi {
|
macro_rules! impl_simple_arc_ffi {
|
||||||
($ty:ty, $addref:ident, $release:ident) => {
|
($ty:ty, $addref:ident, $release:ident) => {
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
|
@ -119,6 +34,129 @@ macro_rules! impl_simple_arc_ffi {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
macro_rules! impl_locked_arc_ffi {
|
||||||
|
($servo_type:ty, $alias:ident, $addref:ident, $release:ident) => {
|
||||||
|
/// A simple alias for a locked type.
|
||||||
|
pub type $alias = Locked<$servo_type>;
|
||||||
|
impl_simple_arc_ffi!($alias, $addref, $release);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
impl_locked_arc_ffi!(
|
||||||
|
CssRules,
|
||||||
|
LockedCssRules,
|
||||||
|
Servo_CssRules_AddRef,
|
||||||
|
Servo_CssRules_Release
|
||||||
|
);
|
||||||
|
impl_locked_arc_ffi!(
|
||||||
|
PropertyDeclarationBlock,
|
||||||
|
LockedDeclarationBlock,
|
||||||
|
Servo_DeclarationBlock_AddRef,
|
||||||
|
Servo_DeclarationBlock_Release
|
||||||
|
);
|
||||||
|
impl_locked_arc_ffi!(
|
||||||
|
StyleRule,
|
||||||
|
LockedStyleRule,
|
||||||
|
Servo_StyleRule_AddRef,
|
||||||
|
Servo_StyleRule_Release
|
||||||
|
);
|
||||||
|
impl_locked_arc_ffi!(
|
||||||
|
ImportRule,
|
||||||
|
LockedImportRule,
|
||||||
|
Servo_ImportRule_AddRef,
|
||||||
|
Servo_ImportRule_Release
|
||||||
|
);
|
||||||
|
impl_locked_arc_ffi!(
|
||||||
|
Keyframe,
|
||||||
|
LockedKeyframe,
|
||||||
|
Servo_Keyframe_AddRef,
|
||||||
|
Servo_Keyframe_Release
|
||||||
|
);
|
||||||
|
impl_locked_arc_ffi!(
|
||||||
|
KeyframesRule,
|
||||||
|
LockedKeyframesRule,
|
||||||
|
Servo_KeyframesRule_AddRef,
|
||||||
|
Servo_KeyframesRule_Release
|
||||||
|
);
|
||||||
|
impl_locked_arc_ffi!(
|
||||||
|
LayerBlockRule,
|
||||||
|
LockedLayerBlockRule,
|
||||||
|
Servo_LayerBlockRule_AddRef,
|
||||||
|
Servo_LayerBlockRule_Release
|
||||||
|
);
|
||||||
|
impl_locked_arc_ffi!(
|
||||||
|
LayerStatementRule,
|
||||||
|
LockedLayerStatementRule,
|
||||||
|
Servo_LayerStatementRule_AddRef,
|
||||||
|
Servo_LayerStatementRule_Release
|
||||||
|
);
|
||||||
|
impl_locked_arc_ffi!(
|
||||||
|
MediaList,
|
||||||
|
LockedMediaList,
|
||||||
|
Servo_MediaList_AddRef,
|
||||||
|
Servo_MediaList_Release
|
||||||
|
);
|
||||||
|
impl_locked_arc_ffi!(
|
||||||
|
MediaRule,
|
||||||
|
LockedMediaRule,
|
||||||
|
Servo_MediaRule_AddRef,
|
||||||
|
Servo_MediaRule_Release
|
||||||
|
);
|
||||||
|
impl_locked_arc_ffi!(
|
||||||
|
NamespaceRule,
|
||||||
|
LockedNamespaceRule,
|
||||||
|
Servo_NamespaceRule_AddRef,
|
||||||
|
Servo_NamespaceRule_Release
|
||||||
|
);
|
||||||
|
impl_locked_arc_ffi!(
|
||||||
|
PageRule,
|
||||||
|
LockedPageRule,
|
||||||
|
Servo_PageRule_AddRef,
|
||||||
|
Servo_PageRule_Release
|
||||||
|
);
|
||||||
|
impl_locked_arc_ffi!(
|
||||||
|
SupportsRule,
|
||||||
|
LockedSupportsRule,
|
||||||
|
Servo_SupportsRule_AddRef,
|
||||||
|
Servo_SupportsRule_Release
|
||||||
|
);
|
||||||
|
impl_locked_arc_ffi!(
|
||||||
|
ContainerRule,
|
||||||
|
LockedContainerRule,
|
||||||
|
Servo_ContainerRule_AddRef,
|
||||||
|
Servo_ContainerRule_Release
|
||||||
|
);
|
||||||
|
impl_locked_arc_ffi!(
|
||||||
|
DocumentRule,
|
||||||
|
LockedDocumentRule,
|
||||||
|
Servo_DocumentRule_AddRef,
|
||||||
|
Servo_DocumentRule_Release
|
||||||
|
);
|
||||||
|
impl_locked_arc_ffi!(
|
||||||
|
FontFeatureValuesRule,
|
||||||
|
LockedFontFeatureValuesRule,
|
||||||
|
Servo_FontFeatureValuesRule_AddRef,
|
||||||
|
Servo_FontFeatureValuesRule_Release
|
||||||
|
);
|
||||||
|
impl_locked_arc_ffi!(
|
||||||
|
FontPaletteValuesRule,
|
||||||
|
LockedFontPaletteValuesRule,
|
||||||
|
Servo_FontPaletteValuesRule_AddRef,
|
||||||
|
Servo_FontPaletteValuesRule_Release
|
||||||
|
);
|
||||||
|
impl_locked_arc_ffi!(
|
||||||
|
FontFaceRule,
|
||||||
|
LockedFontFaceRule,
|
||||||
|
Servo_FontFaceRule_AddRef,
|
||||||
|
Servo_FontFaceRule_Release
|
||||||
|
);
|
||||||
|
impl_locked_arc_ffi!(
|
||||||
|
CounterStyleRule,
|
||||||
|
LockedCounterStyleRule,
|
||||||
|
Servo_CounterStyleRule_AddRef,
|
||||||
|
Servo_CounterStyleRule_Release
|
||||||
|
);
|
||||||
|
|
||||||
impl_simple_arc_ffi!(
|
impl_simple_arc_ffi!(
|
||||||
StylesheetContents,
|
StylesheetContents,
|
||||||
Servo_StyleSheetContents_AddRef,
|
Servo_StyleSheetContents_AddRef,
|
||||||
|
|
|
@ -7,12 +7,11 @@
|
||||||
use crate::dom::TElement;
|
use crate::dom::TElement;
|
||||||
use crate::gecko_bindings::bindings;
|
use crate::gecko_bindings::bindings;
|
||||||
use crate::gecko_bindings::structs::{self, ServoStyleSetSizes, StyleSheet as DomStyleSheet, StyleSheetInfo};
|
use crate::gecko_bindings::structs::{self, ServoStyleSetSizes, StyleSheet as DomStyleSheet, StyleSheetInfo};
|
||||||
use crate::gecko_bindings::sugar::ownership::HasArcFFI;
|
|
||||||
use crate::invalidation::media_queries::{MediaListKey, ToMediaListKey};
|
use crate::invalidation::media_queries::{MediaListKey, ToMediaListKey};
|
||||||
use crate::media_queries::{Device, MediaList};
|
use crate::media_queries::{Device, MediaList};
|
||||||
use crate::properties::ComputedValues;
|
use crate::properties::ComputedValues;
|
||||||
use crate::selector_parser::SnapshotMap;
|
use crate::selector_parser::SnapshotMap;
|
||||||
use crate::shared_lock::{Locked, SharedRwLockReadGuard, StylesheetGuards};
|
use crate::shared_lock::{SharedRwLockReadGuard, StylesheetGuards};
|
||||||
use crate::stylesheets::{StylesheetContents, StylesheetInDocument};
|
use crate::stylesheets::{StylesheetContents, StylesheetInDocument};
|
||||||
use crate::stylist::Stylist;
|
use crate::stylist::Stylist;
|
||||||
use atomic_refcell::{AtomicRef, AtomicRefCell, AtomicRefMut};
|
use atomic_refcell::{AtomicRef, AtomicRefCell, AtomicRefMut};
|
||||||
|
@ -102,15 +101,12 @@ impl Clone for GeckoStyleSheet {
|
||||||
impl StylesheetInDocument for GeckoStyleSheet {
|
impl StylesheetInDocument for GeckoStyleSheet {
|
||||||
fn media<'a>(&'a self, guard: &'a SharedRwLockReadGuard) -> Option<&'a MediaList> {
|
fn media<'a>(&'a self, guard: &'a SharedRwLockReadGuard) -> Option<&'a MediaList> {
|
||||||
use crate::gecko_bindings::structs::mozilla::dom::MediaList as DomMediaList;
|
use crate::gecko_bindings::structs::mozilla::dom::MediaList as DomMediaList;
|
||||||
use std::mem;
|
|
||||||
|
|
||||||
unsafe {
|
unsafe {
|
||||||
let dom_media_list = self.raw().mMedia.mRawPtr as *const DomMediaList;
|
let dom_media_list = self.raw().mMedia.mRawPtr as *const DomMediaList;
|
||||||
if dom_media_list.is_null() {
|
if dom_media_list.is_null() {
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
let raw_list = &*(*dom_media_list).mRawList.mRawPtr;
|
let list = &*(*dom_media_list).mRawList.mRawPtr;
|
||||||
let list = Locked::<MediaList>::as_arc(mem::transmute(&raw_list));
|
|
||||||
Some(list.read_with(guard))
|
Some(list.read_with(guard))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,7 +48,6 @@ use crate::gecko_bindings::structs::NODE_DESCENDANTS_NEED_FRAMES;
|
||||||
use crate::gecko_bindings::structs::NODE_NEEDS_FRAME;
|
use crate::gecko_bindings::structs::NODE_NEEDS_FRAME;
|
||||||
use crate::gecko_bindings::structs::{nsAtom, nsIContent, nsINode_BooleanFlag};
|
use crate::gecko_bindings::structs::{nsAtom, nsIContent, nsINode_BooleanFlag};
|
||||||
use crate::gecko_bindings::structs::{nsINode as RawGeckoNode, Element as RawGeckoElement};
|
use crate::gecko_bindings::structs::{nsINode as RawGeckoNode, Element as RawGeckoElement};
|
||||||
use crate::gecko_bindings::sugar::ownership::HasArcFFI;
|
|
||||||
use crate::global_style_data::GLOBAL_STYLE_DATA;
|
use crate::global_style_data::GLOBAL_STYLE_DATA;
|
||||||
use crate::invalidation::element::restyle_hints::RestyleHint;
|
use crate::invalidation::element::restyle_hints::RestyleHint;
|
||||||
use crate::media_queries::Device;
|
use crate::media_queries::Device;
|
||||||
|
@ -75,7 +74,7 @@ use selectors::matching::VisitedHandlingMode;
|
||||||
use selectors::matching::{ElementSelectorFlags, MatchingContext};
|
use selectors::matching::{ElementSelectorFlags, MatchingContext};
|
||||||
use selectors::sink::Push;
|
use selectors::sink::Push;
|
||||||
use selectors::{Element, OpaqueElement};
|
use selectors::{Element, OpaqueElement};
|
||||||
use servo_arc::{Arc, ArcBorrow, RawOffsetArc};
|
use servo_arc::{Arc, ArcBorrow};
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
use std::hash::{Hash, Hasher};
|
use std::hash::{Hash, Hasher};
|
||||||
use std::mem;
|
use std::mem;
|
||||||
|
@ -1139,10 +1138,10 @@ impl<'le> TElement for GeckoElement<'le> {
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
|
|
||||||
let declarations = unsafe { Gecko_GetStyleAttrDeclarationBlock(self.0).as_ref() };
|
unsafe {
|
||||||
let declarations: Option<&RawOffsetArc<Locked<PropertyDeclarationBlock>>> =
|
let declarations = Gecko_GetStyleAttrDeclarationBlock(self.0).as_ref()?;
|
||||||
declarations.and_then(|s| s.as_arc_opt());
|
Some(ArcBorrow::from_ref(declarations))
|
||||||
declarations.map(|s| s.borrow_arc())
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn unset_dirty_style_attribute(&self) {
|
fn unset_dirty_style_attribute(&self) {
|
||||||
|
@ -1160,14 +1159,8 @@ impl<'le> TElement for GeckoElement<'le> {
|
||||||
let declaration: &structs::DeclarationBlock =
|
let declaration: &structs::DeclarationBlock =
|
||||||
slots.mSMILOverrideStyleDeclaration.mRawPtr.as_ref()?;
|
slots.mSMILOverrideStyleDeclaration.mRawPtr.as_ref()?;
|
||||||
|
|
||||||
let raw: &structs::RawServoDeclarationBlock = declaration.mRaw.mRawPtr.as_ref()?;
|
let raw: &structs::StyleLockedDeclarationBlock = declaration.mRaw.mRawPtr.as_ref()?;
|
||||||
|
Some(ArcBorrow::from_ref(raw))
|
||||||
Some(
|
|
||||||
Locked::<PropertyDeclarationBlock>::as_arc(
|
|
||||||
&*(&raw as *const &structs::RawServoDeclarationBlock),
|
|
||||||
)
|
|
||||||
.borrow_arc(),
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1652,21 +1645,17 @@ impl<'le> TElement for GeckoElement<'le> {
|
||||||
}
|
}
|
||||||
let declarations =
|
let declarations =
|
||||||
unsafe { Gecko_GetHTMLPresentationAttrDeclarationBlock(self.0).as_ref() };
|
unsafe { Gecko_GetHTMLPresentationAttrDeclarationBlock(self.0).as_ref() };
|
||||||
let declarations: Option<&RawOffsetArc<Locked<PropertyDeclarationBlock>>> =
|
|
||||||
declarations.and_then(|s| s.as_arc_opt());
|
|
||||||
if let Some(decl) = declarations {
|
if let Some(decl) = declarations {
|
||||||
hints.push(ApplicableDeclarationBlock::from_declarations(
|
hints.push(ApplicableDeclarationBlock::from_declarations(
|
||||||
decl.clone_arc(),
|
unsafe { Arc::from_raw_addrefed(decl) },
|
||||||
ServoCascadeLevel::PresHints,
|
ServoCascadeLevel::PresHints,
|
||||||
LayerOrder::root(),
|
LayerOrder::root(),
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
let declarations = unsafe { Gecko_GetExtraContentStyleDeclarations(self.0).as_ref() };
|
let declarations = unsafe { Gecko_GetExtraContentStyleDeclarations(self.0).as_ref() };
|
||||||
let declarations: Option<&RawOffsetArc<Locked<PropertyDeclarationBlock>>> =
|
|
||||||
declarations.and_then(|s| s.as_arc_opt());
|
|
||||||
if let Some(decl) = declarations {
|
if let Some(decl) = declarations {
|
||||||
hints.push(ApplicableDeclarationBlock::from_declarations(
|
hints.push(ApplicableDeclarationBlock::from_declarations(
|
||||||
decl.clone_arc(),
|
unsafe { Arc::from_raw_addrefed(decl) },
|
||||||
ServoCascadeLevel::PresHints,
|
ServoCascadeLevel::PresHints,
|
||||||
LayerOrder::root(),
|
LayerOrder::root(),
|
||||||
));
|
));
|
||||||
|
@ -1690,11 +1679,9 @@ impl<'le> TElement for GeckoElement<'le> {
|
||||||
Gecko_GetVisitedLinkAttrDeclarationBlock(self.0).as_ref()
|
Gecko_GetVisitedLinkAttrDeclarationBlock(self.0).as_ref()
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
let declarations: Option<&RawOffsetArc<Locked<PropertyDeclarationBlock>>> =
|
|
||||||
declarations.and_then(|s| s.as_arc_opt());
|
|
||||||
if let Some(decl) = declarations {
|
if let Some(decl) = declarations {
|
||||||
hints.push(ApplicableDeclarationBlock::from_declarations(
|
hints.push(ApplicableDeclarationBlock::from_declarations(
|
||||||
decl.clone_arc(),
|
unsafe { Arc::from_raw_addrefed(decl) },
|
||||||
ServoCascadeLevel::PresHints,
|
ServoCascadeLevel::PresHints,
|
||||||
LayerOrder::root(),
|
LayerOrder::root(),
|
||||||
));
|
));
|
||||||
|
@ -1706,11 +1693,9 @@ impl<'le> TElement for GeckoElement<'le> {
|
||||||
if active {
|
if active {
|
||||||
let declarations =
|
let declarations =
|
||||||
unsafe { Gecko_GetActiveLinkAttrDeclarationBlock(self.0).as_ref() };
|
unsafe { Gecko_GetActiveLinkAttrDeclarationBlock(self.0).as_ref() };
|
||||||
let declarations: Option<&RawOffsetArc<Locked<PropertyDeclarationBlock>>> =
|
|
||||||
declarations.and_then(|s| s.as_arc_opt());
|
|
||||||
if let Some(decl) = declarations {
|
if let Some(decl) = declarations {
|
||||||
hints.push(ApplicableDeclarationBlock::from_declarations(
|
hints.push(ApplicableDeclarationBlock::from_declarations(
|
||||||
decl.clone_arc(),
|
unsafe { Arc::from_raw_addrefed(decl) },
|
||||||
ServoCascadeLevel::PresHints,
|
ServoCascadeLevel::PresHints,
|
||||||
LayerOrder::root(),
|
LayerOrder::root(),
|
||||||
));
|
));
|
||||||
|
|
|
@ -5,85 +5,11 @@
|
||||||
//! Helpers for different FFI pointer kinds that Gecko's FFI layer uses.
|
//! Helpers for different FFI pointer kinds that Gecko's FFI layer uses.
|
||||||
|
|
||||||
use crate::gecko_bindings::structs::root::mozilla::detail::CopyablePtr;
|
use crate::gecko_bindings::structs::root::mozilla::detail::CopyablePtr;
|
||||||
use servo_arc::{Arc, RawOffsetArc};
|
use servo_arc::Arc;
|
||||||
use std::marker::PhantomData;
|
use std::marker::PhantomData;
|
||||||
use std::mem::{forget, transmute};
|
|
||||||
use std::ops::{Deref, DerefMut};
|
use std::ops::{Deref, DerefMut};
|
||||||
use std::ptr;
|
use std::ptr;
|
||||||
|
|
||||||
/// Helper trait for conversions between FFI Strong/Borrowed types and Arcs
|
|
||||||
///
|
|
||||||
/// Should be implemented by types which are passed over FFI as Arcs via Strong
|
|
||||||
/// and Borrowed.
|
|
||||||
///
|
|
||||||
/// In this case, the FFIType is the rough equivalent of ArcInner<Self>.
|
|
||||||
pub unsafe trait HasArcFFI: Sized + 'static {
|
|
||||||
/// The corresponding Gecko type that this rust type represents.
|
|
||||||
///
|
|
||||||
/// See the examples in `components/style/gecko/conversions.rs`.
|
|
||||||
type FFIType: Sized;
|
|
||||||
|
|
||||||
// these methods can't be on Borrowed because it leads to an unspecified
|
|
||||||
// impl parameter
|
|
||||||
/// Artificially increments the refcount of a (possibly null) borrowed Arc
|
|
||||||
/// over FFI.
|
|
||||||
unsafe fn addref_opt(ptr: Option<&Self::FFIType>) {
|
|
||||||
forget(Self::arc_from_borrowed(&ptr).clone())
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Given a (possibly null) borrowed FFI reference, decrements the refcount.
|
|
||||||
/// Unsafe since it doesn't consume the backing Arc. Run it only when you
|
|
||||||
/// know that a strong reference to the backing Arc is disappearing
|
|
||||||
/// (usually on the C++ side) without running the Arc destructor.
|
|
||||||
unsafe fn release_opt(ptr: Option<&Self::FFIType>) {
|
|
||||||
if let Some(arc) = Self::arc_from_borrowed(&ptr) {
|
|
||||||
let _: RawOffsetArc<_> = ptr::read(arc as *const RawOffsetArc<_>);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Artificially increments the refcount of a borrowed Arc over FFI.
|
|
||||||
unsafe fn addref(ptr: &Self::FFIType) {
|
|
||||||
forget(Self::as_arc(&ptr).clone())
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Given a non-null borrowed FFI reference, decrements the refcount.
|
|
||||||
/// Unsafe since it doesn't consume the backing Arc. Run it only when you
|
|
||||||
/// know that a strong reference to the backing Arc is disappearing
|
|
||||||
/// (usually on the C++ side) without running the Arc destructor.
|
|
||||||
unsafe fn release(ptr: &Self::FFIType) {
|
|
||||||
let _: RawOffsetArc<_> = ptr::read(Self::as_arc(&ptr) as *const RawOffsetArc<_>);
|
|
||||||
}
|
|
||||||
#[inline]
|
|
||||||
/// Converts a borrowed FFI reference to a borrowed Arc.
|
|
||||||
///
|
|
||||||
/// &GeckoType -> &Arc<ServoType>
|
|
||||||
fn as_arc<'a>(ptr: &'a &Self::FFIType) -> &'a RawOffsetArc<Self> {
|
|
||||||
unsafe { transmute::<&&Self::FFIType, &RawOffsetArc<Self>>(ptr) }
|
|
||||||
}
|
|
||||||
|
|
||||||
#[inline]
|
|
||||||
/// Converts a borrowed Arc to a borrowed FFI reference.
|
|
||||||
///
|
|
||||||
/// &Arc<ServoType> -> &GeckoType
|
|
||||||
fn arc_as_borrowed<'a>(arc: &'a RawOffsetArc<Self>) -> &'a &Self::FFIType {
|
|
||||||
unsafe { transmute::<&RawOffsetArc<Self>, &&Self::FFIType>(arc) }
|
|
||||||
}
|
|
||||||
|
|
||||||
#[inline]
|
|
||||||
/// Converts a borrowed nullable FFI reference to a borrowed Arc.
|
|
||||||
///
|
|
||||||
/// &GeckoType -> &Arc<ServoType>
|
|
||||||
fn arc_from_borrowed<'a>(ptr: &'a Option<&Self::FFIType>) -> Option<&'a RawOffsetArc<Self>> {
|
|
||||||
unsafe {
|
|
||||||
if let Some(ref reference) = *ptr {
|
|
||||||
Some(transmute::<&&Self::FFIType, &RawOffsetArc<_>>(reference))
|
|
||||||
} else {
|
|
||||||
None
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Gecko-FFI-safe Arc (T is an ArcInner).
|
/// Gecko-FFI-safe Arc (T is an ArcInner).
|
||||||
///
|
///
|
||||||
/// This can be null.
|
/// This can be null.
|
||||||
|
@ -112,98 +38,12 @@ impl<GeckoType> Strong<GeckoType> {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
/// Given a non-null strong FFI reference, converts it into a servo-side
|
/// Returns a null pointer
|
||||||
/// Arc.
|
|
||||||
///
|
|
||||||
/// Panics on null.
|
|
||||||
///
|
|
||||||
/// Strong<GeckoType> -> Arc<ServoType>
|
|
||||||
pub fn into_arc<ServoType>(self) -> RawOffsetArc<ServoType>
|
|
||||||
where
|
|
||||||
ServoType: HasArcFFI<FFIType = GeckoType>,
|
|
||||||
{
|
|
||||||
self.into_arc_opt().unwrap()
|
|
||||||
}
|
|
||||||
|
|
||||||
#[inline]
|
|
||||||
/// Given a strong FFI reference,
|
|
||||||
/// converts it into a servo-side Arc
|
|
||||||
/// Returns None on null.
|
|
||||||
///
|
|
||||||
/// Strong<GeckoType> -> Arc<ServoType>
|
|
||||||
pub fn into_arc_opt<ServoType>(self) -> Option<RawOffsetArc<ServoType>>
|
|
||||||
where
|
|
||||||
ServoType: HasArcFFI<FFIType = GeckoType>,
|
|
||||||
{
|
|
||||||
if self.is_null() {
|
|
||||||
None
|
|
||||||
} else {
|
|
||||||
unsafe { Some(transmute(self)) }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[inline]
|
|
||||||
/// Given a reference to a strong FFI reference, converts it to a reference
|
|
||||||
/// to a servo-side Arc.
|
|
||||||
///
|
|
||||||
/// Returns None on null.
|
|
||||||
///
|
|
||||||
/// Strong<GeckoType> -> Arc<ServoType>
|
|
||||||
pub fn as_arc_opt<ServoType>(&self) -> Option<&RawOffsetArc<ServoType>>
|
|
||||||
where
|
|
||||||
ServoType: HasArcFFI<FFIType = GeckoType>,
|
|
||||||
{
|
|
||||||
if self.is_null() {
|
|
||||||
None
|
|
||||||
} else {
|
|
||||||
unsafe { Some(transmute(self)) }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[inline]
|
|
||||||
/// Produces a null strong FFI reference.
|
|
||||||
pub fn null() -> Self {
|
pub fn null() -> Self {
|
||||||
unsafe { transmute(ptr::null::<GeckoType>()) }
|
Self {
|
||||||
}
|
ptr: ptr::null(),
|
||||||
}
|
_marker: PhantomData,
|
||||||
|
}
|
||||||
/// A few helpers implemented on top of Arc<ServoType> to make it more
|
|
||||||
/// comfortable to use and write safe code with.
|
|
||||||
pub unsafe trait FFIArcHelpers<T: HasArcFFI> {
|
|
||||||
/// Converts an Arc into a strong FFI reference.
|
|
||||||
///
|
|
||||||
/// Arc<ServoType> -> Strong<GeckoType>
|
|
||||||
fn into_strong(self) -> Strong<T::FFIType>;
|
|
||||||
|
|
||||||
/// Produces a borrowed FFI reference by borrowing an Arc.
|
|
||||||
///
|
|
||||||
/// &Arc<ServoType> -> &GeckoType
|
|
||||||
///
|
|
||||||
/// Then the `arc_as_borrowed` method can go away.
|
|
||||||
fn as_borrowed(&self) -> &T::FFIType;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsafe impl<T: HasArcFFI> FFIArcHelpers<T> for RawOffsetArc<T> {
|
|
||||||
#[inline]
|
|
||||||
fn into_strong(self) -> Strong<T::FFIType> {
|
|
||||||
unsafe { transmute(self) }
|
|
||||||
}
|
|
||||||
|
|
||||||
#[inline]
|
|
||||||
fn as_borrowed(&self) -> &T::FFIType {
|
|
||||||
unsafe { &*(&**self as *const T as *const T::FFIType) }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
unsafe impl<T: HasArcFFI> FFIArcHelpers<T> for Arc<T> {
|
|
||||||
#[inline]
|
|
||||||
fn into_strong(self) -> Strong<T::FFIType> {
|
|
||||||
Arc::into_raw_offset(self).into_strong()
|
|
||||||
}
|
|
||||||
|
|
||||||
#[inline]
|
|
||||||
fn as_borrowed(&self) -> &T::FFIType {
|
|
||||||
unsafe { &*(&**self as *const T as *const T::FFIType) }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4,14 +4,13 @@
|
||||||
|
|
||||||
//! A rust helper to ease the use of Gecko's refcounted types.
|
//! A rust helper to ease the use of Gecko's refcounted types.
|
||||||
|
|
||||||
use crate::gecko_bindings::sugar::ownership::HasArcFFI;
|
|
||||||
use crate::gecko_bindings::{bindings, structs};
|
use crate::gecko_bindings::{bindings, structs};
|
||||||
use crate::Atom;
|
use crate::Atom;
|
||||||
use servo_arc::Arc;
|
use servo_arc::Arc;
|
||||||
|
use std::fmt::Write;
|
||||||
use std::marker::PhantomData;
|
use std::marker::PhantomData;
|
||||||
use std::ops::Deref;
|
use std::ops::Deref;
|
||||||
use std::{fmt, mem, ptr};
|
use std::{fmt, mem, ptr};
|
||||||
use std::fmt::Write;
|
|
||||||
|
|
||||||
/// Trait for all objects that have Addref() and Release
|
/// Trait for all objects that have Addref() and Release
|
||||||
/// methods and can be placed inside RefPtr<T>
|
/// methods and can be placed inside RefPtr<T>
|
||||||
|
@ -200,17 +199,6 @@ impl<T> structs::RefPtr<T> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Create a new RefPtr from an arc.
|
|
||||||
pub fn from_arc_ffi<U>(s: Arc<U>) -> Self
|
|
||||||
where
|
|
||||||
U: HasArcFFI<FFIType = T>,
|
|
||||||
{
|
|
||||||
Self {
|
|
||||||
mRawPtr: unsafe { mem::transmute(Arc::into_raw_offset(s)) },
|
|
||||||
_phantom_0: PhantomData,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Sets the contents to an Arc<T>.
|
/// Sets the contents to an Arc<T>.
|
||||||
pub fn set_arc(&mut self, other: Arc<T>) {
|
pub fn set_arc(&mut self, other: Arc<T>) {
|
||||||
unsafe {
|
unsafe {
|
||||||
|
@ -220,17 +208,6 @@ impl<T> structs::RefPtr<T> {
|
||||||
self.mRawPtr = Arc::into_raw(other) as *mut _;
|
self.mRawPtr = Arc::into_raw(other) as *mut _;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Sets the contents to an Arc<U>.
|
|
||||||
pub fn set_arc_ffi<U>(&mut self, other: Arc<U>)
|
|
||||||
where
|
|
||||||
U: HasArcFFI<FFIType = T>,
|
|
||||||
{
|
|
||||||
unsafe {
|
|
||||||
U::release_opt(self.mRawPtr.as_ref());
|
|
||||||
}
|
|
||||||
*self = unsafe { mem::transmute(Arc::into_raw_offset(other)) };
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: RefCounted> Drop for RefPtr<T> {
|
impl<T: RefCounted> Drop for RefPtr<T> {
|
||||||
|
|
|
@ -13,7 +13,7 @@ use crate::stylesheets::stylesheet::StylesheetContents;
|
||||||
use crate::stylesheets::{AllowImportRules, CssRule, RulesMutateError};
|
use crate::stylesheets::{AllowImportRules, CssRule, RulesMutateError};
|
||||||
#[cfg(feature = "gecko")]
|
#[cfg(feature = "gecko")]
|
||||||
use malloc_size_of::{MallocShallowSizeOf, MallocSizeOfOps};
|
use malloc_size_of::{MallocShallowSizeOf, MallocSizeOfOps};
|
||||||
use servo_arc::{Arc, RawOffsetArc};
|
use servo_arc::Arc;
|
||||||
use std::fmt::{self, Write};
|
use std::fmt::{self, Write};
|
||||||
|
|
||||||
/// A list of CSS rules.
|
/// A list of CSS rules.
|
||||||
|
@ -141,7 +141,7 @@ pub trait CssRulesHelpers {
|
||||||
) -> Result<CssRule, RulesMutateError>;
|
) -> Result<CssRule, RulesMutateError>;
|
||||||
}
|
}
|
||||||
|
|
||||||
impl CssRulesHelpers for RawOffsetArc<Locked<CssRules>> {
|
impl CssRulesHelpers for Locked<CssRules> {
|
||||||
fn insert_rule(
|
fn insert_rule(
|
||||||
&self,
|
&self,
|
||||||
lock: &SharedRwLock,
|
lock: &SharedRwLock,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue