From f5e24fc0b3078906c338f7def11a60a751fd2af9 Mon Sep 17 00:00:00 2001 From: Xidorn Quan Date: Wed, 15 Mar 2017 20:27:47 +1100 Subject: [PATCH] Unify common code for implementing a rule type. --- ports/geckolib/glue.rs | 95 ++++++++++++++++++++---------------------- 1 file changed, 45 insertions(+), 50 deletions(-) diff --git a/ports/geckolib/glue.rs b/ports/geckolib/glue.rs index 0bc09c30e68..8e057a322b6 100644 --- a/ports/geckolib/glue.rs +++ b/ports/geckolib/glue.rs @@ -33,8 +33,8 @@ use style::gecko_bindings::bindings; use style::gecko_bindings::bindings::{RawGeckoKeyframeListBorrowed, RawGeckoKeyframeListBorrowedMut}; use style::gecko_bindings::bindings::{RawServoDeclarationBlockBorrowed, RawServoDeclarationBlockStrong}; use style::gecko_bindings::bindings::{RawServoMediaListBorrowed, RawServoMediaListStrong}; -use style::gecko_bindings::bindings::{RawServoMediaRuleBorrowed, RawServoMediaRuleStrong}; -use style::gecko_bindings::bindings::{RawServoStyleRuleBorrowed, RawServoStyleRuleStrong}; +use style::gecko_bindings::bindings::{RawServoMediaRule, RawServoMediaRuleBorrowed}; +use style::gecko_bindings::bindings::{RawServoStyleRule, RawServoStyleRuleBorrowed}; use style::gecko_bindings::bindings::{RawServoStyleSetBorrowed, RawServoStyleSetOwned}; use style::gecko_bindings::bindings::{RawServoStyleSheetBorrowed, ServoComputedValuesBorrowed}; use style::gecko_bindings::bindings::{RawServoStyleSheetStrong, ServoComputedValuesStrong}; @@ -510,30 +510,6 @@ pub extern "C" fn Servo_CssRules_ListTypes(rules: ServoCssRulesBorrowed, result.iter_mut().zip(iter).fold((), |_, (r, v)| *r = v); } -#[no_mangle] -pub extern "C" fn Servo_CssRules_GetStyleRuleAt(rules: ServoCssRulesBorrowed, index: u32) - -> RawServoStyleRuleStrong { - let rules = RwLock::::as_arc(&rules).read(); - match rules.0[index as usize] { - CssRule::Style(ref rule) => rule.clone().into_strong(), - _ => { - unreachable!("GetStyleRuleAt should only be called on a style rule"); - } - } -} - -#[no_mangle] -pub extern "C" fn Servo_CssRules_GetMediaRuleAt(rules: ServoCssRulesBorrowed, index: u32) - -> RawServoMediaRuleStrong { - let rules = RwLock::::as_arc(&rules).read(); - match rules.0[index as usize] { - CssRule::Media(ref rule) => rule.clone().into_strong(), - _ => { - unreachable!("GetMediaRuleAt should only be called on a media rule"); - } - } -} - #[no_mangle] pub extern "C" fn Servo_CssRules_InsertRule(rules: ServoCssRulesBorrowed, sheet: RawServoStyleSheetBorrowed, rule: *const nsACString, index: u32, nested: bool, @@ -559,11 +535,49 @@ pub extern "C" fn Servo_CssRules_DeleteRule(rules: ServoCssRulesBorrowed, index: } } -#[no_mangle] -pub extern "C" fn Servo_StyleRule_Debug(rule: RawServoStyleRuleBorrowed, result: *mut nsACString) { - let rule = RwLock::::as_arc(&rule); - let result = unsafe { result.as_mut().unwrap() }; - write!(result, "{:?}", *rule.read()).unwrap(); +macro_rules! impl_basic_rule_funcs { + { ($name:ident, $rule_type:ty, $raw_type:ty), + getter: $getter:ident, + debug: $debug:ident, + to_css: $to_css:ident, + } => { + #[no_mangle] + pub extern "C" fn $getter(rules: ServoCssRulesBorrowed, index: u32) -> Strong<$raw_type> { + let rules = RwLock::::as_arc(&rules).read(); + match rules.0[index as usize] { + CssRule::$name(ref rule) => rule.clone().into_strong(), + _ => { + unreachable!(concat!(stringify!($getter), "should only be called ", + "on a ", stringify!($name), " rule")); + } + } + } + + #[no_mangle] + pub extern "C" fn $debug(rule: &$raw_type, result: *mut nsACString) { + let rule = RwLock::<$rule_type>::as_arc(&rule); + let result = unsafe { result.as_mut().unwrap() }; + write!(result, "{:?}", *rule.read()).unwrap(); + } + + #[no_mangle] + pub extern "C" fn $to_css(rule: &$raw_type, result: *mut nsAString) { + let rule = RwLock::<$rule_type>::as_arc(&rule); + rule.read().to_css(unsafe { result.as_mut().unwrap() }).unwrap(); + } + } +} + +impl_basic_rule_funcs! { (Style, StyleRule, RawServoStyleRule), + getter: Servo_CssRules_GetStyleRuleAt, + debug: Servo_StyleRule_Debug, + to_css: Servo_StyleRule_GetCssText, +} + +impl_basic_rule_funcs! { (Media, MediaRule, RawServoMediaRule), + getter: Servo_CssRules_GetMediaRuleAt, + debug: Servo_MediaRule_Debug, + to_css: Servo_MediaRule_GetCssText, } #[no_mangle] @@ -580,25 +594,12 @@ pub extern "C" fn Servo_StyleRule_SetStyle(rule: RawServoStyleRuleBorrowed, rule.write().block = declarations.clone(); } -#[no_mangle] -pub extern "C" fn Servo_StyleRule_GetCssText(rule: RawServoStyleRuleBorrowed, result: *mut nsAString) { - let rule = RwLock::::as_arc(&rule); - rule.read().to_css(unsafe { result.as_mut().unwrap() }).unwrap(); -} - #[no_mangle] pub extern "C" fn Servo_StyleRule_GetSelectorText(rule: RawServoStyleRuleBorrowed, result: *mut nsAString) { let rule = RwLock::::as_arc(&rule); rule.read().selectors.to_css(unsafe { result.as_mut().unwrap() }).unwrap(); } -#[no_mangle] -pub extern "C" fn Servo_MediaRule_Debug(rule: RawServoMediaRuleBorrowed, result: *mut nsACString) { - let rule = RwLock::::as_arc(&rule); - let result = unsafe { result.as_mut().unwrap() }; - write!(result, "{:?}", *rule.read()).unwrap(); -} - #[no_mangle] pub extern "C" fn Servo_MediaRule_GetMedia(rule: RawServoMediaRuleBorrowed) -> RawServoMediaListStrong { let rule = RwLock::::as_arc(&rule); @@ -611,12 +612,6 @@ pub extern "C" fn Servo_MediaRule_GetRules(rule: RawServoMediaRuleBorrowed) -> S rule.read().rules.clone().into_strong() } -#[no_mangle] -pub extern "C" fn Servo_MediaRule_GetCssText(rule: RawServoMediaRuleBorrowed, result: *mut nsAString) { - let rule = RwLock::::as_arc(&rule); - rule.read().to_css(unsafe { result.as_mut().unwrap() }).unwrap(); -} - #[no_mangle] pub extern "C" fn Servo_ComputedValues_GetForAnonymousBox(parent_style_or_null: ServoComputedValuesBorrowedOrNull, pseudo_tag: *mut nsIAtom,