diff --git a/servo/components/style/gecko/arc_types.rs b/servo/components/style/gecko/arc_types.rs new file mode 100644 index 000000000000..72f044c1c71e --- /dev/null +++ b/servo/components/style/gecko/arc_types.rs @@ -0,0 +1,58 @@ +/* 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/. */ + +//! This file lists all arc FFI types and defines corresponding addref +//! and release functions. This list corresponds to ServoArcTypeList.h +//! file in Gecko. + +#![allow(non_snake_case, missing_docs)] + +use gecko_bindings::bindings::{RawServoStyleSheet, RawServoStyleRule, RawServoImportRule}; +use gecko_bindings::bindings::{ServoComputedValues, ServoCssRules}; +use gecko_bindings::structs::{RawServoAnimationValue, RawServoDeclarationBlock}; +use gecko_bindings::sugar::ownership::{HasArcFFI, HasFFI}; +use parking_lot::RwLock; +use properties::{ComputedValues, PropertyDeclarationBlock}; +use properties::animated_properties::AnimationValue; +use stylesheets::{CssRules, Stylesheet, StyleRule, ImportRule}; + +macro_rules! impl_arc_ffi { + ($servo_type:ty => $gecko_type:ty [$addref:ident, $release:ident]) => { + unsafe impl HasFFI for $servo_type { + type FFIType = $gecko_type; + } + unsafe impl HasArcFFI for $servo_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!(RwLock => ServoCssRules + [Servo_CssRules_AddRef, Servo_CssRules_Release]); + +impl_arc_ffi!(Stylesheet => RawServoStyleSheet + [Servo_StyleSheet_AddRef, Servo_StyleSheet_Release]); + +impl_arc_ffi!(ComputedValues => ServoComputedValues + [Servo_ComputedValues_AddRef, Servo_ComputedValues_Release]); + +impl_arc_ffi!(RwLock => RawServoDeclarationBlock + [Servo_DeclarationBlock_AddRef, Servo_DeclarationBlock_Release]); + +impl_arc_ffi!(RwLock => RawServoStyleRule + [Servo_StyleRule_AddRef, Servo_StyleRule_Release]); + +impl_arc_ffi!(RwLock => RawServoImportRule + [Servo_ImportRule_AddRef, Servo_ImportRule_Release]); + +impl_arc_ffi!(AnimationValue => RawServoAnimationValue + [Servo_AnimationValue_AddRef, Servo_AnimationValue_Release]); diff --git a/servo/components/style/gecko/conversions.rs b/servo/components/style/gecko/conversions.rs index 7262a2f7f85b..a88d7c66d952 100644 --- a/servo/components/style/gecko/conversions.rs +++ b/servo/components/style/gecko/conversions.rs @@ -11,47 +11,12 @@ use app_units::Au; use gecko::values::convert_rgba_to_nscolor; use gecko_bindings::bindings::{Gecko_CreateGradient, Gecko_SetGradientImageValue, Gecko_SetUrlImageValue}; -use gecko_bindings::bindings::{RawServoStyleSheet, RawServoStyleRule, RawServoImportRule}; -use gecko_bindings::bindings::{ServoComputedValues, ServoCssRules}; use gecko_bindings::structs::{nsStyleCoord_CalcValue, nsStyleImage}; -use gecko_bindings::structs::RawServoDeclarationBlock; use gecko_bindings::structs::nsresult; use gecko_bindings::sugar::ns_style_coord::{CoordDataValue, CoordDataMut}; -use gecko_bindings::sugar::ownership::{HasArcFFI, HasFFI}; -use parking_lot::RwLock; -use properties::{ComputedValues, PropertyDeclarationBlock}; -use stylesheets::{CssRules, RulesMutateError, Stylesheet, StyleRule, ImportRule}; +use stylesheets::RulesMutateError; use values::computed::{CalcLengthOrPercentage, Gradient, Image, LengthOrPercentage, LengthOrPercentageOrAuto}; -unsafe impl HasFFI for Stylesheet { - type FFIType = RawServoStyleSheet; -} -unsafe impl HasArcFFI for Stylesheet {} -unsafe impl HasFFI for ComputedValues { - type FFIType = ServoComputedValues; -} -unsafe impl HasArcFFI for ComputedValues {} - -unsafe impl HasFFI for RwLock { - type FFIType = RawServoDeclarationBlock; -} -unsafe impl HasArcFFI for RwLock {} - -unsafe impl HasFFI for RwLock { - type FFIType = ServoCssRules; -} -unsafe impl HasArcFFI for RwLock {} - -unsafe impl HasFFI for RwLock { - type FFIType = RawServoStyleRule; -} -unsafe impl HasArcFFI for RwLock {} - -unsafe impl HasFFI for RwLock { - type FFIType = RawServoImportRule; -} -unsafe impl HasArcFFI for RwLock {} - impl From for nsStyleCoord_CalcValue { fn from(other: CalcLengthOrPercentage) -> nsStyleCoord_CalcValue { let has_percentage = other.percentage.is_some(); diff --git a/servo/components/style/gecko/mod.rs b/servo/components/style/gecko/mod.rs index ca87d081ef7e..625fa77bbfd3 100644 --- a/servo/components/style/gecko/mod.rs +++ b/servo/components/style/gecko/mod.rs @@ -4,6 +4,7 @@ //! Gecko-specific style-system bits. +pub mod arc_types; pub mod conversions; pub mod data; pub mod media_queries; diff --git a/servo/components/style/properties/helpers/animated_properties.mako.rs b/servo/components/style/properties/helpers/animated_properties.mako.rs index 8001e9457a6d..0c2b59eb2dab 100644 --- a/servo/components/style/properties/helpers/animated_properties.mako.rs +++ b/servo/components/style/properties/helpers/animated_properties.mako.rs @@ -232,17 +232,6 @@ impl AnimatedProperty { } } - -% if product == "gecko": - use gecko_bindings::structs::RawServoAnimationValue; - use gecko_bindings::sugar::ownership::{HasArcFFI, HasFFI}; - - unsafe impl HasFFI for AnimationValue { - type FFIType = RawServoAnimationValue; - } - unsafe impl HasArcFFI for AnimationValue {} -% endif - /// An enum to represent a single computed value belonging to an animated /// property in order to be interpolated with another one. When interpolating, /// both values need to belong to the same property. diff --git a/servo/ports/geckolib/glue.rs b/servo/ports/geckolib/glue.rs index c7e6ede116f7..c7fb870706fb 100644 --- a/servo/ports/geckolib/glue.rs +++ b/servo/ports/geckolib/glue.rs @@ -332,17 +332,6 @@ pub extern "C" fn Servo_AnimationValues_Populate(anim: RawGeckoAnimationValueLis } } - -#[no_mangle] -pub extern "C" fn Servo_AnimationValue_AddRef(anim: RawServoAnimationValueBorrowed) -> () { - unsafe { AnimationValue::addref(anim) }; -} - -#[no_mangle] -pub extern "C" fn Servo_AnimationValue_Release(anim: RawServoAnimationValueBorrowed) -> () { - unsafe { AnimationValue::release(anim) }; -} - #[no_mangle] pub extern "C" fn Servo_StyleWorkerThreadCount() -> u32 { *NUM_THREADS as u32 @@ -530,16 +519,6 @@ pub extern "C" fn Servo_StyleSheet_GetRules(sheet: RawServoStyleSheetBorrowed) - Stylesheet::as_arc(&sheet).rules.clone().into_strong() } -#[no_mangle] -pub extern "C" fn Servo_StyleSheet_AddRef(sheet: RawServoStyleSheetBorrowed) -> () { - unsafe { Stylesheet::addref(sheet) }; -} - -#[no_mangle] -pub extern "C" fn Servo_StyleSheet_Release(sheet: RawServoStyleSheetBorrowed) -> () { - unsafe { Stylesheet::release(sheet) }; -} - #[no_mangle] pub extern "C" fn Servo_CssRules_ListTypes(rules: ServoCssRulesBorrowed, result: nsTArrayBorrowed_uintptr_t) -> () { @@ -588,26 +567,6 @@ pub extern "C" fn Servo_CssRules_DeleteRule(rules: ServoCssRulesBorrowed, index: } } -#[no_mangle] -pub extern "C" fn Servo_CssRules_AddRef(rules: ServoCssRulesBorrowed) -> () { - unsafe { RwLock::::addref(rules) }; -} - -#[no_mangle] -pub extern "C" fn Servo_CssRules_Release(rules: ServoCssRulesBorrowed) -> () { - unsafe { RwLock::::release(rules) }; -} - -#[no_mangle] -pub extern "C" fn Servo_StyleRule_AddRef(rule: RawServoStyleRuleBorrowed) -> () { - unsafe { RwLock::::addref(rule) }; -} - -#[no_mangle] -pub extern "C" fn Servo_StyleRule_Release(rule: RawServoStyleRuleBorrowed) -> () { - unsafe { RwLock::::release(rule) }; -} - #[no_mangle] pub extern "C" fn Servo_StyleRule_Debug(rule: RawServoStyleRuleBorrowed, result: *mut nsACString) -> () { let rule = RwLock::::as_arc(&rule); @@ -641,16 +600,6 @@ pub extern "C" fn Servo_StyleRule_GetSelectorText(rule: RawServoStyleRuleBorrowe rule.read().selectors.to_css(unsafe { result.as_mut().unwrap() }).unwrap(); } -#[no_mangle] -pub extern "C" fn Servo_ImportRule_AddRef(rule: RawServoImportRuleBorrowed) -> () { - unsafe { RwLock::::addref(rule) }; -} - -#[no_mangle] -pub extern "C" fn Servo_ImportRule_Release(rule: RawServoImportRuleBorrowed) -> () { - unsafe { RwLock::::release(rule) }; -} - #[no_mangle] pub extern "C" fn Servo_ComputedValues_GetForAnonymousBox(parent_style_or_null: ServoComputedValuesBorrowedOrNull, pseudo_tag: *mut nsIAtom, @@ -727,16 +676,6 @@ pub extern "C" fn Servo_ComputedValues_Inherit( style.into_strong() } -#[no_mangle] -pub extern "C" fn Servo_ComputedValues_AddRef(ptr: ServoComputedValuesBorrowed) { - unsafe { ComputedValues::addref(ptr) }; -} - -#[no_mangle] -pub extern "C" fn Servo_ComputedValues_Release(ptr: ServoComputedValuesBorrowed) { - unsafe { ComputedValues::release(ptr) }; -} - /// See the comment in `Device` to see why it's ok to pass an owned reference to /// the pres context (hint: the context outlives the StyleSet, that holds the /// device alive). @@ -814,16 +753,6 @@ pub extern "C" fn Servo_DeclarationBlock_Clone(declarations: RawServoDeclaration Arc::new(RwLock::new(declarations.read().clone())).into_strong() } -#[no_mangle] -pub extern "C" fn Servo_DeclarationBlock_AddRef(declarations: RawServoDeclarationBlockBorrowed) { - unsafe { RwLock::::addref(declarations) }; -} - -#[no_mangle] -pub extern "C" fn Servo_DeclarationBlock_Release(declarations: RawServoDeclarationBlockBorrowed) { - unsafe { RwLock::::release(declarations) }; -} - #[no_mangle] pub extern "C" fn Servo_DeclarationBlock_Equals(a: RawServoDeclarationBlockBorrowed, b: RawServoDeclarationBlockBorrowed) diff --git a/servo/tests/unit/stylo/check_bindings.py b/servo/tests/unit/stylo/check_bindings.py index 28246639e57f..db5a11cc3a7e 100755 --- a/servo/tests/unit/stylo/check_bindings.py +++ b/servo/tests/unit/stylo/check_bindings.py @@ -33,5 +33,6 @@ with open(INPUT_FILE, "r") as bindings, open(OUTPUT_FILE, "w+") as tests: tests.write("}\n") with open(GLUE_FILE, "r") as glue, open(GLUE_OUTPUT_FILE, "w+") as glue_output: + glue_output.write("pub use style::gecko::arc_types::*;") for line in glue: glue_output.write(line.replace("pub extern \"C\" fn", "pub unsafe extern \"C\" fn"))